python - 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)的值?
解决方案
在这方面,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
.
推荐阅读
- android - 如何从 kotlin 中收到的短信中获取完整的正文?
- c - 如何删除多次出现的字符并只留下一个
- android - 标记隐藏标记上的Android setRotation
- java - 如何将jtable只有一列数据插入DB mysql?
- matlab - 在matlab中执行多个嵌套for循环是否有更有效的方法?
- rx-java2 - RxJava/RxKotlin:如果一个源完成(不是全部),combineLatest 已经完成
- python - 密码保险库问题,代码未遵循 if 语句
- r - 底部使用grid.arrange和legend时x轴位置不同的问题
- android - 为什么我必须为数据库中的自动递增列创建一个设置器?
- azure - Azure 流量管理器加权路由,有多少重要?