如何通过串口发送浮动

chr*_*ero 7 c c++ serial-port bytearray arduino

什么是派出最好的方式float,double以及int16通过串行上的Arduino?

Serial.print(),因为只有发送值ASCII编码.但我想将值作为字节发送.Serial.write()接受字节和字节数组,但是将值转换为字节的最佳方法是什么?

我试着投了int16一个byte*,没有运气.我也使用了memcpy,但它使用了很多CPU周期.Arduino使用普通的C/C++.这是一款ATmega328微控制器.

Nil*_*nck 10

HM.这个怎么样:

void send_float (float arg)
{
  // get access to the float as a byte-array:
  byte * data = (byte *) &arg; 

  // write the data to the serial
  Serial.write (data, sizeof (arg));
}
Run Code Online (Sandbox Code Playgroud)

  • 如果它们以字节形式发送 - 通过定义发送二进制 - 那么它可能不起作用:某些字节看起来像接收器可能会作用的控制字符.所以这些数字必须是数字化的.此外,字符几乎总是通过串行线路发送为7位,因此尝试将它们作为8位字节发送将丢弃高位. (2认同)

Pet*_*son 9

是的,要发送这些数字,您必须先将它们转换为ASCII字符串.如果您正在使用C,那么sprintf()IMO是进行此转换的最便捷方式:

[后来添加:AAAGHH!我忘了for ints/ longs,函数的输入参数想要无符号.同样,传递给的格式字符串sprintf().所以我在下面改了.对于我可怕的疏忽感到抱歉,这本来是一个难以发现的错误.而且,ulong使它更通用.]

char *
int2str( unsigned long num ) {
    static char retnum[21];       // Enough for 20 digits plus NUL from a 64-bit uint.
    sprintf( retnum, "%ul", num );
    return retnum;
}
Run Code Online (Sandbox Code Playgroud)

和花车和双打类似.执行转换的代码已事先知道.必须告诉它 - 它正在转换什么样的实体,所以你可能最终得到功能char *float2str( float float_num)char *dbl2str( double dblnum).

您将从转换中获得NUL终止的左调整(无前导空格或零)字符串.

你可以随时随地进行转换; 这些功能只是插图.