python读取串口返回的数据(python 串口读取16进制)

http://www.itjxue.com  2023-04-08 22:12  来源:未知  点击次数: 

python - serial communication(串口通信)

由于测试工作的需要,在C端产品上经常使用串口进行通信,而测试脚本大部分时候又采用python编写,于是就不得不了解并熟悉python下的串口通信实现方法了,整理如下以备随时使用:

一、说明

pyserial封装了python环境下对串口的访问,其兼容各种平台,并有统一的操作接口。通过python属性访问串口设置,并可对串口的各种配置参数(如串口名,波特率、停止校验位、流控、超时等等)做修改,再进行串口通信的类与接口封装后,非常方便地被调用和移植。

二、模块安装

pip insatll pyserial

三、初始化与参数说明

import serial

ser = serial.Serial('COM3', 115200, timeout=0.5, ....................)

下面看看 serial.Serial 原生类

四、不同平台下初始化

ser=serial.Serial("/dev/ttyUSB0",9600,timeout=0.5)#使用USB连接串行口ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)#使用树莓派的GPIO口连接串行口ser=serial.Serial(1,9600,timeout=0.5)#winsows系统使用COM1口连接串行口ser=serial.Serial("COM1",9600,timeout=0.5)#winsows系统使用COM1口连接串行口ser=serial.Serial("/dev/ttyS1",9600,timeout=0.5)#Linux系统使用COM1口连接串行口

五、串口属性

ser.name?#串口名称

ser.port?#端口号

ser.baudrate #波特率

ser.bytesize #字节大小

ser.parity #校验位N-无校验,E-偶校验,O-奇校验

ser.stopbits #停止位

ser.timeout #读超时设置

ser.writeTimeout #写超时

ser.xonxoff #软件流控

ser.rtscts #硬件流控

ser.dsrdtr #硬件流控

ser.interCharTimeout #字符间隔超时?

六、串口常用方法

isOpen():查看端口是否被打开。

open() :打开端口‘。

close():关闭端口。

read(size=1):从端口读字节数据。默认1个字节。

read_all():从端口接收全部数据。

write(data):向端口写数据。

readline():读一行数据。

readlines():读多行数据。

in_waiting():返回输入缓存中的字节数。

out_waiting():返回输出缓存中的字节数。

flush():等待所有数据写出。

flushInput():丢弃接收缓存中的所有数据。

flushOutput():终止当前写操作,并丢弃发送缓存中的数据。

sendBreadk(duration=0.25):发送BREAK条件,并于duration时间之后返回IDLE

setBreak(level=True):根据level设置break条件。

setRTS(level=True):设置请求发送(RTS)的控制信号

setDTR(level=True):设置数据终端准备就绪的控制信号

七、类与接口封装

import time

import serial

import serial.tools.list_ports

# 串口操作类

class serialCommunication(object):

????def __init__(self, port, bps, timeout):# 可配置更多参数

? ? ? ? port_list =self.show_usable_com()

????????if len(port_list) 0:

????????????if portnot in port_list:

????????????????self.port = port_list[0]

????????????else:

????????????????self.port = port

????????else:

????????????print("no usable serial, please plugin your serial board")

????????????return

? ? ? ? self.bps = bps

????????self.timeout = timeout

????????try:

????????????# 初始化串口,并得到串口对象,根据需要可拓展更多参数

? ? ? ? ? ? self.ser = serial.Serial(self.port, self.bps, 8, 'N', 1, timeout=self.timeout, write_timeout=self.timeout)

????????except Exception as e:# 抛出异常

? ? ? ? ? ? print("Exception={}".format(e))

????# 显示可用串口列表

? ? @staticmethod

? ? def show_usable_com():

????????serialport_list = []

????????portInfo_list =list(serial.tools.list_ports.comports())

????????if len(portInfo_list) =0:

????????????print("can not find any serial port!")

????????else:

????????????print(portInfo_list)

????????????for i in range(len(portInfo_list)):

????????????????plist =list(portInfo_list[i])

????????????????print(plist)

????????????????serialport_list.append(plist[0])

????????????print(serialport_list)

????????????return serialport_list

# 输出串口基本信息

? ? def serial_infor(self):

????????print(self.ser.name)# 设备名字

? ? ? ? print(self.ser.port)# 读或者写端口

? ? ? ? print(self.ser.baudrate)# 波特率

