串行通信:从 Python3 发送列表到 Arduino

Serial communication : Send a list from Python3 to Arduino

即使最近几天我在互联网上阅读了很多有关它的信息,我也无法解决我的问题。 我尝试将可变长度列表从我的 Python3 程序传送到我的 Arduino Leonardo。 实际上这些列表的长度是可变的,但只有三种可能的长度:

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)

此代码发送这样的二进制值:

b'\x00\x00\x01\xb0\x01\x00\x00'
(the original list to send was : [0, 0, 1, 176, 1, 0, 0])

问题是我完全不知道如何用我的 Arduino 代码找回我的原始值列表...

我的 Arduino 代码(非常基础):

void changeSettings() {
  if ( Serial.available() > 0 ) {
    int byte_read = Serial.read() ;
    Serial.println(byte_read, DEC) ;

此代码的输出是每个字符从 ASCII 到十进制的纯转换...

输出(我给出的二进制值作为示例):

98
39
92
120
48
48
92
120
48
48
92
120
48
49
92
120
98
48
92
120
48
49
92
120
48
48
92
120
48
48
39
10

你知道找回第一个列表吗?

谢谢

您似乎需要传输 7 个、4 个或 3 个值,对吗?

是否所有值都在 256 以下?

因此,我将发送 1 个字节,即 7、4 或 3,后跟列表元素的 7、4 或 3 字节。如果您列表中的任何项目大于 255 且小于 65,536,您需要为每个元素发送 2 个字节。

好吧,感谢@MarkSetchel 和 Olmagzar(Discord 用户)的提示,我找到了解决方案。

Python3代码:

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 那边阅读它,就知道我必须阅读多少项目。

A​​rduino 代码:

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 ;
        }
    } 
}