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中使用pprint函数进行格式化输出的教程
Apr 07 Python
PYTHON压平嵌套列表的简单实现
Jun 08 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Python实现读取txt文件并画三维图简单代码示例
Dec 09 Python
Python Paramiko模块的使用实际案例
Feb 01 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
Jul 17 Python
Python类中方法getitem和getattr详解
Aug 30 Python
Win10+GPU版Pytorch1.1安装的安装步骤
Sep 27 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
Feb 23 Python
python类共享变量操作
Sep 03 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
php代码检查代理ip的有效性
2016/08/19 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
浅谈JavaScript中的string拥有方法的原因
2015/08/28 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
switch语句的妙用(必看篇)
2016/10/03 Javascript
从零学习node.js之模块规范(一)
2017/02/21 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
JavaScript实现移动端带transition动画的轮播效果
2020/03/24 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
对pyqt5中QTabWidget的相关操作详解
2019/06/21 Python
Python Tornado实现WEB服务器Socket服务器共存并实现交互的方法
2020/05/26 Python
python 实现百度网盘非会员上传超过500个文件的方法
2021/01/07 Python
html5本地存储之localstorage 、本地数据库、sessionStorage简单使用示例
2014/05/08 HTML / CSS
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
企业申诉管理制度
2014/01/30 职场文书
幼师自我鉴定
2014/02/01 职场文书
工作鉴定评语
2014/05/04 职场文书
师范类求职信
2014/06/21 职场文书
党委班子对照检查材料
2014/08/19 职场文书
2014年生产部工作总结
2014/12/17 职场文书
优秀班集体申报材料
2014/12/25 职场文书
工作汇报材料难写?方法都在这里了!
2019/07/01 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server