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

每次只能read四个字节,连续循环多次直到数据read完后,就阻塞了

第1个回答  2012-11-12
首先,默认的串口文件的缓存方式是无缓冲。其次,串口在发送数据的时候不是连续的。
比如,串口要给你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的

第2个回答  2012-11-12
将串口打开模式设为非阻塞模式,用多线程实现.
第3个回答  2012-11-12
你read给的参数是什么?追问

8N1,默认阻塞方式,非阻塞我也试过,我让它循环读取,结果数据反而读不到了,每次读四个字节,直到循环把所有字节读完为止,我想问下是不是驱动的问题,我设置最小读取字节数是1
newtio.c_cc[VTIME] = 0; //等待时间,单位百毫秒
newtio.c_cc[VMIN] = 1; //等待最小字节数(针对读),不过我也改过这两个值,只是稍微有变化,读取可能会变成5个字节或别的,还是一次读不完,而且我也不知道怎么控制这个参数

本回答被提问者采纳

各位大侠,我写了一个linux下我写了个程序验证串口接收数据情况,是个...
首先,默认的串口文件的缓存方式是无缓冲。其次,串口在发送数据的时候不是连续的。比如,串口要给你0x62,0x77。那么他就先发0x62后发0x77。而如果你在他发完0x62的时候马上就read()那就会只得到0x62.而0x77要再read一次。如果你想一次就全读上来,那有两个方法。1:你自己写一个读串口的函数...

linux用的SHELL脚本问题,麻烦各位大侠们不吝赐教了,小弟感激涕零啊...
while true; do #一直不停地循环,执行下面内容 ping -w 5 -c 1 192.168.1.1 >\/dev\/null 2>&1 #ping第一个IP地址,并重定向 if [ $? -eq 0 ]; then #如果ping通取消关机关机动作 shutdown -c #取消关机动作 ping -w 5 -c ...

刚介入linux c的socket编程没多久,想要写一个socket客户端,实现多线程...
} \/\/你没说具体的应用,所以只能写这么多了。在这里面直接对connfd调用read和write函数就可以和客户端收发数据了。//补充:是啊 返回给客户端什么信息啊?int main(void){ int sockfd, n, connfd;pthread_t tid;struct sockaddr_in servaddr;sockfd = socket(AF_INET, SOCK_STREAM, 0);if (...

各位大侠小弟是个C语言菜鸟,有一个程序要各位看一下:输入10个数,输出最...
但只要参数符合函数max定义的参数类型和个数就可以。在程序最开始的定义int a[10],m;说明a[10]和m都是int型,这样函数调用没有问题。继续说你看不懂的max(m, a[i]),不知道你是不是同样看不懂a[i]了,a[i]中的i就是在for循环中控制数值变化的i,在这里就相当于数组a的下标是i,根据for...

请问一下各位大侠,Access violation at address 00000000. Read of...
7、应用程序由于自身BUG引用了不正常的内存指针 在使用动态分配的应用程序中,有时会有这样的情况出现:程序试图读写一块“应该可用”的内存,但不知为什么,这个预料中可用的指针已经失效了。有可能是“忘记了”向操作系统要求分配,也可能是程序自己在某个时候已经注销了这块内存而“没有留意”等等。注销了的内存被...

...但运行时提示内存不能为“writen”.请各位大侠指教
1、驱动不稳定,与系统不兼容,这最容易出现内存不能为 Read 或者文件保护 2、系统安装了一个或者多个流氓软件,这出现 IE 或者系统崩溃的机会也比较大,也有可能出现文件保护 3、系统加载的程序或者系统正在运行的程序之间有冲突,尤其是部分杀毒软件监控程序 4、系统本身存在漏洞,导致容易受到网络攻击。...

请教各位大侠:当程序发起相同的几次请求(时间间隔极短)时,期间结果还...
当返回结果之后再恢复即可。(这个是相对于前台有触发事件的来说的)如果前台没有触发事件的话:那么可以这样,建立一个缓冲区,专门来接受发送过来的请求,然后程序通过缓冲区去调,这样可以有效的预防上述情况的发生。(使用多线程)这样做也可以根据程序的情况来设定同时执行的请求个数。方便 ...

我下了游戏安装的时候减压出来是一个乱码的写字文档,请问怎么解决...
需要打开方式的意思就是你的电脑不能识别这个文件,我怀疑你的这个文件是光盘镜像,需要用虚拟光驱载入,再安装

Trojan到底是一个什么样的病毒?
如果你学过编程并且写过DLL,就会发现,其实DLL的代码和其他程序几乎没什么两样,仅仅是接口和启动模式不同,只要改动一下代码入口,DLL就变成一个独立的程序了。当然,DLL文件是没有程序逻辑的,这里并不是说DLL=EXE,不过,依然可以把DLL看做缺少了main入口的EXE,DLL带的各个功能函数可以看作一个程序的几个函数模块。

为什么我的机子有时候总弹出一个要终止程序的对话框?
真正的0地址内存区保存的是计算机系统中最重要的“中断描述符表”,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即死机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大...

相似回答