http://www.douban.com/group/topic/7400483/
如何用python写个串口通信的程序?
2009-07-26 16:08:18 来自: 如影随形(但行好事,莫问前程)
用tKinter做界面
-
-
-
2009-07-26 17:18:53 如影随形 (但行好事,莫问前程)
搜狐博客 > 一二三事 > 日志 2007-07-05 | python 串口通信 标签: python 串口 Jeffu:
我用的是“线程轮寻”方式。
就是打开串口后,启动一个线程来监听串口数据的进入,有数据时,就做数据的处理(也可以发送一个事件,并携带接收到的数据)。
我没有用到串口处理太深的东西。
客户的原程序不能给你,不过我给你改一下吧。
里面的一些东西,已经经过了处理,要运行,可能你要自己改一下,把没有用的东西去掉。
我这里已经没有串口设备了,不能调了,你自己处理一下吧,不过基本的东西已经有了。
=================================================================
#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;
-
2009-07-26 17:20:45 如影随形 (但行好事,莫问前程)
这是个Tkinter界面,能不能把他们两个做个拼盘,
# -*- coding: utf-8 -*-
from Tkinter import *
import Tkinter
from tkMessageBox import *
class EntryDemo(Frame):
def __init__(self,parent):
Frame.__init__(self)
self.pack(expand=YES,fill=BOTH)
self.master.title("串口通信")
self.frame1=Frame(self)
self.frame1.pack(pady=5)
self.text1=Entry(self.frame1,name="显示")
self.text1.bind("<Return>",self.showContents)
self.text1.pack(side=LEFT,padx=5)
self.frame2=Frame(self)
self.frame2.pack(pady=5)
self.text2=Entry(self.frame2,name="显示")
self.text2.bind("<Return>",self.showContents)
self.text2.pack(side=LEFT,padx=5)
self.sendButton = Button(self.frame1, text="发送", command = self.pressedPlain)
self.sendButton.pack(side=LEFT, padx =5)
def showContents(self, event):
theName=event.widget.winfo_name()
theContents=event.widget.get()
showinfo("Message", theName +":"+ theContents)
def pressedPlain(self):
showinfo("Message","数据")
def main():
root = Tkinter.Tk()
widget = EntryDemo(root)
root.mainloop()
if __name__=="__main__":
main()
-
2009-07-26 19:40:14 如影随形 (但行好事,莫问前程)
我下载了pyserial,解压开有example, serials,把serial文件夹里的.py文件拷贝到python安装目录下的lib文件家里面吗?
分享到:
相关推荐
这是基于串口通信的python源程序,亲自调试没有问题。将自己PC通过串口连接其他PC或者兼容串口通信的设备或者传感器,可以读取到对方发送的数据。注意第一次发送的cmd地址指令集中的数据要符合自己的报文通信格式。
利用python开发上位机,用于串口通信,将串口通信访问到的数据,并将数据以表格和波形的形式显示出来,注释清晰,对小白相当友好,文件夹中,main.py为主函数,MyWindow.py存放按键响应,串口通信等等各个控件的子...
总之,这个基于Python的串口调试助手提供了一种简单易用的方式来测试和调试串行通信,对于学习串口通信、开发硬件设备或物联网项目的人来说,是一个非常有价值的工具。提供的源代码和DLL文件则进一步增强了其实用性...
在本文中,我们将深入探讨Python的串口通信库PySerial以及如何使用它来创建串口调试工具。 PySerial是Python的一个扩展模块,专门用于处理串行通信。它提供了丰富的功能,如打开和关闭串口、发送和接收数据、设置...
本项目“python串口接收源码可以实时绘图”结合了这两个工具,旨在实现串口数据接收并实时可视化显示。 项目的核心是通过Python的`pyserial`库来处理串口通信。`pyserial`库提供了一系列API,使得开发者可以方便地...
总结来说,Python实现RFID串口数据读取涉及的关键点是使用pyserial模块进行串口通信,初始化串口参数,以及正确地读取和处理RFID数据。在实际应用中,可能还需要考虑到数据的解析、错误处理、实时性等问题,以适应...
3. **编写通信程序**:在树莓派上,你可以编写一个Python程序,使用`serial`库(也称为pySerial)来读写串口。而在STM32端,你需要编写C/C++代码,使用STM32的HAL或LL库的串口发送和接收函数。 4. **测试通信**:...
本文将详细介绍三菱FX3U PLC与串口调试助手进行串口通信的配置步骤、特殊寄存器使用、指令说明及示例程序,从而为初学者和非专业人士提供指导。 ### 通信准备与配置 在进行串口通信之前,首先需要准备相应的硬件...
此资源提供的串口通信程序可能是用编程语言(如C、C++或Python)编写的,具有发送和接收数据的功能。用户可以通过这个程序学习如何设置串口参数,如何打开和关闭串口,以及如何处理数据传输。调试软件则可能提供图形...
通过这个程序,开发者可以学习到如何使用Python的PySide库创建GUI,以及如何结合`pyserial`库进行串口通信。同时,对于需要开发类似串口应用的人来说,这个软件提供了一个很好的起点,他们可以在此基础上修改和扩展...
本文将详细解析使用Python进行串口通信的上位机应用开发,结合给定的标签"python pyside2 pyserial",我们可以看到这个项目涉及到的技术栈。 首先,`Python`是一种高级编程语言,以其简洁的语法和丰富的库资源深受...
本文将深入探讨如何使用Python进行串口通信,并结合SeriousMM6工具,构建一个简易的串口通信系统。 串口通信,又称串行通信,是一种数据传输方式,它将数据逐位按顺序进行传输。在Python中,我们通常使用`pySerial`...
本文将详细介绍如何使用.NET调用Python脚本来实现串口通信,并探讨涉及的关键技术点。 首先,我们要了解.NET调用Python的基础:IronPython。IronPython是一个开源的.NET实现,它允许.NET应用程序直接运行Python代码...
这样的方法适合初学者快速上手Python串口编程,同时也为更复杂的项目提供了基础。随着技能的提升,开发者还可以进一步完善GUI界面,添加错误处理机制,以及支持更多高级功能,如波特率动态调整、多种设备连接管理等...
python串口通信,读取文件内容并通过串口传输至接收程序。
1. **Python串口通信**:Python提供了`pyserial`库来处理串口通信。通过创建`Serial`对象,设置波特率、校验位、数据位和停止位等参数,可以打开串口并与连接的设备进行数据交换。例如,`ser = serial.Serial(port='...
Python有许多库可以实现串口通信,例如`pyserial`,它是Python中广泛使用的串口通信库。通过`pyserial`,我们可以打开、配置(如设置波特率、数据位、停止位等)和读写串口。在这个工具中,它能自动检测串口端口的...
在标题“CKTH.rar_串口通信_串口通信程序_读取串口”中,我们可以推测这是一个关于串口通信的程序资源包,包含了实现串口读取功能的代码或工具。描述指出,这个程序模块简单高效,适用于直接集成到其他项目中进行...