python的串口close()函数关闭不成功

作者&投稿:那饰 (若有异议请与网页底部的电邮联系)
python 如何防止串口通信失败~

Python中串口出现异常通常有:1.打开串口时,串口不存在,2.写串口时,3.读串口时。这几个异常是经常会碰到的(有经验的人就深有体会),一旦异常出现了,整个程序很可能会因此就运行不下去了。避免因为这些异常的出现而导致程序死机的方法是对这些可能存在的异常进行捕捉。举一个例子:
try:
ComDev.read(1)
print "read Com ok!"
except:
print "read Com error!"
上面的代码意思是:对ComDev这个串口对象读取一个字节,如果读成功,就接着执行print "read Com ok!"而不执行except以下的语句,如果读出现异常,就执行print "read Com error"而不执行
print "read Com ok!"
当然系统还会抛出异常信息,只是我这里没有进行接收,个人觉得很多异常不必接收其信息。

没有对齐啊。你要再打一次回车,空行出来后,循环开始执行,等它执行完成后,你再输入f.close()

这个原因是因为在交互式环境特殊的约定。如果你没有打一个空行出去,它认为你循环没有结束,你再输入语句都在循环体里面,而又没有对齐。自然 就错了。

用ser.isOpen()查看返回False,说明ser.close()起作用了啊。用管理员身份打开cmd,再执行脚本试试?

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获取串口设备的描述
key, i) print(repr(name), value) i += 1 value, type = winreg.QueryValueEx(key, "EnableAutoTray")except FileNotFoundError: printexcept OSError: print以前回答过一个,好像跟你说的意思差不多,都是读取注册表,一个读USB,一个是串口 ...

Python Serial 串口能不能发送16进制的数字
pyserial默认的写入格式是字符串,并不是16进制的。接收到的也是字符串,除非你在接收端设置了默认接受hex格式,就会显示hex。我用过蓝牙串口和Arduino开发板的串口,收到的都是字符串。

python串口通讯一段时间后卡死
数据传输延迟、缓冲区溢出、串口资源冲突。1、数据传输延迟:当从串口接收大量数据时,Python处理数据阻塞,导致程序卡死,应使用非阻塞模式来处理数据接收。2、缓冲区溢出:串口数据的接收速率超过了Python程序的读取速率,缓冲区会溢出。可以增加缓冲区大小或使用更快的读取速率来避免缓冲区溢出。3、串口资源...

Python对microbit串口拒绝访问
可能是与串口软件冲突,解决方法如下:1、添加控件,通过菜单Project→AddtoProject→ComponentsandControl插入即可,再将该控件从工具箱中拉到对话框中。2、在窗口上添加一个串口控件,随便放一个位置,此控件是不可见的。3、为控件添加变量m_com为后面操作做准备,如果不添加变量也可以用GetDlgItem函数获取...

如何用python实现串口通信
Python有没有现成的串口API直接调用呢?经过实践验证,需要安装一个叫 Pyserial的组件即可。这个可以在github上下载。在windows 7 64bit 上可以使用吗?当然可以使用,我安装的python3.5为64位的。把下载后的文件,其中有一个serial的文件夹,拷贝到python35安装路径, C:\\Python35\\Lib\\site-packages\\...

用Python控制串口连接的ESP8266无线芯片,如何操作
1、确定一下串口没问题(可以尝试用其他编程语言操作)2、看下下面博客,试试能不能解决问题。http:\/\/cache.baiducontent.com\/c?m=9f65cb4a8c8507ed4fece763105392230e54f73260878e482a958448e435061e5a24b8ec713f5219d5c6796005a94a4bea876c34685d34f2c688de459ff0d47272d43034015dd101498047b8cb...

串口助手可以打开串口,为啥python程序打不开
缺少串口访问权限,串口被其他程序占用等。1、在某些操作系统中,访问串口需要管理员权限或特定的用户组权限。Python程序没有足够的权限来访问串口,会导致无法打开串口。确保以管理员身份运行Python程序或具有足够的权限来访问串口。2、其他程序(串口助手)正在使用串口,Python程序无法打开串口。确保其他程序...

