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代码来绘制彭罗斯点阵的教程
Apr 03 Python
在Django中创建第一个静态视图
Jul 15 Python
python与php实现分割文件代码
Mar 06 Python
python socket网络编程之粘包问题详解
Apr 28 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
Jan 02 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
Python 实现一个手机号码获取妹子名字的功能
Sep 25 Python
python继承threading.Thread实现有返回值的子类实例
May 02 Python
记一次django内存异常排查及解决方法
Aug 07 Python
Django vue前后端分离整合过程解析
Nov 20 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 多行多列显示
2009/08/15 PHP
基于wordpress主题制作的具体实现步骤
2013/05/10 PHP
PHP安全下载文件的方法
2016/04/07 PHP
PHP大神的十大优良习惯
2016/09/14 PHP
PHP中的正则表达式实例详解
2017/04/25 PHP
CakePHP框架Model关联对象用法分析
2017/08/04 PHP
Django 标签筛选的实现代码(一对多、多对多)
2018/09/05 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
vue checkbox 全选 数据的绑定及获取和计算方法
2018/02/09 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
2019/12/25 jQuery
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
Python文件操作函数用法实例详解
2019/12/24 Python
python爬取本站电子书信息并入库的实现代码
2020/01/20 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
python开根号实例讲解
2020/08/30 Python
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
Myprotein意大利官网:欧洲第一运动营养品牌
2018/11/22 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
机械工程师求职自我评价
2013/09/23 职场文书
医学生自荐信范文
2013/12/03 职场文书
保险专业求职信
2014/07/07 职场文书
撤诉书怎么写
2015/05/19 职场文书
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js
使用Redis实现分布式锁的方法
2022/06/16 Redis