当前位置: 技术问答>linux和unix
Linux下读串口操作,对每次发的数据要分多次读,不能一次读完,敬请高手赐教
来源: 互联网 发布时间:2015-10-10
本文导语: 我最近在写一个Linux下串口通讯的程序,两台Linux系统的计算机用串口线相连。关于串口的配置如下: 在读函数 serial_read.c 中设置如下: tcgetattr(fd, &options); cfsetispeed(&options, B19200); options.c_cflag &=...
我最近在写一个Linux下串口通讯的程序,两台Linux系统的计算机用串口线相连。关于串口的配置如下:
在读函数 serial_read.c 中设置如下:
tcgetattr(fd, &options);
cfsetispeed(&options, B19200);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // Choosing Raw Input
tcsetattr(fd, TCSANOW, &options);
在写函数 serial_write.c 中设置如下:
tcgetattr(fd, &options);
cfsetispeed(&options, B19200);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
options.c_cflag &= ~CSTOPB;
options.c_oflag &= ~OPOST; // Choosing Raw Output
tcsetattr(fd, TCSANOW, &options);
读函数和写函数的缓冲区均是 24 个字节。下面是我的问题:
我发了 24 个字节的数据,发送成功,但是在另一台机子上收的时候不能一次读完,有时候可以一次
读完,但这种情况很少。大多数要读 2 次才能读完,每次读 8 个字节或 16 个字节。有时要读 3 次,每次读 8 个子节。
为何?? 怎样才能让它一次读完?敬请高手赐教。
在读函数 serial_read.c 中设置如下:
tcgetattr(fd, &options);
cfsetispeed(&options, B19200);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // Choosing Raw Input
tcsetattr(fd, TCSANOW, &options);
在写函数 serial_write.c 中设置如下:
tcgetattr(fd, &options);
cfsetispeed(&options, B19200);
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK;
options.c_cflag &= ~CSTOPB;
options.c_oflag &= ~OPOST; // Choosing Raw Output
tcsetattr(fd, TCSANOW, &options);
读函数和写函数的缓冲区均是 24 个字节。下面是我的问题:
我发了 24 个字节的数据,发送成功,但是在另一台机子上收的时候不能一次读完,有时候可以一次
读完,但这种情况很少。大多数要读 2 次才能读完,每次读 8 个字节或 16 个字节。有时要读 3 次,每次读 8 个子节。
为何?? 怎样才能让它一次读完?敬请高手赐教。
|
options.c_cc[VTIME] = 0;
options.c_cc[VMIN] = 24;
options.c_cc[VMIN] = 24;
|
不要奢望一次读完。你可以在读取的时候用循环判断是否接受完全。不推荐一次完成。
|
他说的有道理,因为传输过程中不可能不丢包.所以最好加上循环判断
|
你可以在接收到包之后进行你自己的处理,也就是说在満足你所需的条件时才将所接收到的所有数据显示出来(或者进行你想要的操作),若没满足条件就缓存在你开辟的缓冲区内
这个过程其实就是一个缓存的过程,其实很多底层驱动也有这样的实现思路
这个过程其实就是一个缓存的过程,其实很多底层驱动也有这样的实现思路