本文目錄一覽:
- 1、如何用python寫個串口通信的程序?
- 2、如何用python實現串口通信
- 3、如何用串口工具模擬器向python發送數據
- 4、Python如何進行多串口通信?一個串口控制電機 一個串口採集數據?
如何用python寫個串口通信的程序?
打開串口後啟動一個線程來監聽串口數據的進入,有數據時,就做數據的處理。
用python寫串口通信程序的示例:
#coding=gb18030
import sys,threading,time;
import serial;
import binascii,encodings;
import re;
import socket;
class ReadThread:
def __init__(self, Output=None, Port=0, Log=None, i_FirstMethod=True):
self.l_serial = None;
self.alive = False;
self.waitEnd = None;
self.bFirstMethod = i_FirstMethod;
self.sendport = ”;
self.log = Log;
self.output = Output;
self.port = Port;
self.re_num = None;
def waiting(self):
if not self.waitEnd is None:
self.waitEnd.wait();
def SetStopEvent(self):
if not self.waitEnd is None:
self.waitEnd.set();
self.alive = False;
self.stop();
def start(self):
self.l_serial = serial.Serial();
self.l_serial.port = self.port;
self.l_serial.baudrate = 9600;
self.l_serial.timeout = 2;
self.re_num = re.compile(‘\d’);
try:
if not self.output is None:
self.output.WriteTex;
if not self.log is None:
self.log.info;
self.l_serial.open();
except Exception, ex:
if self.l_serial.isOpen():
self.l_serial.close();
self.l_serial = None;
if not self.output is None:
self.output.WriteText;
if not self.log is None:
self.log.error(u’%s’ % ex);
return False;
if self.l_serial.isOpen():
if not self.output is None:
self.output.WriteText;
if not self.log is None:
self.log.info;
self.waitEnd = threading.Event();
self.alive = True;
self.thread_read = None;
self.thread_read = threading.Thread(target=self.FirstReader);
self.thread_read.setDaemon(1);
self.thread_read.start();
return True;
else:
if not self.output is None:
self.output.WriteText;
if not self.log is None:
self.log.info;
return False;
def InitHead(self):
try:
time.sleep(3);
if not self.output is None:
self.output.WriteText;
if not self.log is None:
self.log.info;
self.l_serial.flushInput();
self.l_serial.write(‘\x11’);
data1 = self.l_serial.read(1024);
except ValueError,ex:
if not self.output is None:
self.output.WriteText;
if not self.log is None:
self.log.error(u’%s’ % ex);
self.SetStopEvent();
return;
if not self.output is None:
self.output.WriteText;
if not self.log is None:
self.log.info;
self.output.WriteText(u’===================================\r\n’);
def SendData(self, i_msg):
lmsg = ”;
isOK = False;
if isinstance(i_msg, unicode):
lmsg = i_msg.encode(‘gb18030’);
lmsg = i_msg;
pass
except Exception, ex:
pass;
return isOK;
def FirstReader(self):
data1 = ”;
isQuanJiao = True;
isFirstMethod = True;
isEnd = True;
readCount = 0;
saveCount = 0;
RepPos = 0;
#read Head Infor content
self.InitHead();
while self.alive:
try:
data = ”;
n = self.l_serial.inWaiting();
if n:
data = data + self.l_serial.read(n);
#print binascii.b2a_hex(data),
for l in xrange(len(data)):
if ord(data[l])==0x8E:
isQuanJiao = True;
continue;
if ord(data[l])==0x8F:
isQuanJiao = False;
continue;
if ord(data[l]) == 0x80 or ord(data[l]) == 0x00:
if len(data1)10:
if not self.re_num.search(data1,1) is None:
saveCount = saveCount + 1;
if RepPos==0:
RepPos = self.output.GetInsertionPoint();
self.output.Remove(RepPos,self.output.GetLastPosition());
self.SendData(data1);
data1 = ”;
continue;
except Exception, ex:
if not self.log is None:
self.log.error(u’%s’ % ex);
self.waitEnd.set();
self.alive = False;
def stop(self):
self.alive = False;
self.thread_read.join();
if self.l_serial.isOpen():
self.l_serial.close();
if not self.output is None:
self.output.WriteText;
if not self.log is None:
self.log.info;
def printHex(self, s):
s1 = binascii.b2a_hex(s);
print s1;
if __name__ == ‘__main__’:
rt = ReadThread();
f = open(“sendport.cfg”, “r”)
rt.sendport = f.read()
f.close()
try:
if rt.start():
rt.waiting();
rt.stop();
else:
pass;
except Exception,se:
print str(se);
if rt.alive:
rt.stop();
print ‘End OK .’;
del rt;
如何用python實現串口通信
Python非常適合寫一些測試的腳本,如快速的串口通信測試等。如果使用VC++ QT開發,可能用時較多,使用python,如果掌握使用方法,可以直接讀寫測試,配合設備或是串口助手,很快驗證與實現。
Python有沒有現成的串口API直接調用呢?經過實踐驗證,需要安裝一個叫 Pyserial的組件即可。這個可以在github上下載。
在windows 7 64bit 上可以使用嗎?當然可以使用,我安裝的python3.5為64位的。把下載後的文件,其中有一個serial的文件夾,拷貝到python35安裝路徑, C:\Python35\Lib\site-packages\serial
網上可以搜一下windows的安裝包,安裝完也是:C:\Python35\Lib\site-packages\serial ,可以用最新的版本,替換即可。
測試的方法:在python IDE里測試:
import serial
這裡如果報錯,是python版本與pyserial版本沒有配合好。如果正常,不返回,即可以導入serial模塊。
ser=serial.Serial(“COM5”,115200)
這裡為COM5,115200的波特率。如果打不開,請檢查安裝環境。
ser.write(‘hello,serial test’.encode())
17
發送測試(如果返回字節數,說明返回成功),這裡需要轉換一個編碼為字節。
以上測試,可以使用現在的設備或是串口助手,如安裝Virtual Serial Port Driver 7.2 虛擬串口軟件,設置一對串口,進行自發自收的測試。
print(ser.readline())
b’abcdefg\r\n’
這裡是串口接收,有接收的超時。設備或是串口助手發送一個字符串,以回車換行結束,這裡就可以收到打印出來。
也可以用ser.read(),這裡只接收一個字符來實現。
上面已經實現了基本的串口操作。
關閉串口為:
ser.close()
如果使用python,一般寫個py文件,就像windows bat 批處理一樣,這是python強大的地方。如果寫一個py腳本呢?其實只要把上面的命令,一條條寫下來,就是一個腳本,測試如下:
import serialser=serial.Serial(“COM5”,115200,timeout=0.5)for i in range(0,100-1):ser.write(‘hello\r\n’.encode())print(ser.readline());ser.close()
如何用串口工具模擬器向python發送數據
串口模塊的波特率比較特別,找了幾個串口工具都不支持。。。所以,乾脆用python自己來寫了,其實已經好奇好久了,別人的工具各種不順手。
需要pyserial的支持,兼容各種平台,不需要新編譯二進制文件。
先貼一個定時發送的代碼:
import serial
import time
ser = serial.Serial(‘/dev/ttyUSB0’, 250000, timeout=1)
print ser.isOpen()
words=”gggggggggggggggg”
while (1):
print “send 256x\””+words+”\” to remotes”
startTime = time.time()
times = 256
while (times):
times -= 1
s = ser.write(words)
endTime = time.time()
print “use time: “+str(endTime-startTime)
print “”
time.sleep(5)
ser.close()
Python如何進行多串口通信?一個串口控制電機 一個串口採集數據?
下載 pyserial包
def OpenCom(self,*args): #設置端口和波特率 selComPort =‘com2’ #波特率 selBaudRate =9600 #奇偶校驗 selParity = ‘N’ try: if(not self.mySerial): self.mySerial = serial.Serial(port=selComPort, baudrate=selBaudRate,bytesize=8,parity=selParity,stopbits=1,timeout=5) else: if(self.mySerial.isOpen()): self.mySerial.close() self.mySerial = serial.Serial(port=selComPort, baudrate=selBaudRate, bytesize=8, parity=selParity, stopbits=1, timeout=5) self.lblInfo[‘text’] = ‘打開成功!’ except Exception as ex: self.lblInfo[‘text’] = ‘打開失敗!’
#使用com口發送modbus協議給終端設備。
def btnEmId_Click(self):
barray = bytearray([0x05, 0x03, 0xA#, 0x54, 0x00, 0x08])
vOldEmId = self.txbOldEmId.get()
vNewEmId = self.txbNewEmId.get()
barray[0] = int(vOldEmId)
barray[5] = int(vNewEmId)
#crc校驗
strInput = utils.crc16_append(barray)
print(barray)
n = self.mySerial.write(barray)
if(n 0):
str = self.mySerial.readall()
self.lblInfo[‘text’] = ‘success!’
# for s in str:
# print (hex(s))
else:
self.lblInfo[‘text’] = ‘error!’
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/240377.html