準備着手寫一個串口工具,當前編程環境,並沒有辦法接好下位機平臺,需要模擬出一個串口,不斷髮送信息,方便調試串口工具。
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)
代碼流程:
- 啓動一個子線程,打開com3 ,將當前時間作爲數據,寫入到串口
- 啓動另一個子線程,打開com4,讀取串口中寫入的數據
注意點:
1.串口中寫入的數據爲byte類型,str to byte 需要 encode(), 默認使用utf-8
2.從串口中讀取的數據,也是byte類型,byte to str 需要decode(), 默認使用utf-8
3.虛擬串口是兩個設備直接的通信 ,需要在com3 中寫 ,在com4中讀,筆者犯過一個低級錯誤,com3寫,也在com3中讀,不會出任何數據
4.子線程設置爲守護線程,主線程退出,子線程隨之退出,後續可以在主線程中處理讀取到的數據