Python 串口通信的实现

串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。串口是计算机上一种非常通用的设备通信协议。pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口。

安装:

pip3 install pyserial

测试:

两个CH340 (TTL转串口模块)接入到PC串口上,通过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 串口通信的资料请关注我们其它相关文章!

(0)

相关推荐

  • python实现串口通信的示例代码

    1 硬件设备 TTL串口摄像头(VC0706) USB转TTL烧录器 2 serial安装 第一次安装的是serial的包导包的时候发现下载错了,正确应该是pyserial.安装后直接import就可以了. 3 实现串口通信 3.1 发现端口 Windows下为COM(N, N=1.2...), Ubuntu下为'/dev/ttyS0'.Windows初学者,可以给您一下两种方式确定端口号. 方法一:输入在终端(cmd)中输入 python -m serial.tools.list_ports

  • Python使用pyserial进行串口通信的实例

    安装pyserial pip install pyserial 查看可用的端口 # coding:utf-8 import serial.tools.list_ports plist = list(serial.tools.list_ports.comports()) if len(plist) <= 0: print("没有发现端口!") else: plist_0 = list(plist[0]) serialName = plist_0[0] serialFd = seri

  • Python实现串口通信(pyserial)过程解析

    pyserial模块封装了对串口的访问,兼容各种平台. 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser = serial.Serial('com1', 9600, timeout=1) 所有参数 ser = serial.Serial( port=None, # number of device, numbering starts at # zero. if everything fails, the user # can specif

  • Python3简单实现串口通信的方法

    如下所示: import serial import sys import os import time import re def wait_for_cmd_OK():     while True:         line = ser.readline()         try:             print(line.decode('utf-8'),end='')         except:             pass         if ( re.search(b'

  • Python 串口通信的实现

    串口通信是指外设和计算机间,通过数据信号线 .地线.控制线等,按位进行传输数据的一种通讯方式.这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低.串口是计算机上一种非常通用的设备通信协议.pyserial模块封装了python对串口的访问,为多平台的使用提供了统一的接口. 安装: pip3 install pyserial 测试: 两个CH340 (TTL转串口模块)接入到PC串口上,通过Python进行数据交互: 简单串口程序实现: import serial

  • 树莓派(python)与arduino串口通信的详细步骤

    树莓派与arduino串口通信 第一步:先设置硬件串口分配给GPIO串口 输入sudo raspi-config命令进入树莓派系统配置界面,选择第三个Interfacing Options 进去选择Serial Port 然后选择关闭串口登录功能,打开硬件串口调试功能 修改配置文件 打开/boot/config.txt文件,输入 sudo vim /boot/config.txt,在最后添加俩行:1.dtoverlay=pi3-miniuart-bt 2.force_turbo=1 然后重启树莓

  • Android串口通信封装之OkUSB的示例代码

    本文介绍了Android串口通信封装之OkUSB的示例代码,分享给大家.具体如下: Github传送门:OkUSB OkUSB 一个简洁的Android串口通信框架. 功能简介 支持设置波特率 支持设置数据位 支持设置停止位 支持设置校验位 支持DTS和RTS 支持串口连接状态监听 用法简介 Gradle allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { compile '

  • Android 串口通信编程及串口协议分析

    Android 串口通信编程:嵌入式编程和可穿戴设备及智能设备都会用到串口,这里就带大家分析下, 一,android串口通信 串口通信采用一个第三方开源项目,实现串口数据收发. 1. 使用了http://code.google.com/p/android-serialport-api/的项目的serialport api和jni: 2. 支持4串口同时收发,有定时自动发送功能,收发模式可选Txt或Hex模式: 3.  n,8,1,没得选: 4. 为减轻界面卡顿的情况,接收区的刷新采用单独的线程进

  • 基于Java编写串口通信工具

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar包,由于java.comm比较老了,而且不支持64位系统,这里推荐Rxtx这个jar包(32位/64位均支持). 官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载) 不能FQ的童鞋,可以在这里下载: http://xiazai.jb51

  • 使用Java实现串口通信

    1.介绍 使用Java实现的串口通信程序,支持十六进制数据的发送与接收. 源码下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611343 效果图如下: 2.RXTXcomm Java串口通信依赖的jar包RXTXcomm.jar 下载地址:http://download.csdn.net/detail/kong_gu_you_lan/9611334 内含32位与64位版本 使用方法: 拷贝 RXTXcomm.jar 到 JAVA_HO

  • java 串口通信详细及简单实例

    java 实现串口通信 最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳.java也可以操作硬件? 后来接触到是用java通过串口通信控制硬件感觉使用起来还不错,也很方便. 特拿出来和大家一起分享一下. 准备工作: 首先到SUN官网下载一个zip包:javacomm20-win32.zip 其中重要的有这几个文件: win32com.dll comm.jar javax.comm.properties 按照说明配置好环境,如下: 将win32com.dll复制到<J

  • C#串口通信实现方法

    本文实例讲述了C#串口通信实现方法.分享给大家供大家参考.具体方法如下: 通过COM1发送数据,COM2接收数据.当COM2接收完本次发送的数据后,向COM1发送信息通知COM1本次数据已发完,COM1接到通知后,再发下一段数据.这样可以确保每次发送的数据都可以被正确接收. 代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;

随机推荐