【问题标题】:Reading NULL character from Serial Port Linux C从串口 Linux C 读取 NULL 字符
【发布时间】:2013-12-07 17:56:40
【问题描述】:

我已经阅读了很多问题和答案,但没有找到任何解决方案。可能是我的问题不对,但我需要一些指导。我在 Linux 中使用串行端口,它正在从我的 Arduino 设备读取数据。每当我想从 Arduino 向 Linux 发送数据时,我首先发送两个字节,表示将来自 Arduino 的总字节数。我将这两个字节转换为整数值并开始从串行端口读取数据。比如说,我想从 Ardiuno 向 Linux 发送 300 个字节,我会先写 {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 个字节),我的所有序列都出错了。所以我的问题是我可以从串口读取空字符还是请给我更好的解决方案..

提前致谢。

【问题讨论】:

  • 原因 #18 为什么我讨厌人们在谈论角色时说“null”。 “空”基本上意味着“没有值”——即:它位于允许值的范围之外——而“空字符”是代码为 0 的字符。即:一个允许的值,如果有点奇怪的话。请改用 NUL;这就是 ASCII 表中的内容。 :P
  • 重点是,字符 0 仍然是一个普通字符。当使用以 nul 结尾的字节字符串时,它恰好也具有 对 C 的特殊含义。另一方面,串行端口不在乎。
  • 您可能想向我们展示如何在两侧设置串行设备以及如何通过这些设备发送和接收数据的代码。
  • 是的 - 代码。串行端口对 NUL 字符、字节值 0、八位字节 0 或任何您希望调用的字符没有内在问题。正如其他评论者所建议的,这肯定是 C 风格的空终止字符串的问题。
  • 我的问题终于解决了。串行端口配置为 1N8 选项。实际上我将 Char 值视为字符串,并使用函数 strlen(char*) 发送具有大小计算的数据,我只是开始发送数据,如 char data[] = {0, 0, 0};写(serial_fd,数据,3);当我输入总字节大小为 3 时,之后我也可以发送 NULL (:-P) 字符。此外,0 也是一个字符。我希望它对像我这样的人有所帮助:-p

标签: c linux serial-port null-character


【解决方案1】:

我的问题解决了。在 C 中处理字节时,不要将字节 (char) 与字符串混淆,就像我在处理字节数组 (char data[]) 时,当我尝试使用长度为 strlen 的 write 方法在串行端口上写入这些字节时(数据),我只得到那些不为空的字节。 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多