开发者社区> 一颗小树x> 正文

基于pyserial【Python串口通信】

简介: Python串口通信有多种方式,本文是基于基于pyserial实现的。首先安装pyserial依赖库,了解常用的方法函数,认识Serial参数说明;然后电脑查看可用的端口,举个简单示例:能自动检测串口,并连接此串口,收集串口的数据;最后查看运行效果。
+关注继续查看

前言

Python串口通信有多种方式,本文是基于基于pyserial实现的。首先安装pyserial依赖库,了解常用的方法函数,认识Serial参数说明;然后电脑查看可用的端口,举个简单示例:能自动检测串口,并连接此串口,收集串口的数据;最后查看运行效果。

安装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 = serial.Serial(serialName, 9600, timeout=60)
    print("可用端口名>>>", serialFd.name)

运行结果:
1
注:在pyCharm环境下运行的,在电脑串口上有一个采集的传感器(通过串口连接到电脑)

常用的方法函数

  • 导入串口模块import serial;
  • 打开串口ser = serial.Serial(端口名称,...其他参数),
  • ser.open()方法可以在close之后再次打开相应端口;
  • 关闭串口ser.close();
  • 通过串口写入ser.write(b''),参数需要使用字节bytes类型,如果是str类型,则可以使用encode('utf-8')的方式进行转换;读取模块信息的方法如下:
    -> x= ser.read()读取一个字节,x=read(n)读取n个字节,readline()可以用来读取一行。

查看COM口工

python -m serial.tools.list_ports -v,可以列出所有串口名称及属性。

Serial参数说明

port端口名字,windows下为'COM1'等;

baudrate (int)波特率,可以设置的范围9600到115200;

bytesize为每个字节的比特数,设置值为FIVEBITS, SIXBITS,SEVENBITS, EIGHTBITS 5-8比特;

parity设置校验位PARITY_NONE, PARITY_EVEN,PARITY_ODD PARITY_MARK,PARITY_SPACE,用来设置校验位;stopbits停止位,用来指示字节完成,可以选择的设置STOPBITS_ONE,STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO;write_timeout(float) 写入超时设置;

timeout (float)读出超时设置;xonxoff (bool)软件流控开关;

rtscts (bool)硬件RTS/CTS流控开关;

dsrdtr (bool)硬件DSR/DTR流控开关。

  关于UART流控两线方式没有硬件流控,四线方式采用DSR、DTR进行流控,而RS232标准中可以有DSR、DTR的流控方式。RTS-request to send; CTS- clear to send;DSR-data set ready;DTR-Data Terminal Ready。

一个简单示例:能自动检测串口,并连接此串口,收集串口的数据

#!usr/bin/python3.6

import serial
import sys
import os
import time
import re

global MAX_LOOP_NUM
global newCmd
MAX_LOOP_NUM = 10
 
def waitForCmdOKRsp():
    maxloopNum = 0
    while True:
        line = ser.readline()
        maxloopNum = maxloopNum + 1
        

        try:
            print("Rsponse : %s"%line.decode('utf-8'))
        except:
            pass
       

        if ( re.search(b'OK',line)):
            break

        elif(maxloopNum > MAX_LOOP_NUM):
            sys.exit(0)


def sendAT_Cmd(serInstance,atCmdStr,waitforOk):
    print("Command: %s"%atCmdStr)
    serInstance.write(atCmdStr.encode('utf-8'))
    #or define b'string',bytes should be used not str
    if(waitforOk == 1):
        waitForCmdOKRsp()
    else:
        waitForCmdRsp()

ser = serial.Serial("COM5",9600,timeout=30)
sendAT_Cmd(ser,'AT+CFUN=1\r',1)
ser.close()

综合上面的两个代码,能自动检测串口,并连接此串口,收集串口的数据

# !usr/bin/python3.6

import serial
import sys
import os
import time
import re

import serial.tools.list_ports

global MAX_LOOP_NUM
global newCmd

MAX_LOOP_NUM = 10


def waitForCmdOKRsp():
    maxloopNum = 0

    while True:

        line = ser.readline()                              #读取一行数据
        maxloopNum = maxloopNum + 1                        #计算读取长度

        try:
            print("Rsponse : %s" % line.decode('utf-8'))  #串口接收到数据,然后显示
        except:
            pass

        if (re.search(b'OK', line)):
            break
        elif (maxloopNum > MAX_LOOP_NUM):
            sys.exit(0)


def sendAT_Cmd(serInstance, atCmdStr, waitforOk):
   # print("Command: %s" % atCmdStr)
    serInstance.write(atCmdStr.encode('utf-8'))   # atCmdStr  波特率
    # or define b'string',bytes should be used not str

    if (waitforOk == 1):
        waitForCmdOKRsp()
    else:
        waitForCmdRsp()


plist = list(serial.tools.list_ports.comports())

if len(plist) <= 0:
    print("没有发现端口!")
else:
    plist_0 = list(plist[0])
    serialName = plist_0[0]       #先自动检测串口, 检测到可用串口,取出串口名

#ser = serial.Serial("COM6", 115200, timeout=30)
ser = serial.Serial(serialName, 115200, timeout=30)  # timeout=30 30s
print("可用端口名>>>", ser.name)
sendAT_Cmd(ser, 'AT+CFUN=1\r', 1)
ser.close()

运行效果:
2

我用CC2530(Zigbee),采集了温度、湿度的数据,通过串口和电脑连接,运行此程序后,能自动检测到串口,然后获取 CC2530的数据,然后显示在电脑端。
3

希望对你有帮助。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
19230 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
28494 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
13289 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
22269 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
15922 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
20371 0
+关注
一颗小树x
计算机专业,从事无人驾驶和车路协同方向开发,主要负责感知模块;喜欢写博客和学习新知识。华为云-云享专家,华为认证AI工程师,华为云产品&rdquo;四星级&ldquo;体验官;GitChat认证作者。AI大学-高阶学员。喜欢这样的一句话:扬在脸上的自信,藏在心底的善良,溶在血液里的骨气,刻在生命里的坚强。
11
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载