从串口读取失败

我有以下的C程序:

#include <fcntl.h> #include <termios.h> #include <stdio.h> int main() { int fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NONBLOCK); if(fd < 0) { perror("Could not open device"); } printf("Device openedn"); struct termios options; tcgetattr(fd,&options); cfmakeraw(&options); cfsetispeed(&options,B19200); cfsetospeed(&options,B19200); tcsetattr(fd,TCSANow,&options); char txpacket[] = {0x23,0x06,0x00,0xdd,0xf9}; ssize_t written = write(fd,txpacket,sizeof(txpacket)); printf("Written %d bytesn",written); printf("Starting to wait for target to respondn"); while(1) { fd_set readset; FD_ZERO(&readset); FD_SET(fd,&readset); int nCount = select(fd + 1,&readset,NULL,NULL); if(nCount > 0) { if(FD_ISSET(fd,&readset)) { int i; char buffer[128]; ssize_t bytesread = read(fd,buffer,sizeof(buffer)); printf("Received %d bytesn",bytesread); for(i = 0; i < bytesread; i++) { printf(" %02x",buffer[i]); } } } } }

这个程序打开串口设备/ dev / ttyS0,向它写入一个数据序列并开始监听响应。 我得到以下输出

Device opened Written 6 bytes Starting to wait for target to respond Received 0 bytes Received 0 bytes Received 0 bytes Received 0 bytes Received 0 bytes Received 0 bytes ...

而应用程序消耗100%的cpu。 即使目标硬件实际传输数据,我也无法收到任何数据。

哪里不对?

Android上USB设备的Linux文件权限

串行端口驱动程序 – 陷入SerialISR()例程

termios VMIN VTIME和阻塞/非阻塞读取操作

在Windows上Pyserial的非阻塞/繁忙等待使用:如何实时监控多个串行端口?

两个串口与Linux的通信

拔下并重新插入连接器后无法从串行设备读取

为什么只有在按下回车键后才能以串行方式接收字符

无法在Windows 10上使用Bash查找我的串行端口

如何读取Linux上的RTS / CTS引脚值?

C ++通过COM口进行通讯

read()返回0表示文件结束条件。 你应该检查一下,如果发生,就跳出循环。

至于是什么原因造成的 – 串口上的文件结束表示检测到了挂断,意味着DCD线已经被丢弃。

您可以在options.c_cflag设置CLOCAL标志,以忽略调制解调器控制线,如果您的设备没有正确设置。

你应该尝试没有O_NONBLOCK标志。 在原始模式下,如果c_cc[VMIN]和c_cc[VTIME]为0,则串行端口的行为如下(根据man cfmakeraw):

如果数据可用,则读取立即返回,可用字节数或请求的字节数中的较小者。 如果没有数据可用,则读取返回0

所以你应该尝试的是:

options->c_cc[VMIN]=1;

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....