python串口助手


  最近項目中要使用模擬數據源通過向外發送數據,以前都是用C#編寫,最近在研究python,所以就用python寫了一個串口助手,方便以后的測試。

       在電腦上通過虛擬串口助手產生兩個虛擬串口,運行編寫的串口助手

另外,打開一個串口調試助手,輔助測試

 

  兩者互發數據,可以看到編寫的串口助手能夠正常接收發送,並且在后台我們也把接收到的數據打印了出來

 

 

 

下面先講解關於界面的代碼,這里只是簡單的使用tkinter做界面,如果想要更好的界面效果,可以嘗試一下QT。

首先是界面中串口設置區域的代碼,界面布局統一用grid來布局,當然也有其他的布局方法

 1 #-------------------------------------------------------------------------
 2 #面板布局區
 3 root = Tk()
 4 root.title('xutopia 公眾號:洛水梅家')
 5 
 6 #-------------------------------------------------------------------------
 7 #串口設置區
 8 label_com = Label(root, text="串口號", height=2).grid(row=0, column=0)
 9 label_bps = Label(root, text="波特率", height=2).grid(column=0, row=1)
10 label_datBit = Label(root, text="數據位", height=2).grid(column=0, row=2)
11 label_parity = Label(root, text="校驗位", height=2).grid(column=0, row=3)
12 label_stop_bit = Label(root, text="停止位", height=2).grid(column=0, row=4)

接下來是串口號的combobox的設置,其中serialPortFile.GetCom()是獲取所有串口號的函數,接下來會講解

#串口號
varPort = StringVar()
combo_com = ttk.Combobox(root, textvariable=varPort, width=8, height=2, justify=CENTER)
serial_com = serialPortFile.GetCom()
combo_com['values'] = serial_com
#combo_com.bind("<<ComboboxSelected>>", lambda event: combo1_handler(var=varPort.get()))
combo_com.current(0)
combo_com.grid(column=1, row=0)

 1 #波特率
 2 varBitrate = StringVar()
 3 combo_bps = ttk.Combobox(root, textvariable=varBitrate, width=8, height=2, justify=CENTER)
 4 combo_bps['values'] = ("9600", "19200", "38400", "115200")
 5 #combo_bps.bind("<<ComboboxSelected>>", lambda event: combo2_handler(var=varBitrate.get()))
 6 combo_bps.current(0)
 7 combo_bps.grid(column=1, row=1)
 8 #數據位
 9 combo_byteBit = ttk.Combobox(root, width=8, height=2, justify=CENTER)
10 combo_byteBit['values'] = ("5", "6", "7", "8")
11 combo_byteBit.current(3)
12 combo_byteBit.grid(column=1, row=2)
13 #奇偶校驗
14 combo_parity = ttk.Combobox(root, width=8, height=2, justify=CENTER)
15 combo_parity['values'] = ("N", "O", "E")
16 combo_parity.current(0)
17 combo_parity.grid(column=1, row=3)
18 #停止位
19 combo_stopBit = ttk.Combobox(root, width=8, height=2, justify=CENTER)
20 combo_stopBit['values'] = ("1", "1.5", "2")
21 combo_stopBit.current(0)
22 combo_stopBit.grid(column=1, row=4)
23 serialPortFile.text_rx = Text(root,width=70,height=20)
24 serialPortFile.text_rx.grid(row=0,column=3,rowspan=5)
25 serialPortFile.text_rx.insert(END,'這是一個xutopia用python編寫的串口助手,公眾號:洛水梅家\n')
26 text_tx = Text(root,width=70,height=10)
27 text_tx.grid(row=5,column=3,rowspan=2)
28 text_tx.insert(END,'xutopia 公眾號:洛水梅家,發送數據12345,上山打老虎')
29 button_send = Button(root, text='send', width=18, height=1)
30 button_send.bind("<Button-1>", lambda event: serialPortFile.usart_sent(var=text_tx.get("0.0", "end")))
31 button_send.grid(column=1, row=6)
32 #串口開關按鈕
33 serialPortFile.button_var = StringVar()
34 serialPortFile.button_var.set("打開串口")
35 buttonOpenCom = Button(root, textvariable=serialPortFile.button_var, width=18, height=1)
36 buttonOpenCom.bind("<Button-1>", lambda event: serialPortFile.usart_ctrl(combo_com.get(), combo_bps.get(),combo_parity.get(),combo_stopBit.get(),combo_byteBit.get()))
37 buttonOpenCom.grid(column=1, row=5)

以上就是界面相關的代碼,最終效果也就是上圖顯示的效果,很簡單。接下來介紹python串口的邏輯代碼部分。在另外一個模塊中serialPortFile.py

獲取電腦中所有的串口號的函數,注意這里通過serial.tools.list_ports.comports()獲取所有的串口號之后進行了一步轉換,存在一個數組中,這樣,傳入serial中才能被識別。

 1 # 獲取並存儲串口號到數組
 2 def GetCom():
 3     port_list = list(serial.tools.list_ports.comports())
 4     print(len(port_list))
 5     portcnt = len(port_list)
 6     serial_com = []
 7     for m in range(portcnt):
 8         port_list_1 = list(port_list[m])
 9         serial_com.append(port_list_1[0])
10     return serial_com

串口打開關閉函數,串口打開之后創建了一個線程threading,線程中一直監視串口的狀態,一旦接受到數據,就把數據顯示到接受數據顯示框中。有關python線程threading的內容可以在我的公眾號,洛水梅家中查看。

注意在代碼中加了一個if ser.is_open:的條件判斷,不加入這個條件的話,很有可能重復打開串口而報錯誤。

同時在按鍵Button的狀態也隨着串口的開關狀態而變化。

def usart_ctrl(com, bps,parity_,stopbits_,bytesize_):
    #print(__file__, sys._getframe().f_lineno, port_, bitrate_, var.get())
    global ser, button_var
    if button_var.get() == "打開串口":
        button_var.set("關閉串口")
        ser = serial.Serial(
            port=com,
            baudrate=int(bps),
            parity=parity_,
            timeout=0.2,
            stopbits=float(stopbits_),
            bytesize=int(bytesize_))
        if ser.is_open:
            pass
        else:
            ser.open()
        recv_data = threading.Thread(target=thread_recv)
        recv_data.start()
    else:
        button_var.set("打開串口")
        if ser.is_open:
            ser.close()
        else:
            pass
def usart_sent(var):
    #print(__file__, sys._getframe().f_lineno, "-->", var)
    print(var)
    if ser.is_open:
        ser.write(var.encode("gb2312"))
def thread_recv():
    global text_rx
    while True:
        try:
            read = ser.readall()
            if len(read) > 0:
                print(bytes(read).decode('gb2312'))
                # print(__file__, sys._getframe().f_lineno, "<--", bytes(read).decode('ascii'))
                text_rx.insert(END,bytes(read).decode('gb2312'))
        except Exception as e:
            print(e)
            time.sleep(1)
            pass

上面就是關於串口助手的所有代碼介紹,更多詳細內容,關注公眾號 洛水梅家 免費獲取源碼

后台回復python_com,免費獲取源碼

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM