前言
成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、錦江網(wǎng)絡(luò)推廣、微信小程序開發(fā)、錦江網(wǎng)絡(luò)營銷、錦江企業(yè)策劃、錦江品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供錦江建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.comPython串口通信有多種方式,本文是基于基于pyserial實(shí)現(xiàn)的。首先安裝pyserial依賴庫,了解常用的方法函數(shù),認(rèn)識Serial參數(shù)說明;然后電腦查看可用的端口,舉個簡單示例:能自動檢測串口,并連接此串口,收集串口的數(shù)據(jù);最后查看運(yùn)行效果。
安裝pyserial
pip install pyserial
查看可用的端口
# coding:utf-8 import serial.tools.list_ports plist = list(serial.tools.list_ports.comports()) if len(plist) <= 0: print("沒有發(fā)現(xiàn)端口!") else: plist_0 = list(plist[0]) serialName = plist_0[0] serialFd = serial.Serial(serialName, 9600, timeout=60) print("可用端口名>>>", serialFd.name)
運(yùn)行結(jié)果:
注:在pyCharm環(huán)境下運(yùn)行的,在電腦串口上有一個采集的傳感器(通過串口連接到電腦)
常用的方法函數(shù) 導(dǎo)入串口模塊import serial;打開串口ser = serial.Serial(端口名稱,...其他參數(shù)), ser.open()方法可以在close之后再次打開相應(yīng)端口;關(guān)閉串口ser.close();通過串口寫入ser.write(b\'\'),參數(shù)需要使用字節(jié)bytes類型,如果是str類型,則可以使用encode(\'utf-8\')的方式進(jìn)行轉(zhuǎn)換;讀取模塊信息的方法如下:
-> x= ser.read()讀取一個字節(jié),x=read(n)讀取n個字節(jié),readline()可以用來讀取一行。 查看COM口工
python -m serial.tools.list_ports -v,可以列出所有串口名稱及屬性。
Serial參數(shù)說明
port端口名字,windows下為\'COM1\'等;
baudrate (int)波特率,可以設(shè)置的范圍9600到115200;
bytesize為每個字節(jié)的比特?cái)?shù),設(shè)置值為FIVEBITS, SIXBITS,SEVENBITS, EIGHTBITS 5-8比特;
parity設(shè)置校驗(yàn)位PARITY_NONE, PARITY_EVEN,PARITY_ODD PARITY_MARK,PARITY_SPACE,用來設(shè)置校驗(yàn)位;stopbits停止位,用來指示字節(jié)完成,可以選擇的設(shè)置STOPBITS_ONE,STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO;write_timeout(float) 寫入超時設(shè)置;
timeout (float)讀出超時設(shè)置;xonxoff (bool)軟件流控開關(guān);
rtscts (bool)硬件RTS/CTS流控開關(guān);
dsrdtr (bool)硬件DSR/DTR流控開關(guān)。
關(guān)于UART流控兩線方式?jīng)]有硬件流控,四線方式采用DSR、DTR進(jìn)行流控,而RS232標(biāo)準(zhǔn)中可以有DSR、DTR的流控方式。RTS-request to send; CTS- clear to send;DSR-data set ready;DTR-Data Terminal Ready。
一個簡單示例:能自動檢測串口,并連接此串口,收集串口的數(shù)據(jù)
#!usr/bin/python3.6 import serial import sys import os import time import re global MAX_LOOP_NUM global newCmd MAX_LOOP_NUM = 10 def waitForCmdOKRsp(): maxloopNum = 0 while True: line = ser.readline() maxloopNum = maxloopNum + 1 try: print("Rsponse : %s"%line.decode(\'utf-8\')) except: pass if ( re.search(b\'OK\',line)): break elif(maxloopNum > MAX_LOOP_NUM): sys.exit(0) def sendAT_Cmd(serInstance,atCmdStr,waitforOk): print("Command: %s"%atCmdStr) serInstance.write(atCmdStr.encode(\'utf-8\')) #or define b\'string\',bytes should be used not str if(waitforOk == 1): waitForCmdOKRsp() else: waitForCmdRsp() ser = serial.Serial("COM5",9600,timeout=30) sendAT_Cmd(ser,\'AT+CFUN=1\\r\',1) ser.close()
綜合上面的兩個代碼,能自動檢測串口,并連接此串口,收集串口的數(shù)據(jù)
# !usr/bin/python3.6 import serial import sys import os import time import re import serial.tools.list_ports global MAX_LOOP_NUM global newCmd MAX_LOOP_NUM = 10 def waitForCmdOKRsp(): maxloopNum = 0 while True: line = ser.readline() #讀取一行數(shù)據(jù) maxloopNum = maxloopNum + 1 #計(jì)算讀取長度 try: print("Rsponse : %s" % line.decode(\'utf-8\')) #串口接收到數(shù)據(jù),然后顯示 except: pass if (re.search(b\'OK\', line)): break elif (maxloopNum > MAX_LOOP_NUM): sys.exit(0) def sendAT_Cmd(serInstance, atCmdStr, waitforOk): # print("Command: %s" % atCmdStr) serInstance.write(atCmdStr.encode(\'utf-8\')) # atCmdStr 波特率 # or define b\'string\',bytes should be used not str if (waitforOk == 1): waitForCmdOKRsp() else: waitForCmdRsp() plist = list(serial.tools.list_ports.comports()) if len(plist) <= 0: print("沒有發(fā)現(xiàn)端口!") else: plist_0 = list(plist[0]) serialName = plist_0[0] #先自動檢測串口, 檢測到可用串口,取出串口名 #ser = serial.Serial("COM6", 115200, timeout=30) ser = serial.Serial(serialName, 115200, timeout=30) # timeout=30 30s print("可用端口名>>>", ser.name) sendAT_Cmd(ser, \'AT+CFUN=1\\r\', 1) ser.close()
運(yùn)行效果:
我用CC2530(Zigbee),采集了溫度、濕度的數(shù)據(jù),通過串口和電腦連接,運(yùn)行此程序后,能自動檢測到串口,然后獲取 CC2530的數(shù)據(jù),然后顯示在電腦端。
希望對你有幫助。