Skip to main content
 首页 » 编程设计

c之从串行端口 Linux C 读取 NULL 字符

2023年11月22日17三少

我已经阅读了很多问题和答案,但没有找到任何解决方案。可能是我的问题不对,但我需要一些指导。我在 Linux 中使用串行端口,它正在从我的 Arduino 设备读取数据。每当我想将数据从 Arduino 发送到 Linux 时,我首先发送两个字节,表示将来自 Arduino 的总字节数。我将这两个字节转换为整数值并开始从串口读取数据。比方说,我想从 Ardiuno 发送 300 个字节到 Linux,我会先写 {1, 44} 然后将这个 1 和 44 字节通过以下公式转换为 int:

char data[] = {1, 44}; 
int to_read = data[0] 
to_read = to_read << 8; 
to_read = to_read | data[1]; 
return to_read; 

这将给我 300 int 值,这非常有效。但是当我必须读取小于 255 的数据时,问题就来了。假设我想读取 100 个字节,那么前两个字节将为 {0, 100}。 0是空字符,串口不处理(我手动写0到串口,它总是给我写入0字节),我的所有序列都出错了。所以我的问题是我可以从串行端口读取空字符还是有人请给我更好的解决方案..

提前致谢。

请您参考如下方法:

我的问题解决了。在 C 中处理字节时,不要将字节 (char) 与字符串混淆,就像我正在处理字节数组 (char data[]) 以及当我尝试使用 write 在串行端口上写入这些字节时长度为 strlen(data) 的方法,我只得到那些不为空的字节。 strlen 在看到第一个空字符 \0 后返回数据的长度,因此我没有得到我想要的输出。我所做的是,如果我想写数据 char data[] = {0, 4} 那么我会做这样的事情:

char data[] = {0, 4}; 
write(serial_port_fd, data, 2); 

告诉 write 函数写入 2 个字节。这将写入 0 和 4,如果我这样写:

char data[] = {0, 4} 
write(serial_port_fd, data, strlen(data)); 

这将写入NOTHING

还有一件事,如果你想在串行端口上写入不可打印的字符(从字节值 0 到 32),那么请确保你已经为原始输入和输出配置了你的串行端口。查看本指南:

http://www.cmrr.umn.edu/~strupp/serial.html#config