0

我为 Arnuino 编写了一个程序,该程序将一个带有联合的结构发送到 PC 上的程序。结构必须是整数,但我没有得到正确的输出。PC 上的程序使用 boost 库进行串行连接。并且是在 64 位(使用 vs2010)中构建和编译的。

如果我在联合中有一个整数变量,则该代码有效。但是带有联合的结构不起作用。只有一个整数得到数据,而那个数据是错误的。

我可能是 64 位(PC)和 32 位(Ardunio)的问题?任何人都可以帮我解决这个问题。提前致谢。

PC 代码片段(省略了串口设置):

union packed{
  struct test{
  unsigned int data;
  unsigned int data2;
} struc;

 unsigned char bytes[8];
}SerialPacked;

  SerialPacked.struc.data = 0;
  SerialPacked.struc.data2 = 0;

  cout << "Data before: " << SerialPacked.struc.data << endl;
  cout << "Data2 before: " << SerialPacked.struc.data2 << endl;

  read(port,buffer((unsigned char*)&SerialPacked.bytes[0], 1));
  read(port,buffer((unsigned char*)&SerialPacked.bytes[1], 1));
  read(port,buffer((unsigned char*)&SerialPacked.bytes[2], 1));
  read(port,buffer((unsigned char*)&SerialPacked.bytes[3], 1));
  read(port,buffer((unsigned char*)&SerialPacked.bytes[4], 1));
  read(port,buffer((unsigned char*)&SerialPacked.bytes[5], 1));
  read(port,buffer((unsigned char*)&SerialPacked.bytes[6], 1));
  read(port,buffer((unsigned char*)&SerialPacked.bytes[7], 1));

  cout << "Data after: " << SerialPacked.struc.data << endl;
  cout << "Data2 after: " << SerialPacked.struc.data2 << endl;

Arduino代码:

int ledPin = 13;


union packed{
    struct test{
      unsigned int data;
      unsigned int data2;
}struc;
    unsigned char bytes[8];
} 
SerialPacked;

void setup() {  
    pinMode(ledPin, OUTPUT); 
    Serial.begin(9600); 

   SerialPacked.struc.data = 0;
   SerialPacked.struc.data2 = 0;
};




void loop() {

while(1){
  digitalWrite(ledPin,HIGH);
  SerialPacked.struc.data = SerialPacked.struc.data + 1;
  SerialPacked.struc.data2 = SerialPacked.struc.data2 + 1;;

  for(int i=0;i <8; i++){ 
    Serial.write(SerialPacked.bytes[i]);
  };

    digitalWrite(ledPin,LOW);
    delay(1000);
 };

}
4

2 回答 2

1

问题是int 在 Arduino 上是两个字节,但int在您的 PC 上可能是四个字节。根据您的编译器,您可能会使用一个开关来设置 的大小int,或者您可以只使用更明确的类型。这个想法int是,它应该允许通过采用主机平台的自然大小来轻松地将代码从一个平台适应到另一个平台。但是,出于同样的原因,它不是在平台之间传输数据的好选择。

要确认这是问题所在,请尝试读取字节SerialPacked而不是访问struc. 我相信你会发现所有的数据都在那里——这只是你试图阅读它的方式,这就是问题所在。

于 2012-09-26T16:19:42.653 回答
0

我已经解决了这个问题...我将 Arduino 代码中 stuct 中的整数更改为 long。数据是正确的。

这是因为 32 位 Ardunio 上的 long 与 64 位 vs2010 代码上的整数大小相同吗?或者我在这里错过了什么?感谢您的反馈!

于 2012-09-26T16:13:04.407 回答