转自http://blog.csdn.net/pzhsunxu/article/details/8257939
*************************** *基于OK6410的串口程序 *2012.12.4 *孙旭 ***************************/ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> #include<termios.h> #include<string.h> /*串口设置,"串口,波特率,数据位,奇偶校验,停止位"*/ int set_Baudrate(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; case 460800: cfsetispeed(&newtio, B460800); cfsetospeed(&newtio, B460800); 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; } return 0; } /*数据解析*/ int analysis_data(char buf[100]) { printf("recv data %s \n",buf); } /*波特率为115200串口0*/ int serial_port0(void) { int fd_port; int return_value=0; int length_data=0; char buffer[100]; //从串口读取数据的buffer memset(buf,0,sizeof(buf)); //打开串口0 fd_port = open("/dev/ttySAC0",O_RDWR); if(-1 == fd_port) { exit(1); } //串口,波特率,数据位,奇偶校验,停止位 return_value = set_Baudrate(fd_port,115200,8,'N',1); if(-1 == return_value) { exit(1); } //接收串口0的数据 while(1) { length_data = read(fd_port,buf,1); //数据的发送使用write(fd_port,buf,1); buf为要发送的字符串 if(-1 == length_data) { exit(1); } if(0 > analysis_data(buf)) return -1; memset(buf,0,100); } close(fd_port); return 1; } /*波特率为4800串口1*/ int serial_port1(void) { int fd_port; int return_value=0; int length_data=0; char buffer[100]; //从串口读取数据的buffer memset(buf,0,sizeof(buf)); //打开串口1 fd_port = open("/dev/ttySAC1",O_RDWR); if(-1 == fd_port) { return -1; } //串口,波特率,数据位,奇偶校验,停止位 return_value = set_Baudrate(fd_port,4800,8,'N',1); if(-1 == return_value) { return -1; } //接收串口1的数据 while(1) { length_data = read(fd_port,buf,1); //数据的发送使用write(fd_port,buf,1); if(-1 == length_data) { exit(1); } if(0 > analysis_data(buf)) return -1; memset(buf,0,100); } close(fd_port); return 1; } /*主函数*/ int main(void) { if(0 > serial_port0()) { exit(1); } if(0 > serial_port1()) { exit(1); } return 0; }