首页 > 解决方案 > matlab 与 python 3.7 中的串行通信之间的区别?通过 python 串行将超过 128 的 int 值发送到 arduino

问题描述

我有一些我想翻译成 python 3.7 的 matlab 函数。这些函数从 trossenrobotics 计算小型机器人的关节角度值,并通过串行端口将这些值发送到由 arduino 板控制的机器人。该板运行来自 Trossenrobotics 的程序,该程序解释通过串行端口发送的数据并做出相应反应。

我已经设法翻译了所有函数,它们提供与 matlab 函数相同的输出,但串行通信不起作用。在matlabfwrite(s, int_value)fread(s)用于通讯。int_values 代表关节位置(0-1024)的高字节和低字节,分别发送。在 python 中,我使用了 pyserial 和函数 s.write(byte) 和 s.read()。我将 int 值转换为带有chr(int).encode().

由于我一直在努力实现自己的实际目标,因此我首先想将其抽象化并使其更简单。现在我只是想在 arduino 上打开一个 LED 2 秒钟,当接收到一个特殊字节并将相同的字节发送回 python 时。

我注意到,只要我发送的值小于 128,它就可以正常工作,但是当它更大时,它就不起作用了。

我打印了chr(255).encode()它的输出b'\xc3\xbf',在我看来这可能是问题所在。我尝试使用chr(255).encode('charmap')并打印它,它返回了b'\xff',对我来说看起来正确,但它仍然不适用于 128 到 255 之间的数字。我还注意到,当我通过终端发送数据时s.write(chr(115).encode())它不会返回一个值,但是当我使用 s.write(chr(255).encode('charmap'))它时返回一个 1。

这是我的python程序:

python
import serial
from time import sleep
port = 'COM4'
baudrate = 38400
s = serial.Serial(port,baudrate)
sleep(3)

m = 115
s.write(chr(m).encode())

while s.in_waiting == 0:
    print('#####   waiting     #####')
    sleep(2)

if s.in_waiting > 0:
    r = int.from_bytes(s.read(), byteorder = 'big')
    print(r)

s.close()

这是arduino程序:

C#
void setup() {
  pinMode(13, OUTPUT);
  digitalWrite(13,LOW);
  Serial.begin(38400);
}

void loop() {
  if (Serial.available() > 0)
  {
    if (Serial.read() == 's')
    {
      digitalWrite(13, HIGH);   
      Serial.write('s');
      delay(2000);
    }
  }
  else
  {
    digitalWrite(13, LOW);    
  }
}

我的问题是:

关于我的主要问题(通过 matlab、python 发送多个字节):

1)有人知道matlab和python中的串行通信之间是否存在任何可能导致我的问题的根本区别?

关于我的抽象问题(通过python发送再见):

2)如何通过串口发送大于128(最多255)的值?

标签: pythonarduinoserial-communication

解决方案


在这方面,Python 和 Matlab 没有根本区别。

但是在您的 Matlab 代码中似乎(我假设是因为您所说的):

int_values 代表关节位置(0-1024)的高字节和低字节,分别发送。

你要发送一个int16 最多可以容纳 1024 个的。

我不知道你想做什么,chr但我觉得你需要的是替换这些行:

m = 115
s.write(chr(m).encode())

使用(在 Python 3.x 上):

m=115
s.write(m.to_bytes(2, byteorder="big"))

那会写成:b'\x00s',十六进制和 ASCII 的混合,但你不必担心,因为这与b'\x00\x73'

如果你这样做,那么你可以这样做:b'\x00s'==b'\x00\x73'你会得到True.


推荐阅读