-
2020-12-05 06:36:43
2015-04-02 回答
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 Serial串口基本操作(收发数据)
2020-12-05 06:36:551、需要模块以及测试工具模块名:pyserial使用命令下载:python -m pip install pyserial串口调试工具:sscom5.13.1.exe2、导入模块import serial3、打开串口直接通过new一个Serial()的实例即可打开返回实例# ...1、需要模块以及测试工具
模块名:pyserial
使用命令下载:python -m pip install pyserial
串口调试工具:sscom5.13.1.exe
2、导入模块
import serial
3、打开串口
直接通过new一个Serial()的实例即可打开
返回实例
# encoding=utf-8
import serial
if __name__ == '__main__':
com = serial.Serial('COM3', 115200)
print com
运行结果
Serial(port='COM3', baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
4、发送数据
函数名write()
返回值为发送成功的字节数
# encoding=utf-8
import serial
if __name__ == '__main__':
com = serial.Serial('COM3', 115200)
success_bytes = com.write('This is data for test')
print success_bytes
运行结果
21
串口工具界面
5、接收数据(接收固定长度数据)
函数名为read(size=1)
接收size单位的字符,是阻塞的,不接收到就一直等待接收,除非设置了超时时间(未设置该示例)
# encoding=utf-8
import serial
if __name__ == '__main__':
com = serial.Serial('COM3', 115200)
data = com.read(10)
print data
运行结果
123456789a
串口工具界面
6、接收数据(超时时间内一直接收)
函数名为read(size=1)
参数为接收的长度,默认为1,一般传入inWaiting(),它表示监测接收的字符串长度
配合While可以一直接收
# encoding=utf-8
import serial
import time
if __name__ == '__main__':
com = serial.Serial('COM3', 115200)
over_time = 30
start_time = time.time()
while True:
end_time = time.time()
if end_time - start_time < over_time:
data = com.read(com.inWaiting())
data = str(data)
if data != '':
print data
运行结果
111
222
aaa
bbb
1a2b3c4d
串口工具界面
7、封装为类
# -*- encoding=utf-8 -*-
import serial
import time
import WriteLog
class COM:
def __init__(self, port, baud):
self.port = port
self.baud = int(baud)
self.open_com = None
self.log = WriteLog.WriteLog('ITC_LOG.LOG')
self.get_data_flag = True
self.real_time_data = ''
# return real time data form com
def get_real_time_data(self):
return self.real_time_data
def clear_real_time_data(self):
self.real_time_data = ''
# set flag to receive data or not
def set_get_data_flag(self, get_data_flag):
self.get_data_flag = get_data_flag
def open(self):
try:
self.open_com = serial.Serial(self.port, self.baud)
except Exception as e:
self.log.error('Open com fail:{}/{}'.format(self.port, self.baud))
self.log.error('Exception:{}'.format(e))
def close(self):
if self.open_com is not None and self.open_com.isOpen:
self.open_com.close()
def send_data(self, data):
if self.open_com is None:
self.open()
success_bytes = self.open_com.write(data.encode('UTF-8'))
return success_bytes
def get_data(self, over_time=30):
all_data = ''
if self.open_com is None:
self.open()
start_time = time.time()
while True:
end_time = time.time()
if end_time - start_time < over_time and self.get_data_flag:
data = self.open_com.read(self.open_com.inWaiting())
# data = self.open_com.read() # read 1 size
data = str(data)
if data != '':
self.log.info('Get data is:{}'.format(data))
all_data = all_data + data
print data
self.real_time_data = all_data
else:
self.set_get_data_flag(True)
break
return all_data
if __name__ == '__main__':
pass
com = COM('com3', 115200)
# com.open()
print com.send_data('data')
com.get_data(50)
com.close()
8、对于一次函数说明(百度看到,并未测试)
readall():读取全部字符,是阻塞的,除非接收的字符串以EOF结尾或者超出缓冲区,否则函数不会返回。一般要结合超时设置,设置串口的timeout参数
Readline():读取一行,以/n结束,要是没有/n就一直读,阻塞。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持python博客。
-
python控制串口
2021-04-19 22:35:31ctrl(com, bps,parity_,stopbits_,bytesize_): #print(__file__, sys._getframe().f_lineno, port_, bitrate_, var.get()) global ser, button_var if button_var.get() == "打开串口": button_var.set("关闭串口") ...- 获取电脑中所有的串口号的函数
serial_com = serialPortFile.GetCom() # 获取并存储串口号到数组 def GetCom(): port_list = list(serial.tools.list_ports.comports()) #通过serial.tools.list_ports.comports()获取所有的串口号之后进行了一步转换,存在一个数组中 #这样,传入serial中才能被识别 print(len(port_list)) portcnt = len(port_list) serial_com = [] for m in range(portcnt): port_list_1 = list(port_list[m]) serial_com.append(port_list_1[0]) #serialPortFile.GetCom()是获取所有串口号的函数 return serial_com
- 串口打开关闭函数,串口打开之后创建了一个线程threading,线程中一直监视串口的状态,一旦接受到数据,就把数据显示到接受数据显示框中。
def usart_ctrl(com, bps,parity_,stopbits_,bytesize_): #print(__file__, sys._getframe().f_lineno, port_, bitrate_, var.get()) global ser, button_var if button_var.get() == "打开串口": button_var.set("关闭串口") ser = serial.Serial( port=com, baudrate=int(bps), parity=parity_, timeout=0.2, stopbits=float(stopbits_), bytesize=int(bytesize_)) if ser.is_open: pass else: ser.open() recv_data = threading.Thread(target=thread_recv) recv_data.start() else: button_var.set("打开串口") if ser.is_open: ser.close() else: pass
-
python3 实现调用串口功能
2020-12-23 08:45:01python调用串口,写入数据 #!/usr/bin/python3 import serial def serialTest(): try: port = "COM3" bps = 115200 timeO = 5 ser = serial.Serial(port, bps, timeout = timeO) result = ser.write("python ... -
Python串口读写源代码程序+详细注释
2021-07-09 11:39:14python串口读写源代码程序+详细注释 简单的python串口读写介绍 ser serial Serial 0 是打开第一个串口 print ser portstr 能看到第一个串口的标识 windows...ser close 就是关闭ser表示的串口 ser open 会打开这个串口 -
python--禁用、启用串口设备
2022-01-26 12:02:02python禁用并使能串口设备 最近在做一个设备,需要用到单片机的USB虚拟串口,并不是用的CH340之类的转换芯片,而是用的MCU的USB接口与电脑相连。 在调试的过程中,由于要不断的复位和上电,电脑上的串口就总是处于不...python–禁用、启用串口设备
最近的项目,由于通讯数据量较大,将会尝试高速的传输(1MBps),决定采用单片机的USB虚拟串口。并不是用的CH340之类的转换芯片,而是用的MCU的USB接口与电脑相连。
在调试的过程中,由于要不断的复位和上电,电脑上的串口就总是处于不可用的状态,必须将端口禁用,再启用,才能正常工作。而MCU一旦复位,电脑上又得重来一遍。所以就想着将这个动作集成到我的上位机软件中。
获得设备ID
手动获取可以通过设备管理器,在相应设备上右击,设备属性–详细信息–设备实例路径,USB\VID开头的一整串字符就是ID了。
自动获取的代码如下:def get_dev_id(dev="COM1"): wmi = win32com.client.GetObject("winmgmts:") for usb in wmi.InstancesOf("Win32_SerialPort"): if True: if usb.DeviceID == dev: print("\r\n设备信息:", usb.DeviceID, usb.Name, usb.PNPDeviceID) return usb.PNPDeviceID return None
禁用和启用设备
这个简单,调用pnputil即可,以管理员方式运行CMD,并运行
pnputil /disable-device “USB\VID_0483&PID_5740\3251386A3038”
pnputil /enable-device “USB\VID_0483&PID_5740\3251386A3038”os.system("pnputil /disable-device \"USB\\VID_0483&PID_5740\\3251386A3038\"") os.system("pnputil /enable-device \"USB\VID_0483&PID_5740\\3251386A3038\"")
获取管理员权限
集成到python中时,就需要先获取管理员权限,
ctypes.windll.shell32.IsUserAnAdmin()完整代码如下
import ctypes import os import win32com.client # 获取串口的ID def get_dev_id(dev="COM1"): wmi = win32com.client.GetObject("winmgmts:") for usb in wmi.InstancesOf("Win32_SerialPort"): if True: if usb.DeviceID == dev: print("\r\n设备信息:", usb.DeviceID, usb.Name, usb.PNPDeviceID) return usb.PNPDeviceID return None def is_admin(id=""): if ctypes.windll.shell32.IsUserAnAdmin(): # 获取管理员权限 print("以管理员权限运行") # USB\VIDxxxxxxxxxxxxx,设备管理器中--设备属性--详细信息--设备实例路径 # 需要注意特殊字符要用\标注 str = "pnputil /disable-device \"" + id + "\"" os.system(str) # 禁用设备 str = "pnputil /enable-device \"" + id + "\"" os.system(str) # 使能设备 else: print("无管理员权限") if __name__ == "__main__": # run1 = os.system("pnputil /disable-device \"USB\\VID_0483&PID_5740\\3251386A3038\"") # run1 = os.system("pnputil /enable-device \"USB\VID_0483&PID_5740\\3251386A3038\"") com_id = get_dev_id("COM98") # 串口号,见设备管理器 is_admin(com_id)
-
python 操作 串口
2021-11-19 14:28:14一、导入serial模块 参考https://www.jb51.net/article/164455.htm 模块下载地址... 找到serial文件夹,并找到python的安装位置 放入到 site-packages文件夹C:\Users\Administra -
python操作串口
2021-03-14 20:53:45print("---异常---:", e) return ser # 关闭串口 def DColsePort(ser): uart.fdstate = -1 ser.close() # 写数据 def DWritePort(ser, data): result = ser.write(data) # 写数据 logging.info(ser) logging.info... -
python – Pyserial:打开之前如何知道串口是否空闲
2020-12-05 06:36:54我使用Pyserial的python来使用串口,代码如下:import serialportName = 'COM5'ser = serial.Serial(port=portName)# Use the serial port...但是,问题是,如果端口已经打开(例如另一个应用程序),当我尝试打开它时... -
python 按钮点击关闭窗口的实现
2020-09-17 19:09:21主要介绍了python 按钮点击关闭窗口的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
python串口操作
2021-07-12 11:28:029600, timeout=0.2) # 接收返回的信息 while True: recv = ser.readline() print(str(recv)) if str(recv) == 'q': break 方式二:这个是可以关闭串口的 import serial # 连接 ser = serial.Serial() ser.port = '/... -
使用Python读取串口数据
2020-11-18 16:39:06Python读取串口数据使用Python读取串口数据1.面向百度编程2.应用serial库3.编码设计4.编程实现 使用Python读取串口数据 1.面向百度编程 通过百度,定位到可使用Python的serial库进行读写串口数据。接着,开始用pip... -
python中串口通信的步骤及实现
2020-11-18 18:59:09python内置的库函数确实很强大,serial库中包含了串口通信所用到的一些函数。本文用python实现了串口的一种简单通信。 代码实现: import serial#导入串口通信库 from time import sleep ser = serial.Serial() ... -
Python 串口
2019-03-20 15:24:07import serial#导入模块 ser = serial.Serial(串口号,波特率) #打开第一个串口 print ser.portstr 能看到第一个串口的...ser.close() 就是关闭ser表示的串口 ser.open() 会打开这个串口 ser = serial.Serial('COM... -
python串口收发
2020-12-19 16:46:41一、安装串口模块 pip3 install pyserialer 二、串口接口 打开串口,并得到串口对象 ser=serial.Serial(portx,bps,timeout=timex) 发送 result=ser.write(text.encode(“gbk”)) 接收 rcv = ser.read_all() 三、... -
python 制作串口工具(二)
2021-02-09 08:32:41前言继续上一篇使用 python 制作串口工具(一),完成要实现的串口工具代码逻辑!实现最终效果:image获取接入的 com 口首先,我们先实现获取电脑当前所接入的串口,实现效果为:每次点击 Combo Box,就把当前电脑接入... -
python--串口通信
2022-01-15 09:35:22Python之串口通信 串口通信是嵌入式工程师的必备技能,如果能自己写一个简单的上位机的话,肯定会加分不少。 本系列是把相关的工作做个记录,毕竟Python不是经常用,老是忘记很多东西。用的时候总是重头再学一遍太... -
【如何用python实现串口通信】
2020-12-30 17:37:16【如何用python实现串口通信】python 串口教程2020-09-19 09:54:51人已围观如何用python写个串口通信的程序一般很少用Python做偏底层的吧。是我的话,就直接让Python调c 库如何用python实现串口通信Python非常适合写... -
python串口通信
2021-01-13 18:15:22测试1 单独开一个进程接收,不发送,共享内存拿数据创建一个类Serial.py'''函数作用:1开启其一个进程2开启一个串口3串口数据解析4开辟共享内存 str 接收温度 湿度 mq2数据 (字符类型)5主进程创建类调用这些数据'''#... -
python串口读取数据
2021-08-12 15:34:48python串口读取数据python库 serial串口调试工具serial库编程实例 python库 serial 初学者学习使用串口接收数据,serial为python提供的串口通信库 串口调试工具 串口调试工具使用:ssscom(习小猛版) 使用步骤: 1... -
Python-串口通讯
2021-01-13 11:22:50Python-串口通讯 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对... -
使用python进行串口操作-学习笔记
2019-06-05 16:01:27最近由于工作需要,因此我对使用python编写程序来实现与串口的通讯进行了学习。 首先我先说一下python中对串口操作所使用的模块Serial,安装方法如下所示: 打开cmd窗口输入:python -m pip install pyserial 安装... -
通过Python设计串口调试助手,结合FPGA串口工程进行验证
2021-04-13 18:51:51Python设计串口调试助手,结合FPGA串口工程进行验证一、用python设计串口1.串口到FPGA的数据格式是gbk,所以先将汉字编码为gbk编码 (双字节编码)2.将gbk编码转化为字符串格式送到FPGA中3.打开端口4.将数据写到FPGA... -
python实现串口通信
2020-02-08 23:43:26因为店家只给了我两页纸的vc0706通信...3 实现串口通信 3.1 发现端口 3.2 发送命令 3.2.1 协议格式 3.2.2serial传送的方式 3.3 获取版本号(hello world) 3.4 复位 3.5 照相 3.5.1停止当前帧刷新 3.5.2... -
Python的串口(232,485等)通信(pyserial),实现读写
2022-02-07 13:58:35话不多说,直接上代码: aa为瞎写方法名,验证是否能输出与...ser.close()#关闭串口 except Exception as e: print("---异常---:",e) 原创链接在这,进行了针对自己改动:Python的串口通信(pyserial) - 东小东 - 博客园 -
python实现串口通讯小程序(GUI界面)
2020-11-28 11:27:19python实现串口通讯小程序(GUI界面)使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装。1、安装pyserial库:打开命令行窗口,在命令行中输入:... -
python小工具之缤果python串口打印助手
2021-11-18 23:21:25python串口打印助手 超级好用的串口打印助手 !!! 缤果python串口打印助手支持常用的50bps - 10Mbps波特率,支持控制台打印串口log, 时间戳以及分组保存串口log功能。 中文名:缤果python串口打印助手 外文名:... -
python 读取串口数据并绘制多路实时动态波形
2021-03-22 23:02:35print("open success") ser.flushInput() # 清空缓冲区 else: print("open failed") serial.close() # 关闭端口 historyLength = 80 # 横坐标长度 data1 = array.array('h') # 可动态改变数组的大小,signed short型... -
python获取串口设备的描述【】
2021-02-10 13:11:45python获取串口设备的描述importwinregkey=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"SYSTEM\ControlSet001\Control\Class\{36FC9E60-C465-11CF-8056-444553540000}")foriinrange(winreg.QueryInfoKey(key)[0]):...