python模擬串口(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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:21
下一篇 2024-12-12 12:21

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論