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 网络编程起步(Socket发送消息)
Sep 06 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
Aug 20 Python
python实现扫雷游戏
Mar 03 Python
Tensorflow安装问题: Could not find a version that satisfies the requirement tensorflow
Apr 20 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
python双向链表实例详解
May 25 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读取mysql的简单实例
2014/01/15 PHP
php简单smarty入门程序实例
2015/06/11 PHP
php强制用户转向www域名的方法
2015/06/19 PHP
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
javascript函数式编程实例分析
2015/04/25 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
2015/07/18 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
JS实现的视频弹幕效果示例
2018/08/17 Javascript
layui实现checkbox的目录树tree的例子
2019/09/12 Javascript
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
[49:35]KG vs SECRET 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
从零学python系列之从文件读取和保存数据
2014/05/23 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
jupyter notebook 中输出pyecharts图实例
2020/04/23 Python
django如何通过类视图使用装饰器
2019/07/24 Python
python各类经纬度转换的实例代码
2019/08/08 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
Python3如何判断三角形的类型
2020/04/12 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
python元组拆包实现方法
2021/02/28 Python
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
HTML5等待加载动画效果
2017/07/27 HTML / CSS
canvas学习和滤镜实现代码
2018/08/22 HTML / CSS
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
外语专业毕业生个人的自荐信
2013/11/19 职场文书
会计电算化专业求职信
2014/06/10 职场文书
4S店收银员岗位职责
2015/04/07 职场文书
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python
Mysql如何查看是否使用到索引
2022/12/24 MySQL