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打开串口失败_python 如何防止串口通信失败?相关推荐

  1. python 打开文件夹_python打开目录

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python dirtree.py e:programmingpythonapp ...

  2. micropython 串口中断_python读取uart串口

    怎么通过UA串口接收多个字符? 希望功能:在这里小编想通过上位机向单片机发送2835,并通过串口返回,而每接收一个字符,单片机就会UA中断,在中断过程中,你把读取的那个SBUF字符,全部赋值给RxdD ...

  3. python打开方式包括_python打开文件的方式有哪些

    python下打开文件超级简单,不用导入任何包,直接输入 f =open('your_file.txt','r') 就可以打开一个文件进行操作.第二个参数为对文件的操作方式,'w'是写文件,已存在的同 ...

  4. python打开.mat文件_python怎么打开mat文件?

    在编程中,使用.mat文件可以连同数据的变量名一同保存下来,在程序调试的过程中十分方便,并且不需要控制数据的存储格式,matlab会自动保存并区分我们所存储的内容.那你知道如何使用python打开.m ...

  5. python进程间通信时间开销_python 进程间的通信

    python3,进程间的通信 本文来源于python 3.5版本的官方文档 multiprocessing模块为进程间通信提供了两种方法: 1.进程队列queue The Queue class is ...

  6. python 打开targz文件_Python下使用pandas打开excel文件并进行处理

    单位有较多账户报表,经常要知道哪些账户的金额是多少. 最近python很火,感觉可以搞一下,但是0基础,自己摸索,著文以记之. 安装python.安装最新版,可以多活一段时间,什么都选择默认就好. 安 ...

  7. python打开文件对话框_python实战演练:如何通过对话框打开文件并对文件进行对比...

    python是目前最受欢迎的脚本语言之一,在很多简单功能实现中,python就有不可替代的优势,下面是针对本人遇到的一个小问题而写的一个python脚本,代码中含有注释,这里由于浏览器本身的格式原因, ...

  8. python打开autocad软件_python 使用pyautocad操作AutoCAD

    一.python 连接AutoCAD的两种基本方法 1.使用pyautocad from pyautocad import Autocad pyacad = Autocad(create_if_not ...

  9. python打开jpg照片_python打开图像

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python有很多库可以进行图像文件的读写,比如图像处理包pillow,科学绘图 ...

最新文章

  1. [optee]-optee中的异常向量表的实现
  2. 【bzoj3280】小R的烦恼 费用流
  3. 信息学奥赛一本通C++语言——1093:计算多项式的值
  4. redis源码剖析(7):基础数据结构quicklist
  5. 步进电机驱动器单片机控制电路
  6. 【数学建模之Python】13.手撕抛物型方程的差分解法(如一维热传导方程)
  7. win7计算机里的桌面不见了怎么办,win7桌面图标不见了怎么办,教您解决win7桌面图标不见了...
  8. 六大排序算法:插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序
  9. echarts去除网格线_echarts实现去掉X轴、Y轴和网格线效果实例分享
  10. 【Django | 开发】面试招聘网站(增加csv,excel导出企业域账号集成日志管理功能)
  11. Web前端作业:Html+JS实现的图片镜像、黑白、红色、绿色、蓝色及还原
  12. SQL在MySQL中是如何执行的
  13. 打不开win10自带计算器和防火墙、应用商店闪退及误删等问题解决
  14. 基于二维码的设备巡检系统相关技术
  15. 百万级深空天体数据库获取
  16. 【Java】Log4j日志
  17. 三星Samsung手机平板安装Google Play商店,安装谷歌服务框架,解决闪退奔溃GMS
  18. 旅游指南之十四----西藏风土人情
  19. 仓储服务-领取采购单
  20. 【环境部署】华为云ECS安装MySQL

热门文章

  1. Linux 命令之 ps -- 显示进程状态/查看进程信息
  2. 腾讯为什么不开发linux软件下载,你认为国产操作系统如何搭建生态?为什么腾讯不给Linux系统适配QQ?...
  3. 基于自定义Mybatis框架实现数据库操作
  4. oracle system用户创建job 其他用户,oracle创建表空间、用户和表以及sys和system的区别...
  5. layui按钮展开、_layui可折叠的组织架构树形图
  6. python上一行的代码打错了怎么办_写Python代码过程中碰到各种错误异常要怎么样去处理?...
  7. Python3实现队列
  8. js读取外部json指定字段值完整代码_前端工程化 剖析npm的包管理机制(完整版)...
  9. 网站开发用什么语言好_网站开发教程:企业如何用网站开启在线业务?
  10. 用计算机怎么弹离人愁数字,拇指琴新手入门曲谱——离人愁