各位大侠,我写了一个linux下我写了个程序验证串口接收数据情况,是个死循环read,发现串口需要分多次read

每次只能read四个字节,连续循环多次直到数据read完后,就阻塞了... 每次只能read四个字节,连续循环多次直到数据read完后,就阻塞了 展开
 我来答
262454893
2012-11-12 · TA获得超过131个赞
知道答主
回答量:169
采纳率:0%
帮助的人:116万
展开全部
首先,默认的串口文件的缓存方式是无缓冲。其次,串口在发送数据的时候不是连续的。
比如,串口要给你0x62,0x77。那么他就先发0x62后发0x77。而如果你在他发完0x62的时候马上就read()那就会只得到0x62.而0x77要再read一次。

如果你想一次就全读上来,那有两个方法。
1:你自己写一个读串口的函数,里面调用read;
例如:
int tipc_read_socket( int sockfd, char *buf, int len )
{
int count = 0; //每次读取字节数
int pos = 0; //总共读取字节数

pos = 0;
do {
count = read(sockfd, &buf[pos], len - pos);
//printf("tipc_read_socket:count[%d]\n", count);
if( 0 > count )
{
if( EINTR == errno )
continue;
//当设置为non block的时候,第一次把所有的数据读取完以后,第二次的结果为-1.
return( pos );
}

if( 0 == count ) break; /* Nothing left! */
pos += count;
} while( len > pos );
return( pos );}

2:你设置一下输入输出属性。
struct termios newtio;
bzero( &newtio, sizeof( newtio ) );
newtio.c_cc[VTIME] = ***;
newtio.c_cc[VMIN] = ***;
tcsetattr(fd,TCSANOW,&newtio);
这个里面的VTIME,VMIN。就是读等待的时间。
设置了以后,比如你读0x62的时候read,那么他会等待你设置的时间,如果在这个时间里面0x77来了,那他会把0x62和0x77一起返回给你。这个时间跟波特率有关,应该是设置为在某种波特率的情况下连续两字节的最大间隔时间。
追问
我写了程序,发现是波特率的问题115200的时候是好的,可变成9600的时候就分多次读取,怎么办呢,我的模块初始设置就是9600的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dragonvy
2012-11-12 · TA获得超过171个赞
知道小有建树答主
回答量:337
采纳率:50%
帮助的人:139万
展开全部
将串口打开模式设为非阻塞模式,用多线程实现.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
飞翔正义
2012-11-12 · TA获得超过1111个赞
知道大有可为答主
回答量:1714
采纳率:100%
帮助的人:785万
展开全部
你read给的参数是什么?
追问
8N1,默认阻塞方式,非阻塞我也试过,我让它循环读取,结果数据反而读不到了,每次读四个字节,直到循环把所有字节读完为止,我想问下是不是驱动的问题,我设置最小读取字节数是1
newtio.c_cc[VTIME] = 0; //等待时间,单位百毫秒
newtio.c_cc[VMIN] = 1; //等待最小字节数(针对读),不过我也改过这两个值,只是稍微有变化,读取可能会变成5个字节或别的,还是一次读不完,而且我也不知道怎么控制这个参数
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式