我为Arnuino编写了一个程序,它将一个结构发送到PC上的程序。结构必须是整数,但我没有得到正确的输出。 PC上的程序使用升级库进行串行连接。并且以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);
};
}
答案 0 :(得分:1)
问题是int
on Arduino is two bytes,但PC上的int
可能是四个字节。根据您的编译器,可能有一个开关可用于设置int
的大小,或者您可以使用更明确的类型。使用int
的想法是,它应该允许通过采用主机平台的任何自然大小来轻松地将代码从一个平台调整到另一个平台。但出于同样的原因,它不是在平台之间传输数据的好选择。
要确认这是问题所在,请尝试从SerialPacked
中读取字节,而不是访问struc
。我相信你会发现所有的数据都在那里 - 这就是你试图阅读它的方式,这就是问题所在。
答案 1 :(得分:0)
我已经解决了这个问题。 我更改了Arduino代码中stuct中的整数。数据在线上是正确的。
这是因为32位Ardunio上的长度与64位vs2010代码上的整数大小相同吗?或者我错过了什么?感谢您的反馈!