【问题标题】:Transfering an int as two bytes on the Arduino在 Arduino 上将 int 作为两个字节传输
【发布时间】:2013-10-10 10:53:50
【问题描述】:

我正在高频采样,需要通过 UART 将 10 位 ADC 值从我的 Arduino 中传输出去。

默认情况下,每个字符使用一个字节。因此,如果执行模拟读取会产生“612”的值,它将通过 UART 发送“6”作为一个字节,“1”作为一个字节,“2”作为一个字节,行终止符作为最后一个字节。

鉴于我的采样率被这种通信截断,重要的是它尽可能高效和统一,所以我试图强制它使用两个字节来传输该数据,不是不管实际的数据是什么(默认情况下,它会使用三个字节来传输“23”,四个字节来传输“883”,五个字节来传输“1001”)。

目前,我正在做这样的事情,这是我发现的最好方法:

int a = 600; //Just an example
char high = (char)highByte(a);
char low = (char)lowByte(a);
Serial.print(high);
Serial.println(low);

目前,无论值如何,它都使用三个字节(包括 \n)。有没有更有效的方法?

只是用类似的东西打印出来

Serial.print(foo, BIN);

根本不起作用。实际上,它对 foo 的二进制表示的每一位都使用一个字节,这很愚蠢。

【问题讨论】:

  • 根本不发送换行符?如果您知道数据始终是一对字节,并且不担心丢失一个字节(您可以很少在流中传播同步字节),那么就没有理由使用换行符。此外,如果您以二进制形式发送数据,如果其中一个字节恰好是 10(与 ASCII 换行符相同)会发生什么?
  • Serial.write() 是处理二进制数据的方式。 Serial.print() 函数旨在将值转换为人类可读的文本。

标签: c serial-port char arduino uart


【解决方案1】:

我可能遗漏了一些东西,但你为什么不使用Serial.write(byte)

你可以使用这样的方法:

void writeIntAsBinary(int value){
    Serial.write(lowByte(value));
    Serial.write(highByte(value));
}

您打算如何处理计算机上的数据?

【讨论】:

    【解决方案2】:

    如果您通过串行线路发送二进制数据,您真的不应该使用文本样式的换行分隔符来混淆所有内容。

    另一方面,在没有某种同步帮助的情况下,很难(对于另一端)知道哪个字节是哪个字节。

    但是,由于您只有 10 位有效负载,但发送 16 位数据,您可以“执行 UTF-8”并使用空闲位来表示“值开始”。这将需要每个 8 位字节中的 7 位用于您的有效负载,但这很好,因为 7 + 7 = 14 远大于 10。我们可以让第 8 位表示“这是新对的高字节字节数”:

    const int a = 600;
    const unsigned char high = ((a >> 7) & 0x7f) | 0x80;
    const unsigned char low  = (a & 0x7f);
    
    Serial.print(high);
    Serial.print(low);
    

    在上面,传输的两个字节将是:

    high == ((600 >> 7) & 0x7f) | 0x80 == 4 | 0x80 == 0x84
    low  == (600 & 0x7f)               == 88       == 0x58
    

    接收者必须反过来执行上述操作:

    const int value = ((high & 0x7f) << 7) | low;
    

    这应该有效,并使用首先发送的高字节的最高有效位来表示这确实是高字节。低字节永远不会设置 MSB。

    【讨论】:

    • 除非如果低字节也设置了 MSB,这将不起作用。低字节只能传输 7 位。
    • 我觉得应该是high = ((a &gt;&gt; 7) &amp; 0xff) | 0x80; low = (a &amp; 0x7f);
    • @user694733 谢谢!我没有充分考虑这一点,我编辑了。
    猜你喜欢
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    相关资源
    最近更新 更多