繁体   English   中英

串行通信:将数据从C ++发送到Arduino

[英]Serial communication: Sending data from C++ to Arduino

我正在尝试通过串行通信从C ++程序向Arduino发送数据。 我形成了一个将数据作为对象发送的结构:

typedef struct
{
   double width;
   double height;
   bool passBoard;
} MachineParameters;

我正在使用此串行库: http : //wjwwood.github.com/serial/用于发送数据,如下所示:

    MachineParameters mp;
    mp.width = 100;
    mp.height = 200;
    mp.passBoard = true;

    ser.write((const uint8_t *)&mp, sizeof(mp));

该库可以将数据作为uint8_tstd :: vectorstd :: string发送

Arduino确实接收数据,但我不知道如何将数据解析为结构。 我正在使用与cpp代码中相同的结构。

// In Arduio

MachineParameters mp;
int byte_size = 24;

loop() {
   if(Serial.available() >= 24) {
     Serial.readBytes((char*) &mp , 24);
   } 
}

// Goal: Read received mp data just like
// mp.width or mp.height

经过数小时的尝试,我仍然无法弄清楚如何将该结构成功发送到arduino。 还有另一种发送此数据到arduino的方法吗? 它可以将数据作为字符串发送,但似乎不正确。

我对使用C ++编程非常陌生,所以请原谅任何明显的问题...

感谢您的帮助!


更新:下面的工作解决方案

经过一番尝试,并感谢您的提示,我弄清楚了。 这是为我工作的代码。 我发现我的问题是用于解析缓冲区的字节大小错误。 C ++中该结构的大小为12 ,而在arduino上为9 使用原始大小(12)在Arduino上解析缓冲区,该结构已正确解析。

/* --- C++ CODE --- */
typedef struct
{
   double width;
   double height;
   bool passBoard;
} MachineParameters;
// sizeof(MachineParameters) returns 12.


MachineParameters mp;
mp.width = 11.1;
mp.passBoard = false;
mp.height = 22.2;

ser.write((uint8_t *)&mp, sizeof(mp));
/* --- END OF C++ --- */



/* --- Arduino Code --- */
#define   BYTE_SIZE   12
char messageBuffer[BYTE_SIZE];

typedef struct
{
   double width;
   double height;
   bool passBoard;
} MachineParameters;

MachineParameters mp;

void setup() {
  Serial.begin(9600);
}

void loop() {

  if (Serial.available() >= BYTE_SIZE) {
    Serial.readBytes(messageBuffer , BYTE_SIZE);
    memcpy(&mp, &messageBuffer, BYTE_SIZE);

    // mp.width returns 11.1
    // Success :)
  }
}
/* --- END OF ARDUINO --- */

在arduino上,您以原始字节的形式在缓冲区中接收数据

现在您必须解析它,您可以使用memcpy进行操作以将数据复制到struct

但是,为此必须对数据进行对齐,这意味着您必须确切地知道它从哪里开始。 因此,您应该发送一个同步字节(开始/停止字节)以固定数据的开始位置

那么您可以使用代码将缓冲区数据解析为struct

struct abc {
    char a;
    char b;
    char c;
    char d[2];
};

int main() {

    char arr[5] = { 'a', 'b', 'c', 'd', 'e' };
    struct abc sa;
    memcpy(&sa, arr, 5);


    return 0;
}

这里arr是传入缓冲区,并且使用memcpy适当地复制了所有内容。

ser.write((const uint8_t *)&mp, sizeof(mp)); 是正确的

您可以在arduino上创建相同的结构mp_arduino ,然后使用以下命令将接收缓冲区的内容复制到该结构中:

memcpy ( &mp_arduino, receive_buffer+n, sizeof(mp_arduino) ); 其中n表示在位置/字节receive_buffer您的数据开始,并且receive_buffer被定义为uint8_t receive_buffer[]uint8_t* receive_buffer是相同的...)

http://www.cplusplus.com/reference/cstring/memcpy/

这是将struct存储在内存中的方式: 如何将结构存储在内存中?

在两个系统上,浮点数都应为32位https://www.arduino.cc/reference/en/language/variables/data-types/float/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM