python 虛擬串口通信

準備着手寫一個串口工具,當前編程環境,並沒有辦法接好下位機平臺,需要模擬出一個串口,不斷髮送信息,方便調試串口工具。

1.win 下載虛擬串口

https://sourceforge.net/projects/com0com/files/latest/download
下載安裝完成後,會在設備管理器中新增兩個com。
這兩個串口是互相接通的,一個com 可以當作上位機,一個com可以當作下位機
在這裏插入圖片描述

2.python 實現向一個串口內寫數據,另一個串口內接受數據

#!/usr/bin/python
# -*-coding: utf-8 -*-

import serial
import serial.tools.list_ports
import threading
import time
from datetime import datetime

#列出所有當前的com口
port_list = list(serial.tools.list_ports.comports())
port_list_name = []

class SerialPort:
    def __init__(self,port,buand):
        self.port = serial.Serial(port,buand)
        self.port.close()
        if not self.port.isOpen():
            self.port.open()

    def port_open(self):
        if not self.port.isOpen():
            self.port.open()

    def port_close(self):
        self.port.close()

    def send_data(self):
        #date = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
        while True:
            date = datetime.now().strftime('%H:%M:%S.%f')[:-3]
            print("send:",date)
            self.port.write(date.encode())
            time.sleep(1)

    def read_data(self):
        while True:
            count = self.port.inWaiting()
            if count > 0:
                rec_str = self.port.read(count)
                print("receive:",rec_str.decode())

def show_all_com():
    if len(port_list) <= 0:
        print("the serial port can't find!")
    else:
        for itms in port_list:
            port_list_name.append(itms.device)

if __name__ == '__main__':

    baunRate = 115200

    print("1.list all com")
    show_all_com()
    print(port_list_name)

    print("2.open write port ",port_list_name[0])
    serialPort_w = port_list_name[0]
    mSerial_w = SerialPort(serialPort_w,baunRate)

    print("3.start write thread")
    t1 = threading.Thread(target=mSerial_w.send_data)
    t1.setDaemon(True)
    t1.start()

    print("4.open read port ",port_list_name[1])
    serialPort_r = port_list_name[1]
    mSerial_r = SerialPort(serialPort_r,baunRate)

    print("5.start read thread")
    t2 = threading.Thread(target=mSerial_r.read_data)
    t2.setDaemon(True)
    t2.start()

    #do something else, make main thread alive there
    while True:
        time.sleep(10)
	

代碼流程:

  1. 啓動一個子線程,打開com3 ,將當前時間作爲數據,寫入到串口
  2. 啓動另一個子線程,打開com4,讀取串口中寫入的數據

注意點:

1.串口中寫入的數據爲byte類型,str to byte 需要 encode(), 默認使用utf-8
2.從串口中讀取的數據,也是byte類型,byte to str 需要decode(), 默認使用utf-8
3.虛擬串口是兩個設備直接的通信 ,需要在com3 中寫 ,在com4中讀,筆者犯過一個低級錯誤,com3寫,也在com3中讀,不會出任何數據
4.子線程設置爲守護線程,主線程退出,子線程隨之退出,後續可以在主線程中處理讀取到的數據

運行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章