返回信息流在读串口数据时遇到了一些问题:
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都会立即返回。
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #7581同步于 2010/3/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
求助串口设置问题
xiachenghai
2010/3/7镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
环境尤其是软件环境简单的介绍下吧
【 在 xiachenghai (buptxch) 的大作中提到: 】
: 在读串口数据时遇到了一些问题:
: options.c_cc[VTIME] = 1;
: options.c_cc[VMIN] = 22;
: ...................
软件大环境就是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 的大作中提到: 】
: 环境尤其是软件环境简单的介绍下吧