找回密码
 会员注册
查看: 24|回复: 0

Python与RS-485传感器设备进行串口通信,读取数值

[复制链接]

3

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2024-9-5 22:28:28 | 显示全部楼层 |阅读模式
基础准备使用的485设备https://item.taobao.com/item.htm?spm=a1z09.2.0.0.29902e8dKQTU6d&id=584607646349&_u=p208d7bb2e05dc​​​485设备资料📎导轨式温湿度传感器.pdf使用的Python库pyserial(非内置库)将RS-485传感器设备先转成RS-232,然后将RS-232转成USB串口,插入到串口,即可使用电脑COM进行串口通信与485设备进行通信发送数据接受数据​​​​​​​发送命令并接收命令-示例importserial#打开串口,COM6,4800波特率,8数据位,0停止位ser=serial.Serial('COM6',4800,parity=serial.PARITY_NONE,bytesize=serial.EIGHTBITS,stopbits=serial.STOPBITS_ONE)#检查串口是否已经打开ifser.is_open:print('串口已成功打开.')#要发送的数据(基本固定)data_to_send=[0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B]#将数据转换为字节串并发送ser.write(bytes(data_to_send))#读取数据包,分字节和功能读取,数据位为2字节address=ser.read(1)#读取地址字节function_code=ser.read(1)#读取功能码字节data_length=ser.read(1)#读取数据字节数字节humidity=ser.read(2)#读取湿度数据(2字节)temperature=ser.read(2)#读取温度数据(2字节)crc=ser.read(2)#读取CRC校验(2字节)#将字节串转换为整数temperature_data=int.from_bytes(temperature,byteorder='big')humidity_value=int.from_bytes(humidity,byteorder='big')#温度计算#将温度数据转换为有符号的十进制数iftemperature_data&0x8000:#如果温度数据的最高位为1#温度数据的最高位为1,表示温度为负数,则需要先取反再加1temperature_decimal=-(0x10000-temperature_data)else:#温度数据的最高位为0,表示温度为正数,直接赋值temperature_decimal=temperature_data#计算实际温度值temperature=temperature_decimal/10.0#温度(摄氏度)#湿度计算humidity_value=humidity_value/10.0#湿度(%)#打印接收到的数据print('地址:',address)print('功能码:',function_code)print('数据字节数:',data_length)print("温度:{}°C".format(temperature))print('湿度:{}%'.format(humidity_value))print('CRC校验:',crc)#关闭串口ser.close() 输出结果C:\Users\wanga\PycharmProjects\NewLandDemo\venv\Scripts\python.exeC:\Users\wanga\PycharmProjects\NewLandDemo\读取串口数据\读取485温湿度.py串口已成功打开.地址:b'\x01'功能码:b'\x03'数据字节数:b'\x04'温度:28.1°C湿度:61.3%CRC校验:b'+\xce'进程已结束,退出代码0技术要点int.from_bytes(temperature,byteorder='big')字节转整数byteorder='big'表示左边是高位,右边是低位temperature_data&0x8000判断最高位是否为10x8000是十六进制常数,表示二进制为1000000000000000只有最高位为1传感器返回的数据,最高位为标识符,如果为1则表示数据为负数,如果为0则表示数据为正数&进行按位与操作,要每位都为1才是1,所以除了第一位以外,其他位无论是1还是0结果都是0如果最后计算的结果有一位为1,Python都会输出1 0x0118:0000000100011000& 0x8000:1000000000000000-----------------------Result: 0000000000000000Python输出:0 0xF118:1111000100011000& 0x8000:1000000000000000-----------------------Result: 1000000000000000Python输出:1temperature_decimal=-(0x10000-temperature_data)如果数据为负数,则需要进行数据处理如果temperature_data为FF9F,转换成十进制为654390x10000是十六进制数,转成十进制为6553610000(65439)-FF9F(65536)=97此时已经是正确数据,然后因为高位为1,为负数,则进行取反操作取反后则变成-97,数据再除10就得到正确数据-9.7℃以上操作基于负数补码进行的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-9 05:53 , Processed in 1.855020 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表