python讀取串口數據
① linux中python怎麼打開串口
一個Python實現的串口Echo
import serial
import sys
try:
ser = serial.Serial('/dev/ttyUSB0', 9600)
except Exception, e:
print 'open serial failed.'
exit(1)
print 'A Serial Echo Is Running...'
while True:
# echo
s = ser.read()
ser.write(s)
# write to stdout and flush it
sys.stdout.write(s)
sys.stdout.flush()
② stm32用串口上傳數據我怎麼用Python讀取
可以使用串口模塊serial讀取
③ 如何用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.WriteText(u'打開通訊埠\r\n');
if not self.log is None:
self.log.info(u'打開通訊埠');
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(u'出錯:\r\n %s\r\n' % ex);
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(u'創建接收任務\r\n');
if not self.log is None:
self.log.info(u'創建接收任務');
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(u'通訊埠未打開\r\n');
if not self.log is None:
self.log.info(u'通訊埠未打開');
return False;
def InitHead(self):
#串口的其它的一些處理
try:
time.sleep(3);
if not self.output is None:
self.output.WriteText(u'數據接收任務開始連接網路\r\n');
if not self.log is None:
self.log.info(u'數據接收任務開始連接網路');
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(u'出錯:\r\n %s\r\n' % ex);
if not self.log is None:
self.log.error(u'%s' % ex);
self.SetStopEvent();
return;
if not self.output is None:
self.output.WriteText(u'開始接收數據\r\n');
if not self.log is None:
self.log.info(u'開始接收數據');
self.output.WriteText(u'===================================\r\n');
def SendData(self, i_msg):
lmsg = '';
isOK = False;
if isinstance(i_msg, unicode):
lmsg = i_msg.encode('gb18030');
else:
lmsg = i_msg;
try:
#發送數據到相應的處理組件
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(u'關閉通迅埠:[%d] \r\n' % self.port);
if not self.log is None:
self.log.info(u'關閉通迅埠:[%d]' % self.port);
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怎麼讀取串口AT命令的返回值
安裝一個pyseries包。 然後找一個AT標準的命令集。似乎有人封裝好了。我以前見過。
然後剩下的事情就超 簡單了。 測試通過就可以用。
好象以前是用這個做運維時,給運維人員發簡訊用的。這個功能十幾年前就成熟了。現在都應該 有現成的python模塊。
⑥ 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!'
⑦ python獲取串口設備的描述
importwinreg
key=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"{36FC9E60-C465-11CF-8056-444553540000}")
foriinrange(winreg.QueryInfoKey(key)[0]):
subkey=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,"SYSTEM\ControlSet001\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}\"+winreg.EnumKey(key,i))
print(winreg.QueryValueEx(subkey,'DriverDesc'))
winreg.CloseKey(subkey)
winreg.CloseKey(key)
importwinreg
key=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"")
try:
i=0
while1:
name,value,type=winreg.EnumValue(key,i)
print(repr(name),value)
i+=1
value,type=winreg.QueryValueEx(key,"EnableAutoTray")
exceptFileNotFoundError:
exceptOSError:
以前回答過一個,好像跟你說的意思差不多,都是讀取注冊表,一個讀USB,一個是串口
⑧ 樹莓派用python解析串口明文數據並分割問題,python大神請進!
你好,我也在研究將arino的數據傳給樹莓派保存並顯示的項目,為什麼你不用網口互聯呢?