- ***************************
- *基于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;
- }
6410的串口驱动
最新推荐文章于 2019-02-10 23:11:17 发布