串口无法发送响应--Python3和PySerial

时间:2018-03-26 14:33:41

标签: python-3.x serial-port pyserial uart

我有两个相互通信的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)

提前致谢。

1 个答案:

答案 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

希望它适合你=)