Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 串行通信:从Python3向Arduino发送列表_Python 3.x_Arduino_Pyserial - Fatal编程技术网

Python 3.x 串行通信:从Python3向Arduino发送列表

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代码:

即使最近几天我在网上读到了很多关于我的问题,我也无法处理我的问题。 我试着从我的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)
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的意思,你已经有了答案。