? ? ? ? print(self.ser.bytesize)# 字节大小

? ? ? ? print(self.ser.parity)# 校验位

? ? ? ? print(self.ser.stopbits)# 停止位

? ? ? ? print(self.ser.timeout)# 读超时设置

? ? ? ? print(self.ser.writeTimeout)# 写超时

? ? ? ? print(self.ser.xonxoff)# 软件流控

? ? ? ? print(self.ser.rtscts)# 软件流控

? ? ? ? print(self.ser.dsrdtr)# 硬件流控

? ? ? ? print(self.ser.interCharTimeout)# 字符间隔超时

? ? # 打开串口

????def serial_open(self):

????????try:

????????????if not self.ser.isOpen():

????????????????self.ser.open()

????????except Exception as e:# 抛出异常

? ? ? ? ????print("serial_open Exception={}".format(e))

????????????self.ser.close()

????# 读取指定大小的数据

? ? # 从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。

? ? def serial_read_with_size(self, size):

????????try:

????????????self.serial_open()

????????????return self.ser.read(size).decode("utf-8")

????????except Exception as e:

????????????print("serial_read_all Exception={}".format(e))

????????????self.ser.close()

????# 读取当前串口缓存中的所有数据

? ? def serial_read_data(self):

????????try:

????????????self.serial_open()

????????????datalen =self.ser.inWaiting()

? ? ? ? ? ? if datalen ==0:

????????????????return None

? ? ? ? ? ? return self.ser.read(datalen).decode("utf-8")

????????except Exception as e:

????????????print("serial_read_data Exception={}".format(e))

????????????self.ser.close()

????# 读串口全部数据,注意timeout的设置

? ? # 在设定的timeout时间范围内,如果读取的字节数据是有效的(就是非空)那就直接返回,

? ? # 否则一直会等到设定的timeout时间并返回这段时间所读的全部字节数据。

? ? def serial_read_all(self):

????????try:

????????????self.serial_open()

????????????return self.ser.read_all().decode("utf-8")

????????except Exception as e:

????????????print("serial_read_all Exception={}".format(e))

????????????self.ser.close()

????# 读一行数据

? ? # 使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。

? ? # 如果没有超时,readline会报异常。

? ? def serial_read_line(self):

????????try:

????????????self.serial_open()

????????????return self.ser.readline().decode("utf-8")

????????except Exception as e:

????????????print("serial_read_line Exception={}".format(e))

? ? ? ? ? ? self.ser.close()

????# 读多行数据,返回行列表

? ? def serial_read_lines(self):

????????try:

????????????self.serial_open()

????????????return self.ser.readlines().decode("utf-8")

????????except Exception as e:

????????????print("serial_read_lines Exception={}".format(e))

????????????self.ser.close()

????# 写数据

? ? def serial_write_data(self, data):

????????try:

????????????self.serial_open()

????????????self.ser.flushOutput()

????????????data_len =self.ser.write(data.encode('utf-8'))

????????????return data_len

????????except Exception as e:

????????????print("serial_write_data Exception={}".format(e))

????????????return 0

? ? # 写行数据,注意参数差异

? ? def serial_write_lines(self, lines):

????????self.ser.writelines(lines)

????# 清除串口缓存

????def serial_clean(self):

????????try:

????????????if self.ser.isOpen():

????????????????self.ser.flush()

????????except Exception as e:

????????????print("serial_clean Exception={}".format(e))

????# 关闭串口

? ? def serial_close(self):

????????try:

????????????if self.ser.isOpen():

????????????????self.ser.close()

????????except Exception as e:

????????????print("serial_clean Exception={}".format(e))

if __name__ =='__main__':

????testSerial = serialCommunication("COM10", 1500000, 0.5)

????testSerial.serial_open()

????testSerial.serial_infor()

????testSerial.serial_write_data("ifconfig eth0\n")

????time.sleep(0.1)

????data = testSerial.serial_read_all()

????print(data)

????testSerial.serial_close()

八、其他

1)ser.VERSION表示pyserial版本;?另外,ser.name表示设备名称

2)端口设置可以被读入字典,也可从字典加载设置:

? ? getSettingDict():返回当前串口设置的字典

? ? applySettingDict(d):应用字典到串口设置

3)?Readline()是读一行,以/n结束,要是没有/n就一直读,阻塞。注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。

