【问题标题】:Arduino Ethernet Byte size problemArduino以太网字节大小问题
【发布时间】:2011-01-07 04:34:20
【问题描述】:

我正在使用带有官方以太网扩展板的 Arduino (duemilanove) 将数据发送到控制器以控制 LED 矩阵。我正在尝试通过在桌面上获取 32 位值中的 4 个字节并将其作为 4 个连续字节发送到 arduino 来向控制器发送一些原始的 32 位无符号整数值(unix 时间戳)。但是,当字节值大于 127 时,以太网客户端库返回的值是 63。

以下是我在 arduino 方面所做的一个基本示例。为了整洁,有些东西被移除了。

byte buffer[32];
memset(buffer, 0, 32);

int data;
int i=0;

data = client.read();
while(data != -1 && i < 32)
{
  buffer[i++] = (byte)data;
  data = client.read();
}

因此,每当输入字节大于 127 时,变量“data”最终将设置为 63!起初我认为问题出在更远的地方(缓冲区曾经是 char 而不是 byte)但是当我在读取后立即打印出“数据”时,它仍然是 63。

任何想法可能导致这种情况?我知道 client.read() 应该输出 int 并在内部从套接字读取数据作为 uint8_t 这是一个完整的字节和无符号,所以我应该能够至少去 255...

编辑:你是对的,汉斯。没有意识到 Encoding.ASCII.GetBytes 只支持前 7 位而不是全部 8。

【问题讨论】:

  • UTF-8 编码不会给出 63... 输入 63 也会产生 63 输出吗?后续字节是否完全移位。

标签: c++ c arduino ethernet


【解决方案1】:

我更倾向于怀疑传输端。你确定发射端工作正常吗?您是否通过wireshark 捕获或类似的方式进行了验证?

【讨论】:

  • 但请注意,数据不能是一个字节,因为那样 255 与 EOF 将是模棱两可的。
【解决方案2】:

63 是 ? 的 ASCII 码。这些值有一些相关性,ASCII 没有超过 127 的值的字符代码。ASCII 编码器通常用问号替换这样的无效代码。例如 .NET Encoding.ASCII 编码器的默认行为。

目前还不清楚这可能发生在哪里。绝对不在您的 sn-p 中。可能在电线的另一端。写入字节,而不是字符。

【讨论】:

    【解决方案3】:

    Hans Passant 和 Karl Bielefeldt +1。

    你可以不编码就发送数据吗?数据是如何发送的? TCP/UDP/IP/Ethernet 绝对支持无限制发送二进制数据。如果这是不可能的,也许将数据转换为十六进制可以解决问题。 Base64 也可以工作(更好),但工作量要大得多。对于少量数据,十六进制可能是最简单、最快的解决方案。

    再次感谢 Karl 和 Ben 提到了 wireshark。对于调试此类网络问题非常有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多