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

时间:2018-01-11 17:16:47

标签: c++ arduino serial-port usb serial-communication

我试图通过串行通信将数据从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_t std :: vector std :: 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 --- */

1 个答案:

答案 0 :(得分:0)

在arduino上,您将缓冲区中的数据作为原始字节

接收

现在您必须解析此问题,您可以使用memcpy复制struct

中的数据

但是,为此,数据必须对齐,这意味着您必须确切地知道它的开始位置。所以你应该发送同步字节(开始/停止字节)以便能够修复数据开始的位置

然后您可以使用parsing buffer data into 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存储在内存中的方式:How is a struct stored in memory?

两个系统上的

浮点数应为32位https://www.arduino.cc/reference/en/language/variables/data-types/float/