树莓派基础实验37:pyserial模块通信实验
通过之前的实验,我们已了解如何利用串口对树莓派进行控制台控制,并设置树莓派的串口与PC电脑的串口调试工具进行通信。本实验将深入学习如何使用Python的pyserial模块,通过串口与PC电脑进行数据通信。实验所需设备包括:Raspberry Pi 3 B+主板1块、树莓派电源1个、USB TO TTL模块1个、面包板(可选)、...

python 如何防止串口通信失败
Python中串口出现异常通常有:1.打开串口时,串口不存在,2.写串口时,3.读串口时。这几个异常是经常会碰到的(有经验的人就深有体会),一旦异常出现了,整个程序很可能会因此就运行不下去了。避免因为这些异常的出现而导致程序死机的方法是对这些可能存在的异常进行捕捉。举一个例子:try:ComDev.read...

串口发送16进制1234,用python接收的是'\\x01\\x01\\x03\\x04'但用python再...
1、首先要引用Python的第三方库:serial,打开pycharm。2、点击file,里面有一个setting。进入setting后点击“progect”下的Project Interpreter,如图。3、然后在页面中,点击右边的加号,如图。4、然后在左上角的搜索框搜索pyserial并选中pyserial,如图。5、最后点击Install Package,然后等上一会就好了。

包头市18743391328: python的串口close()函数关闭不成功 -
谷侧中孚: python 对串口的操作 我用的是“线程轮寻”方式. 就是打开串口后,启动一个线程来监听串口数据的进入,有数据时,就做数据的处理(也可以发送一个事件,并携带接收到的数据). 我没有用到串口处理太深的东西. 客户的原程序不能给你...

包头市18743391328: Python使用pyserial模块如何向串口输入ctrl+c?,
谷侧中孚: ctrl+C得Ascii码-->316进制-->0X03 所以你用pyserial写个0x03就行了,就相当于发了个ctrl+c

包头市18743391328: python 如何防止串口通信失败 -
谷侧中孚: Python中串口出现异常通常有:1.打开串口时,串口不存在,2.写串口时,3.读串口时.这几个异常是经常会碰到的(有经验的人就深有体会),一旦异常出现了,整个程序很可能会因此就运行不下去了.避免因为这些异常的出现而导致程序死...

包头市18743391328: 如何用python写个串口通信的程序 -
谷侧中孚: 打开串口后启动一个线程来监听串口数据的进入,7a64e4b893e5b19e31333365646238有数据时,就做数据的处理. 用python写串口通信程序的示例:#coding=gb18030 import sys,threading,time; import serial; import binascii,encodings; import...

包头市18743391328: python中close的用法,为什么会出现attributeerror 'str' object has on attribute 'close' -
谷侧中孚: to_file是个str类型,你想要实现得这样: f = open(to_file, 'w') f.close()

包头市18743391328: 如何调用python设计语言中有关串口模块serial -
谷侧中孚: >>> import serial >>> ser = serial.Serial(0) #开启串口0 >>> ser.write("\xAA") #写十六进制AA >>> ser.close() #关闭串口

包头市18743391328: python中涉及到文件的程序,为什么close函数是必须的 -
谷侧中孚: close方法是显式关闭文件.如果使用with ... as语法是可以不需要使用close的.

包头市18743391328: python中 .flush()与.close()有什么区别 -
谷侧中孚: flush():将缓冲区的数据刷到目的地中后,流可以使用.close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源.这个动作一定做.

包头市18743391328: 网络编程中close函数和shutdown函数的区别 -
谷侧中孚: close与shutdown的区别主要表现在:close函数会关闭套接字ID,如果有其他的进程共享着这个套接字,那么它仍然是打开的,这个连接仍然可以用来读和写,并且有时候这是非常重要的 ,特别是对于多进程并发服务器来说.而shutdown会切断进程共享的套接字的所有连接,不管这个套接字的引用计数是否为零,那些试图读得进程将会接收到EOF标识,那些试图写的进程将会检测到SIGPIPE信号,同时可利用shutdown的第二个参数选择断连的方式.

包头市18743391328: 有没有python的串口库 -
谷侧中孚: 串口模块的波特率比较特别,找了几个串口工具都不支持...所以,干脆用python自己来写了,其实已经好奇好久了,别人的工具各种不顺手.需要pyserial的支持,兼容各种平台,不需要新编译二进制文件.先贴一个定时发送的代码:import...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网