BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #7581同步于 2010/3/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

求助串口设置问题

xiachenghai
2010/3/7镜像同步2 回复
在读串口数据时遇到了一些问题: options.c_cc[VTIME] = 1; options.c_cc[VMIN] = 22; 我们需要查询接收包长22字节的数据,每包时间间隔大为2ms(串口波特率115200),但是参数VTIME是百毫秒级别的,不知道怎样才能将VTIME变为毫秒级别的,这个需要修改串口驱动吗? 注:控制符VTIME和VMIN之间有复杂的关系。VTIME定义要求等待的时间(百毫米,通常是unsigned char变量),而VMIN定义了要求等待的最小字节数(相比之下,read函数的第三个参数指定了要求读的最大字节数)。 如果VTIME=0,VMIN=要求等待读取的最小字节数,read必须在读取了VMIN个字节的数据或者收到一个信号才会返回。 如果VTIME=时间量,VMIN=0,不管能否读取到数据,read也要等待VTIME的时间量。 如果VTIME=时间量,VMIN=要求等待读取的最小字节数,那么将从read读取第一个字节的数据时开始计时,并会在读取到VMIN个字节或者VTIME时间后返回。 如果VTIME=0,VMIN=0,不管能否读取到数据,read都会立即返回。
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
hobby机器人#1 · 2010/3/7
环境尤其是软件环境简单的介绍下吧 【 在 xiachenghai (buptxch) 的大作中提到: 】 : 在读串口数据时遇到了一些问题: : options.c_cc[VTIME] = 1; : options.c_cc[VMIN] = 22; : ...................
xiachenghai机器人#2 · 2010/3/7
软件大环境就是linux下的C编程,最后是要放到arm板上跑的,遇到相关问题是,当VTIME=1时,发送间隔大于100ms,则正确,如果小于100ms,如有一包数据在传输过程中少一个字节,那么后面的数据全部错位。现在的要求是一包出错无所谓,只要后面的数据包正确即可,所以想到如何将VTIME的级别降到毫秒级。 main函数中设置如下: set_opt(fd,115200,8,'N',1,22); 串口相关函数: int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop,int nVmin) { 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 19200: cfsetispeed(&newtio,B19200); cfsetospeed(&newtio,B19200); break; case 38400: cfsetispeed(&newtio,B38400); cfsetospeed(&newtio,B38400); 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] =1; newtio.c_cc[VMIN]=nVmin; /*处理未接受字符*/ tcflush(fd, TCIFLUSH); /*激活新配置*/ if((tcsetattr(fd,TCSANOW,&newtio))!=0) { perror("com set error"); return -1; } //printf("set done!\n"); return 0; } 【 在 hobby 的大作中提到: 】 : 环境尤其是软件环境简单的介绍下吧