linux获取打开串口失败的原因,linux – 从串口读取失败

C程序尝试打开并通信于/dev/ttyS0,发送数据后等待响应,但持续收到0字节且CPU使用率达到100%。目标硬件实际传输数据,但应用程序无法接收到。问题可能涉及串口配置、硬件连接或接收中断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有以下C程序:

#include

#include

#include

int main()

{

int fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NONBLOCK);

if(fd < 0)

{

perror("Could not open device");

}

printf("Device opened\n");

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 bytes\n",written);

printf("Starting to wait for target to respond\n");

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 bytes\n",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.即使目标硬件实际传输它,我也无法接收任何数据.

怎么了?

### Linux环境下串口通信读取失败的解决方案 在Linux环境中,当遇到串口通信读取失败的情况时,通常是因为内核配置不当所致。对于RS232/RS485通信,在Linux下的UART串口会被封装成TTY接口(即`/dev/ttyS*`或`/dev/ttyUSB*`文件)。如果接收到的数据不正确或者根本无法读取到任何数据,则可能是由于当前使用的串口处于规范模式而非原始模式所引起的[^1]。 为了修正这个问题,应当调整串口设置为原始模式,从而绕过可能干扰实际传输内容的一些额外处理逻辑: ```c #include <termios.h> struct termios options; tcgetattr(fd, &options); /* 获取现有属性 */ // 设置波特率等参数... cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); /* 关闭回声等功能并启用接收器 */ options.c_cflag |= (CLOCAL | CREAD); options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /* 配置为原始模式 */ options.c_iflag &= ~(IXON | IXOFF | IXANY); options.c_oflag &= ~OPOST; /* 应用新的属性 */ if(tcsetattr(fd,TCSANOW,&options)<0){ perror("Setup serial port"); } ``` 此外,还需确认硬件连接无误以及设备权限是否允许程序访问相应的TTY节点;同时也要确保应用程序能够正确地打开端口,并且按照预期的方式发送命令给目标设备来启动其响应过程。 #### 数据校验与错误恢复机制 考虑到可能存在噪声或其他因素影响通信质量,建议实现适当的数据校验手段,比如奇偶校验位、循环冗余检验(CRC),并在必要时加入重传策略以提高系统的鲁棒性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值