Python使用pyserial进行串口通信

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

运行结果:

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

  最近调试通信模块时,需要用UART串口输入AT命令控制模块,手动输入不便于自动化,所以就学习了下使用python进行串口控制。

常用的方法函数


导入串口模块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()

运行结果:

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

希望对你有帮助。


 

发布了178 篇原创文章 · 获赞 373 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/qq_41204464/article/details/84502684