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 ElementTree 基本读操作示例
Apr 09 Python
在python中的socket模块使用代理实例
May 29 Python
Django在Win7下的安装及创建项目hello word简明教程
Jul 14 Python
Python中列表的一些基本操作知识汇总
May 20 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
Python使用pymysql小技巧
Jun 04 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
Python 3.8正式发布重要新功能一览
Oct 17 Python
Python从列表推导到zip()函数的5种技巧总结
Oct 23 Python
python中的被动信息搜集
Apr 29 Python
教你使用Pandas直接核算Excel中快递费用
May 12 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/10/09 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
PHP结合jQuery实现找回密码
2015/07/22 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
PHP的PDO连接讲解
2019/01/24 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
PHP学习记录之常用的魔术常量详解
2019/12/12 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
原生javascript实现分享到朋友圈功能 支持ios和android
2016/05/11 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
Node.js的Mongodb使用实例
2016/12/30 Javascript
解决JS外部文件中文注释出现乱码问题
2017/07/09 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
Vue实现active点击切换方法
2018/03/16 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
解决vue脚手架项目打包后路由视图不显示的问题
2018/09/20 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
python中__call__方法示例分析
2014/10/11 Python
详解Python装饰器由浅入深
2016/12/09 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
CSS3属性box-shadow使用指南
2014/12/09 HTML / CSS
关于HTML5的22个初级技巧(图文教程)
2012/06/21 HTML / CSS
如何写出好的Java代码
2014/04/25 面试题
奖学金自我鉴定范文
2013/10/03 职场文书
英语专业自荐书
2014/06/13 职场文书
和谐家庭事迹材料
2014/12/20 职场文书