Python 3.x 串行通信:从Python3向Arduino发送列表
即使最近几天我在网上读到了很多关于我的问题,我也无法处理我的问题。 我试着从我的Python3程序向我的Arduino Leonardo传递一个可变长度的列表。 实际上,这些列表的长度是可变的,但只有三种可能的长度:Python 3.x 串行通信:从Python3向Arduino发送列表,python-3.x,arduino,pyserial,Python 3.x,Arduino,Pyserial,即使最近几天我在网上读到了很多关于我的问题,我也无法处理我的问题。 我试着从我的Python3程序向我的Arduino Leonardo传递一个可变长度的列表。 实际上,这些列表的长度是可变的,但只有三种可能的长度: first possibility : [0, 0, 1, 176, 1, 0, 0] second possibility : [0, 1, 11, 255] third possibility : [0, 2, 0] (这些列表中的大多数值都是变量) 我的Python3代码:
first possibility : [0, 0, 1, 176, 1, 0, 0]
second possibility : [0, 1, 11, 255]
third possibility : [0, 2, 0]
(这些列表中的大多数值都是变量)
我的Python3代码:
with Serial(port = port, baudrate=9600, timeout=1, writeTimeout=1) as port_serie :
if port_serie.isOpen() :
for value in Datas_To_Send : #Envoi des données
s = struct.pack('!{0}B'.format(len(Datas_To_Send)), *Datas_To_Send)
port_serie.write(s)
if Datas_To_Send :
long = len(Datas_To_Send)
Datas_To_Send.insert(0, long)
with Serial(port = '/dev/cu.usbmodem14101', baudrate=9600, timeout=1, writeTimeout=1) as port_serie :
if port_serie.isOpen() :
s = struct.pack('!{0}B'.format(len(Datas_To_Send)), *Datas_To_Send)
port_serie.write(s)
port_serie.close()
此代码发送如下二进制值:
b'\x00\x00\x01\xb0\x01\x00\x00'
(the original list to send was : [0, 0, 1, 176, 1, 0, 0])
问题是我完全不知道如何用我的Arduino代码找到我原来的值列表
我的Arduino代码(非常基本):
此代码的输出是每个字符从ASCII到十进制的纯转换
输出(以我给出的二进制值为例):
你有没有办法把第一张单子找回来
谢谢您似乎需要传输7、4或3个值,对吗 所有值都在256以下吗
因此,我将发送1个字节,即7、4或3,后跟列表元素的7、4或3个字节。如果列表中的任何项目大于255但小于65536,则每个元素需要发送2个字节。好吧,多亏@MarkSetchel和Olmagzar(Discord用户)的提示,我找到了解决方案 Python3代码:
with Serial(port = port, baudrate=9600, timeout=1, writeTimeout=1) as port_serie :
if port_serie.isOpen() :
for value in Datas_To_Send : #Envoi des données
s = struct.pack('!{0}B'.format(len(Datas_To_Send)), *Datas_To_Send)
port_serie.write(s)
if Datas_To_Send :
long = len(Datas_To_Send)
Datas_To_Send.insert(0, long)
with Serial(port = '/dev/cu.usbmodem14101', baudrate=9600, timeout=1, writeTimeout=1) as port_serie :
if port_serie.isOpen() :
s = struct.pack('!{0}B'.format(len(Datas_To_Send)), *Datas_To_Send)
port_serie.write(s)
port_serie.close()
因此,我将列表长度直接添加到列表的第一个位置“Datas_To_Send”。
就像这样,我只需要先从Arduino的角度阅读,就可以知道我需要阅读多少项
Arduino代码:
void changeSettings() {
if (Serial.available() > 0)
{
unsigned char len = Serial.read();
unsigned char Datas[len] ;
for (int i = 0; i < len - 1; i++)
{
unsigned char byte_read = Serial.read();
Datas[i] = byte_read ;
}
}
}
void changeSettings(){
如果(Serial.available()>0)
{
unsigned char len=Serial.read();
无符号字符数据[len];
对于(int i=0;i
完全正确。7、4或3个值都小于256。您的建议是发送第一个字节,通知列表的元素数,然后允许在Arduino端读取它?如果是这样的话,问题是即使我知道它的长度,我也不知道如何用Arduino代码正确地恢复它以找到我的原始列表。如果是3,则再读取3个字节。如果为4,则多读取4个字节。等等然后把你读到的每个附加字节转换成一个整数,你就有了你的列表。如果你知道ASCII的意思,你已经有了答案。