我想将四个字节合并为一个数字以进行串行传输

I want to merge four bytes into one digit for serial transmission

本文关键字:数字 一个 串行传输 字节 四个 合并      更新时间:2023-10-16

我想使用 python 将长值发送到运行 c++ 的 arduino 板。串行通信将 4 个字节的数字分解并逐字节发送。当我尝试在后端重新组装它们时,我只得到一个 2 字节的有效数字,而不是我发送的 4 个字节。

这是python代码发送指令。

pos1 = int(input("pos1: "))
pos2 = int(input("pos2: "))
data = struct.pack('<ll', pos1, pos2)
ser.write(data)

这是解析它读取的字节的arduino代码。

if(Serial.available()>0){
size_t numbytes = Serial.readBytes(data, 8);
for(int i=0; i<8; i++){
Serial.println(data[i], HEX);
}
pos1 = readfourbytes(data[0], data[1], data[2], data[3]);
pos2 = readfourbytes(data[4], data[5], data[6], data[7]);
Serial.println(pos1);
Serial.println(pos2);
}
long readfourbytes(byte fourthbyte, byte thirdbyte, byte thirdbyte, byte firstbyte){
long result = (firstbyte << 24) + (secondbyte << 16) + (thirdbyte << 8) + fourthbyte;
return result;
}

我想这意味着 arduino 是小端序?我的问题是读取的第二个位置值完全关闭。python代码似乎是问题所在,但我不知道为什么。当我为两者发送 int 值 100 时,我得到的输出为

B'd\x00\x00\x00d\x00\x00\x00'

从 Python 代码作为在数据变量中发送的二进制文件。但是从 arduino 中,我收到:

64

0

0

0

6D

阿拉伯数字

0

0

100

621

因此,我发送的内容和接收的内容之间存在脱节。波特率是一样的,我知道没有其他明显的错误。

>所有表达式(<any>byte << <bits>)都被评估为int,在arduino上似乎是16位。将<any>byte投射到long中,你就完成了。

long readfourbytes(byte fourthbyte, byte thirdbyte, byte thirdbyte, byte firstbyte){
long result = ((long)firstbyte << 24) + ((long)secondbyte << 16) + (thirdbyte << 8) + fourthbyte;
return result;
}
相关文章: