Python 串口通信的实现


Posted in Python onSeptember 29, 2020

串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议。pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口。

安装:

pip3 install pyserial

测试:

两个CH340 (TTL转串口模块)接入到PC串口上,通过Python进行数据交互:

Python 串口通信的实现

简单串口程序实现:

import serial #导入模块
try:
 #端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
 portx="COM3"
 #波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
 bps=115200
 #超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
 timex=5
 # 打开串口,并得到串口对象
 ser=serial.Serial(portx,bps,timeout=timex)

 # 写数据
 result=ser.write("我是东小东".encode("gbk"))
 print("写总字节数:",result)

 ser.close()#关闭串口

except Exception as e:
  print("---异常---:",e)

获取可用串口列表:

import serial #导入模块

import serial.tools.list_ports
port_list = list(serial.tools.list_ports.comports())
print(port_list)
if len(port_list) == 0:
  print('无可用串口')
else:
  for i in range(0,len(port_list)):
    print(port_list[i])

十六进制处理:

import serial #导入模块
try:
 portx="COM3"
 bps=115200
 #超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
 timex=None
 ser=serial.Serial(portx,bps,timeout=timex)
 print("串口详情参数:", ser)

 #十六进制的发送
 result=ser.write(chr(0x06).encode("utf-8"))#写数据
 print("写总字节数:",result)

 #十六进制的读取
 print(ser.read().hex())#读一个字节

 print("---------------")
 ser.close()#关闭串口

except Exception as e:
  print("---异常---:",e)

其他细节补充:

import serial #导入模块
try:

 #端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
 portx="COM3"
 #波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
 bps=115200
 #超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
 timex=5
 # 打开串口,并得到串口对象
 ser=serial.Serial(portx,bps,timeout=timex)
 print("串口详情参数:", ser)



 print(ser.port)#获取到当前打开的串口名
 print(ser.baudrate)#获取波特率

 result=ser.write("我是东小东".encode("gbk"))#写数据
 print("写总字节数:",result)


 #print(ser.read())#读一个字节
 # print(ser.read(10).decode("gbk"))#读十个字节
 #print(ser.readline().decode("gbk"))#读一行
 #print(ser.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用
 #print(ser.in_waiting)#获取输入缓冲区的剩余字节数
 #print(ser.out_waiting)#获取输出缓冲区的字节数

 #循环接收数据,此为死循环,可用线程实现
 while True:
     if ser.in_waiting:
       str=ser.read(ser.in_waiting ).decode("gbk")
       if(str=="exit"):#退出标志
         break
       else:
        print("收到数据:",str)

 print("---------------")
 ser.close()#关闭串口


except Exception as e:
  print("---异常---:",e)

部分封装:

其中读数据的封装方法并不是很好用,使用的话又得循环接收,这样反而更加复杂了

import serial #导入模块
import threading
STRGLO="" #读取的数据
BOOL=True #读取标志位

#读数代码本体实现
def ReadData(ser):
  global STRGLO,BOOL
  # 循环接收数据,此为死循环,可用线程实现
  while BOOL:
    if ser.in_waiting:
      STRGLO = ser.read(ser.in_waiting).decode("gbk")
      print(STRGLO)


#打开串口
# 端口,GNU / Linux上的/ dev / ttyUSB0 等 或 Windows上的 COM3 等
# 波特率,标准值之一:50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,19200,38400,57600,115200
# 超时设置,None:永远等待操作,0为立即返回请求结果,其他值为等待超时时间(单位为秒)
def DOpenPort(portx,bps,timeout):
  ret=False
  try:
    # 打开串口,并得到串口对象
    ser = serial.Serial(portx, bps, timeout=timeout)
    #判断是否打开成功
    if(ser.is_open):
      ret=True
      threading.Thread(target=ReadData, args=(ser,)).start()
  except Exception as e:
    print("---异常---:", e)
  return ser,ret



#关闭串口
def DColsePort(ser):
  global BOOL
  BOOL=False
  ser.close()



#写数据
def DWritePort(ser,text):
  result = ser.write(text.encode("gbk")) # 写数据
  return result




#读数据
def DReadPort():
  global STRGLO
  str=STRGLO
  STRGLO=""#清空当次读取
  return str



if __name__=="__main__":
  ser,ret=DOpenPort("COM6",115200,None)
  if(ret==True):#判断串口是否成功打开
     count=DWritePort(ser,"我是东小东,哈哈")
     print("写入字节数:",count)
     #DReadPort() #读串口数据
     #DColsePort(ser) #关闭串口

查看所有串口

import serial.tools.list_ports
port_list = list(serial.tools.list_ports.comports())
if len(port_list) == 0:
  print('找不到串口')
else:
  for i in range(0,len(port_list)):
    print(port_list[i])

参考:

https://pythonhosted.org/pyserial/pyserial_api.html#serial.Serial.open

以上就是Python 串口通信的实现的详细内容,更多关于python 串口通信的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中的rjust()方法使用详解
May 19 Python
详解Django通用视图中的函数包装
Jul 21 Python
学习python 之编写简单乘法运算题
Feb 27 Python
离线安装Pyecharts的步骤以及依赖包流程
Apr 23 Python
python统计多维数组的行数和列数实例
Jun 23 Python
详解Python3中的迭代器和生成器及其区别
Oct 09 Python
Pandas之ReIndex重新索引的实现
Jun 25 Python
Python input函数使用实例解析
Nov 22 Python
python中的split()函数和os.path.split()函数使用详解
Dec 21 Python
PyCharm如何导入python项目的方法
Feb 06 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
Python可视化学习之seaborn调色盘
Feb 24 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 #Python
详解python对象之间的交互
Sep 29 #Python
python PIL模块的基本使用
Sep 29 #Python
Python 如何实现数据库表结构同步
Sep 29 #Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 #Python
python ssh 执行shell命令的示例
Sep 29 #Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 #Python
You might like
PHP数字格式化
2006/12/06 PHP
用php实现的获取网页中的图片并保存到本地的代码
2010/01/05 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
将Datatable转化成json发送前台实现思路
2013/09/06 Javascript
jquery预览图片实现鼠标放上去显示实际大小
2014/01/16 Javascript
js动态创建上传表单通过iframe模拟Ajax实现无刷新
2014/02/20 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
[01:47]2018年度DOTA2最具人气解说-完美盛典
2018/12/16 DOTA
python定时检查启动某个exe程序适合检测exe是否挂了
2013/01/21 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
对pandas的算术运算和数据对齐实例详解
2018/12/22 Python
python把1变成01的步骤总结
2019/02/27 Python
简单了解python单例模式的几种写法
2019/07/01 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
HTML5去掉输入框type为number时的上下箭头的实现方法
2020/01/03 HTML / CSS
泰国综合购物网站:Lazada泰国
2018/04/09 全球购物
化石印度尼西亚在线商店:Fossil Indonesia
2019/03/11 全球购物
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
数控技术与应用毕业生自荐信
2013/09/24 职场文书
客房主管岗位职责
2013/12/09 职场文书
平安建设实施方案
2014/03/19 职场文书
挂牌仪式主持词
2014/03/20 职场文书
考博专家推荐信
2014/05/10 职场文书
安全教育片观后感
2015/06/17 职场文书
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记
如何通过一篇文章了解Python中的生成器
2022/04/02 Python