我有两个相互通信的python脚本:脚本1(在端口0上运行)发出一个发送消息列表,在第一个终端打印它们,脚本2(在端口1上运行)打印发送消息发送给它并应发送回传输消息的响应。
当我仅发送消息时,几乎一切正常。问题是端口1无法将响应发送到端口0的发送消息。
每个发送UART消息都需要发送某个(硬编码)响应(目前,它们具有相同的数组索引号,但我应该为此找到更好的解决方案)。
简而言之:
1)端口1应该向端口0发送一个应答,但是它丢失了。
2)端口1端的所有打印消息都写在一行,很难读取(有些字节丢失/无法正确打印)。我应该使用比内置Xubuntu终端更好的解决方案还是更改我的代码?
3)数组数组(消息数组中的项)的所有十六进制值都以十进制格式打印,尽管它们作为十六进制值正确地转发到端口1。我想知道为什么会这样。没有尝试将打印值转换为十六进制工作。
对不起,如果我没有解释我的意思或解决方案是否已经存在。以下是代码中最重要的部分(我只添加了几条消息,因此您可以得到这个想法)。
传输脚本:
#!/usr/bin/python3
from crc_calc import CRC8
import serial
import time
import sys
port = "/dev/ttyUSB0"
baudrate = 115200
bytesize = 'EIGHTBITS'
parity = 'PARITY_NONE'
ser = serial.Serial("/dev/ttyUSB0", 115200, timeout=1,
write_timeout=5)
msg_set_101 = [0xCA, 0x00, 0x04, 0x10, 0x01, 0x18, 0x01]
msg_set_false101 = [0xCA, 0x00, 0x04, 0x10, 0x01, 0x18, 0x04]
sec_msg = [msg_set_101, msg_set_false101]
def is_open():
if ser.isOpen():
print("Port is open at " + ser.name)
else:
print("Port " + ser.name + " is closed")
def send_with_crc(sec_msg):
for i in sec_msg:
result_crc = CRC_calc.calculate(i)
print("calculated CRC: 0x%x" % result_crc)
i.append(result_crc)
new_result_crc = CRC_calc.calculate(i)
print("final calculated CRC: 0x%x" % new_result_crc)
print(i)
ser.write(i)
def show_res_sec():
while 1:
msg = ser.readline()
print(msg)
is_open()
send_with_crc(sec_msg)
show_res_sec()
接收脚本
#!/usr/bin/python3
import serial
import time
port2 = "/dev/ttyUSB1"
baudrate = 115200
bytesize = 'EIGHTBITS'
parity = 'PARITY_NONE'
ser2 = serial.Serial(port=port2, baudrate=115200, timeout=1,
writeTimeout=5)
res_set_101 = [0xCA, 0x00, 0x04, 0x80, 0x01, 0x28, 0x00]
res_set_false101 = [0xCA, 0x00, 0x04, 0x80, 0x01, 0x18, 0x01]
msg_res = [res_set_101, res_set_false101]
def is_open2():
if ser2.isOpen():
print("Port is open at " + ser2.name)
is_open2()
time.sleep(2)
counter = 0
def send_sec(msg_res):
for i in msg_res:
print(i)
ser.write(i)
def receive_msg():
while 1:
msg = ser2.readline()
print(msg)
receive_msg()
send_sec(msg_res)
提前致谢。
答案 0 :(得分:0)
似乎您的阅读方法无效,因为 ser2.readline()正在等待" / n" 所以在计算完CRC后可以添加" / n" ,也可以使用ser2.read(您要等待的字节数)。
... s = ser.read(10) # read up to ten bytes (timeout)
... line = ser.readline() # read a '\n' terminated line
希望它适合你=)