本帖最后由 IC爬虫 于 2016-12-29 09:27 编辑
我使用的是Armbian系统,OrangePi zero 的排针上提供了2个串口,分别对应着系统下的UART1->ttyS1和UART2->ttyS2,但是打开/dev,可以看到除了上面的两个以外还有ssyS0,这个串口的就是板子网口旁边的那个3个排针为UART0,平时作为系统输出用的:
参考了:
http://www.cnblogs.com/wblyuyang/archive/2011/11/21/2257544.html
中对串口的操作代码;
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
- {
- struct termios newtio,oldtio;
- if ( tcgetattr( fd,&oldtio) != 0)
- {
- perror("SetupSerial 1");
- return -1;
- }
- bzero( &newtio, sizeof( newtio ) );
- newtio.c_cflag |= CLOCAL | CREAD;
- newtio.c_cflag &= ~CSIZE;
- switch( nBits )
- {
- case 7:
- newtio.c_cflag |= CS7;
- break;
- case 8:
- newtio.c_cflag |= CS8;
- break;
- }
- switch( nEvent )
- {
- case 'O':
- newtio.c_cflag |= PARENB;
- newtio.c_cflag |= PARODD;
- newtio.c_iflag |= (INPCK | ISTRIP);
- break;
- case 'E':
- newtio.c_iflag |= (INPCK | ISTRIP);
- newtio.c_cflag |= PARENB;
- newtio.c_cflag &= ~PARODD;
- break;
- case 'N':
- newtio.c_cflag &= ~PARENB;
- break;
- }
- switch( nSpeed )
- {
- case 2400:
- cfsetispeed(&newtio, B2400);
- cfsetospeed(&newtio, B2400);
- break;
- case 4800:
- cfsetispeed(&newtio, B4800);
- cfsetospeed(&newtio, B4800);
- break;
- case 9600:
- cfsetispeed(&newtio, B9600);
- cfsetospeed(&newtio, B9600);
- break;
- case 115200:
- cfsetispeed(&newtio, B115200);
- cfsetospeed(&newtio, B115200);
- break;
- default:
- cfsetispeed(&newtio, B9600);
- cfsetospeed(&newtio, B9600);
- break;
- }
- if( nStop == 1 )
- {
- newtio.c_cflag &= ~CSTOPB;
- }
- else if ( nStop == 2 )
- {
- newtio.c_cflag |= CSTOPB;
- }
- newtio.c_cc[VTIME] = 0;
- newtio.c_cc[VMIN] = 0;
- tcflush(fd,TCIFLUSH);
- if((tcsetattr(fd,TCSANOW,&newtio))!=0)
- {
- perror("com set error");
- return -1;
- }
- printf("set done!n");
- return 0;
- }
- int open_port(int fd,int comport)
- {
- char *dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};
- if (comport==1)
- { fd = open( "/dev/ttyS0", O_RDWR|O_NOCTTY|O_NDELAY);
- if (-1 == fd)
- {
- perror("Can't Open Serial Port");
- return(-1);
- }
- else
- {
- printf("open ttyS0 .....n");
- }
- }
- else if(comport==2)
- { fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
- if (-1 == fd)
- {
- perror("Can't Open Serial Port");
- return(-1);
- }
- else
- {
- printf("open ttyS1 .....n");
- }
- }
- else if (comport==3)
- {
- fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY);
- if (-1 == fd)
- {
- perror("Can't Open Serial Port");
- return(-1);
- }
- else
- {
- printf("open ttyS2 .....n");
- }
- }
- if(fcntl(fd, F_SETFL, 0)<0)
- {
- printf("fcntl failed!n");
- }
- else
- {
- printf("fcntl=%dn",fcntl(fd, F_SETFL,0));
- }
- if(isatty(STDIN_FILENO)==0)
- {
- printf("standard input is not a terminal devicen");
- }
- else
- {
- printf("isatty success!n");
- }
- printf("fd-open=%dn",fd);
- return fd;
- }
- int main(void)
- {
- int fd;
- int nread,i;
- int nwrite;
- char buff[]="Hellon";
- if((fd=open_port(fd,2))<0)
- {
- perror("open_port error");
- return 0;
- }
- if((i=set_opt(fd,115200,8,'N',1))<0)
- {
- perror("set_opt error");
- return 0;
- }
- printf("fd=%dn",fd);
- nread=write(fd,buff,8);
- printf("nwrite=%d,%sn",nread,buff);
- close(fd);
- return 0;
- }
复制代码
提供源码和Makefile文件:
效果如图:
|