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 相关文章推荐
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
python文本数据处理学习笔记详解
Jun 17 Python
PyQt QListWidget修改列表项item的行高方法
Jun 20 Python
解决django model修改添加字段报错的问题
Nov 18 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
Django项目uwsgi+Nginx保姆级部署教程实现
Apr 19 Python
Python插件机制实现详解
May 04 Python
在keras中对单一输入图像进行预测并返回预测结果操作
Jul 09 Python
最新PyCharm从安装到PyCharm永久激活再到PyCharm官方中文汉化详细教程
Nov 17 Python
Django权限控制的使用
Jan 07 Python
Django中的JWT身份验证的实现
May 07 Python
Django rest framework如何自定义用户表
Jun 09 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
DSP接收机前端设想
2021/03/02 无线电
php实现事件监听与触发的方法
2014/11/21 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
PHP文件操作实例总结
2016/09/27 PHP
讨论javascript(一)工厂方式 js面象对象的定义方法
2009/12/15 Javascript
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
VUEJS实战之利用laypage插件实现分页(3)
2016/06/13 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
nodejs实现的简单web服务器功能示例
2018/03/15 NodeJs
使用 Vue cli 3.0 构建自定义组件库的方法
2019/04/30 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
python实现bitmap数据结构详解
2014/02/17 Python
django接入新浪微博OAuth的方法
2015/06/29 Python
python sys.argv[]用法实例详解
2018/05/25 Python
对python 调用类属性的方法详解
2019/07/02 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
Tripadvisor新西兰:阅读评论,比较价格和酒店预订
2018/02/10 全球购物
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
大学生工作求职信
2014/06/23 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
学习保证书怎么写
2015/02/26 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
Win10防火墙白名单怎么设置?Win10添加防火墙白名单方法
2022/04/06 数码科技
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL