Python 串口通信的实现

作者:东小东 时间:2022-05-25 21:08:54 

串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议。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

来源:https://www.cnblogs.com/dongxiaodong/p/9992083.html

标签:python,串口,通信
0
投稿

猜你喜欢

  • 使用SQLAlchemy操作数据库表过程解析

    2024-01-20 14:42:59
  • Python 判断文件或目录是否存在的实例代码

    2021-08-16 14:44:49
  • python中进程间通信及设置状态量控制另一个进程

    2022-01-28 08:02:57
  • 简单的连接MySQL与Python的Bottle框架的方法

    2024-01-27 23:49:40
  • Python验证的50个常见正则表达式

    2023-07-11 02:58:57
  • 合并百度影音的离线数据( with python 2.3)

    2022-01-11 09:22:14
  • windows下python安装pip图文教程

    2023-11-18 19:27:20
  • MySQL数据库安装和Navicat for MySQL配合使用教程

    2024-01-24 16:50:58
  • 关于Python中模块的简介、定义与使用

    2021-01-25 16:09:29
  • MySQL的join buffer原理

    2024-01-28 01:44:19
  • 优化MySQL数据库查询的三种方法

    2009-03-09 15:19:00
  • Python 栈实现的几种方式及优劣详解

    2023-11-02 14:25:18
  • 详解VUE 定义全局变量的几种实现方式

    2024-04-27 16:00:16
  • 使用python对多个txt文件中的数据进行筛选的方法

    2022-02-19 10:09:30
  • PyTorch加载预训练模型实例(pretrained)

    2021-02-04 15:26:11
  • 2009年情人节网站logo欣赏

    2009-02-15 12:13:00
  • vue3.0 上手体验

    2024-04-30 10:26:49
  • 利用python+ffmpeg合并B站视频及格式转换的实例代码

    2021-06-09 21:14:00
  • SQL临时表递归查询子信息并返回记录的代码

    2012-08-21 11:06:19
  • HTML5 的五个激动人心的特性

    2009-01-02 17:36:00
  • asp之家 网络编程 m.aspxhome.com