tez*_*tez 5 c python atmega arduino
我需要从 Python 向 Arduino 发送浮点数据并获取相同的值。我想先从 Arduino 发送一些浮点数据。数据以 4 个连续字节的形式发送。我试图弄清楚如何收集这些连续的字节并在Python端(系统端)将其转换为正确的格式
Arduino代码:
void USART_transmitdouble(double* d)
{
union Sharedblock
{
char part[4];
double data;
} my_block;
my_block.data = *d;
for(int i=0;i<4;++i)
{
USART_send(my_block.part[i]);
}
}
int main()
{
USART_init();
double dble=5.5;
while(1)
{
USART_transmitdouble(&dble);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Python代码(系统端):
my_ser = serial.Serial('/dev/tty.usbmodemfa131',19200)
while 1:
#a = raw_input('enter a value:')
#my_ser.write(a)
data = my_ser.read(4)
f_data, = struct.unpack('<f',data)
print f_data
#time.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)
使用struct
上面代码中所示的模块可以打印浮点值。
50% 的时间,数据打印正确。但是,如果我弄乱time.sleep()
或停止传输并重新启动它,则会打印出错误的值。我认为在这种情况下,解包的 4 个字节集是错误的。您知道我们可以在这里做什么吗?
除了使用 struct 模块向 Arduino 发送和接收浮点数据之外,还有其他想法吗?
嗯,简短的回答是软件和硬件之间正在进行一些交互。我不确定你是如何停止传输的。我怀疑您所做的实际上是停止发送中间字节的字节,因此在启动备份时注入一个新字节。time.sleep() 部分可能是某些硬件缓冲区溢出并且您丢失字节,从而导致对齐偏移。一旦您开始从一个浮点中获取几个字节并从另一个浮点中获取一些字节,您就会开始得到错误的答案。
我注意到的一件事是你没有任何对齐机制。这对于 UART 通常很难做到,因为您只能发送字节。一种方法是来回发送握手信号。计算机说重新启动,硬件重新启动连接(停止发送内容,清除其拥有的缓冲区等)并发送一些魔法,例如 0xDEADBEEF。然后计算机可以找到这个0xDEADBEEF并知道下一条消息将从哪里开始。您仍然需要了解硬件/操作系统中存在的任何缓冲区,并采取预防措施不要溢出它们。有多种流量控制方法,从 XON/XOFF 到实际的硬件流量控制。