擅长:python、mysql、java
<p>您犯了网络/串行/插入通信层的经典结构错误。结构具有隐藏的填充,以便将成员与适当的内存边界对齐。这不能保证在不同的计算机上是相同的,更不用说不同的CPU/微控制器了。在</p>
<p>以这个结构为例:</p>
<pre><code>struct Byte_Int
{
int x;
char y;
int z;
}
</code></pre>
<p>现在在一个基本的32位x86 CPU上,有一个4字节的内存边界。这意味着根据变量的类型,变量被对齐到4字节、2字节或者根本不对齐。这个例子在内存中是这样的:intx在字节0,1,2,3上,chary y在字节4上,intz在字节8,9,10,11上。为什么不使用第二行的三个字节呢?因为这样的话,内存控制器必须进行两次回迁才能得到一个数字!控制器一次只能读取一行。因此,结构(和所有其他类型的数据)都有隐藏的填充,以便使变量在内存中对齐。这个示例结构的sizeof()应该是12,而不是9!在</p>
<p>现在,这和你的问题有什么关系?您正在memcpy()将一个结构直接放入缓冲区,包括填充。另一端的计算机不知道这个填充,并且误解了数据。您需要一个序列化函数,该函数一次一个地将结构的成员传递到缓冲区中,这样一来,您将丢失填充并最终得到如下结果:
[0,1,2,3:整数x][4:字符y][5,6,7,8:int z]。所有这些都是一个很长的bytearray/string,可以使用Serial()安全地发送。当然,在另一端,您必须将此字符串解析为可理解的数据。只要提供正确的格式字符串,Python的unpack()就可以为您完成这项工作。在</p>
<p>最后,Arduino上的int是16位长的。在pc上一般4!所以要小心地组装解包格式字符串。在</p>