Python使用多线程实现串口收发数据

Python使用多线程实现串口收发数据

  • 前言
  • 代码
  • 最后

前言

近期要写个串口的代码,想着工程有点大打算用多线程布局…
在使用这份代码之前,您可以根据下述博文先配置serial库:

Windows:https://blog.csdn.net/qq_44847636/article/details/114156472.
Linux:https://blog.csdn.net/qq_44847636/article/details/114242849.
Jeston nano/Rraspberry Pi:https://blog.csdn.net/qq_44847636/article/details/113872341.

代码

代码包括自定义通信协议的部分,但是这里receive()的判断没写完(没人测试,不想写了==)。

代码如下:

'''
通信协议:
    2-1:0x5a/0x5a/ring/task/power/0xb3
    1-2:0x5a/0x5a/mark/result/0xb3
    以上数据均为16进制
'''
import serial
import threading
import time


def receive():
    while True:
        #这里stm32发送信息以什么为结尾?回车吗
        tran_data1 = ord(serial_port.read() )
        if tran_data1 == 90:
            tran_data2 = ord(serial_port.read())
            if tran_data2 == 90:
                ring = ord(serial_port.read())
                task = ord(serial_port.read())
                power = ord(serial_port.read())
                print("data receive success!")

def send(mark,result):
    while True:
        data = bytearray([0x5a, 0x5a, mark,result, 0xb3])
        print(data)
        serial_port.write(data)
        time.sleep(1)

if __name__ == '__main__':
    serial_port = serial.Serial(
        port="COM5",
        baudrate=115200,
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
    )
    # Wait a second to let the port initialize
    time.sleep(0.5)
    mark = 0
    result = 1
    t1 = threading.Thread(target=receive)
    t2 = threading.Thread(target=send,args=[mark,result])
    t1.start()
    t2.start()
    t1.join()
    t2.join()

最后

这里有个疑问:

了解过Python多线程的朋友知道,在Python多线程中有GIL这个机制,所以Python的多线程虽然是并发,但是确实是假并行(单CPU);同理,Python多线程写的串口同时收发数据其实应该也是 假全双工

但是我在多次测试的时候并没有发现数据的缺失,mark一下???

最后:

代码Github链接:https://github.com/GRF-Sunomikp31/Useful_code/blob/main/serial/muiltithreading_serial.py.
如果这篇博文真的帮助到您,欢迎在CSDN上关注、点赞、收藏、评论,也欢迎到github上 follow、star。

你可能感兴趣的:(Python,通信测试,python,串口通信,多线程)