4)serial.read_all 与?serial.read_all()区别

? ??serial.read_all:读取串口所有的参数信息

????serial.read_all():超时时间内从串口读取的所有数据

5) 异常信息

? ? exception serial.SerialException

? ? exception serial.SerialTimeoutException

接口返回数据为数组格式,如何使用python取出想要的某组数据?

我很好奇,你们用的是什么框架,如果用的是pytest. 应该搞这个完全没问题的,纯属好奇,同行。方便的话说下哈。

你这个问题很简单,如果你们用的事pytest. 可以在公用函数里面定义一个函数取值,这个返回数据为

id=[]

for i in res["data"]:

####for j in i:

######## for k in i["list"]:

############ id. append(k["iUserid"])

python怎么获取需要登陆的接口的数据?

使用Python做爬虫是很广泛的应用场景,那就涉及到了Python是如何获取接口数据的呢?Python拥有很多很强大的类库,使用urllib即可轻松获取接口返回的数据。

...展开

工具原料Python开发工具url接口,用于请求获取数据

方法/步骤分步阅读

1

/4

首先新建一个py文件,导入所需的类库,urllib,json等。

2

/4

声明api的url地址,和构造请求头。

3

/4

使用urlopen方法发起请求并获取返回的数据。

4

/4

最后就是对返回字符串的处理了。比如字符串的截取,字符串的转换成json对象,转换成字段,再获取对应key的值。

使用Python3实现HTTP get方法。使用聚合数据的应用编程接口,你可以调用小发猫AI写作API。这是一个免费的应用程序接口,先上代码,详细说明写在后面:

1

2

3

4

5

6

7

8

9

10

11

12

import requests

import time

import re

se = requests.session()

if __name__ == '__main__':

Post_url = ";v=1key=xxxxxx" #自己想办法弄到key

Post_data = {

'wenzhang': '床前明月光,疑是地上霜。'

}

Text = se.post(Post_url, data=Post_data).text.replace("'", '"').replace('/ ', '/')

print(Text)

首先,什么是原料药?应用编程接口的全称也称为应用编程接口。它简称为应用编程接口。当我第一次接触接口调用时,我不知道写什么,因为我看了整个项目。这个项目是由龙卷风写的。看了半天龙卷风后,我发现我走错了方向。我只是直接看着界面,因为没有人告诉我项目的整个过程。我不得不强迫自己去看它。我所要做的就是找到程序的主入口,然后根据函数一步一步地调用它。

当我编写接口时,因为我必须配合后台编写和浏览器访问,每次访问只需要传入相应的参数来调用相应的接口。界面可以由他人编写,也可以由合作公司提供。当然,合作公司提供的不是免费的。现在基本上,如果我不访问它一次,它只收费几美分。当你听到这些,不要低估这几分。有时候如果你打了几百万次电话,会花很多钱。有些人认为,我们不能按月付款吗?对不起,我不知道。总之,我们一个接一个地计算,因为第一次,我认为我买的那些直接买了我们想要的所有数据,把它们保存在本地数据库中,当我使用它们时,直接从我自己的数据库中转移它们。后来,我发现我想得太多了,伪原创API。

该接口调用由python的请求库访问,它基本上是一个get或post请求。有些接口是加密的,然后我们必须用另一方提供给我们的公钥加密或解密,然后用相应的参数访问。我们想要的数据基本上是在请求后返回的结果中以json格式解析的。因此,在请求之后,我们可以用请求提供的json函数来解析它,然后提取数据以一次访问一个数据。

没错,接口调用就是这么简单,但是有了后台编写,我才发现请求库现在有多强大,只要它是http或https,我很高兴我在一周内读完了请求和bs4,我真的不打电话给爬虫工程师,如果我是爬虫的时候不学习请求,你能用scrapy写4=dead来写它吗?Urllib的单词基本上被删除了。如果你有要求,为什么要用这个?

serialport数据保存到数据库

serialport数据保存到数据库如下:

1、使用Python的串口模块来读取串口数据,并把读取的数据存入变量中。

2、使用Python的MySQLdb模块,连接到MySQL数据库。

3、使用MySQLdb模块把变量中的数据插入到MySQL数据库中。

4、循环上面3步,不断读取串口数据并插入到MySQL数据库中,完成数据的保存。

(责任编辑:IT教学网)

更多

推荐通讯数据软件文章