基础准备

使用的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设备进行通信发送数据

接受数据

​​​​​​​

发送命令并接收命令 - 示例

import serial

# 打开串口, COM6, 4800波特率, 8数据位, 0停止位

ser = serial.Serial('COM6', 4800, parity=serial.PARITY_NONE, bytesize=serial.EIGHTBITS, stopbits=serial.STOPBITS_ONE)

# 检查串口是否已经打开

if ser.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')

# 温度计算

# 将温度数据转换为有符号的十进制数

if temperature_data & 0x8000: # 如果温度数据的最高位为1

# 温度数据的最高位为1,表示温度为负数, 则需要先取反再加1

temperature_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.exe C:\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判断最高位是否为1

0x8000是十六进制常数, 表示二进制为1000000000000000只有最高位为1传感器返回的数据, 最高位为标识符, 如果为1则表示数据为负数, 如果为0则表示数据为正数&进行按位与操作, 要每位都为1才是1, 所以除了第一位以外, 其他位无论是1还是0结果都是0如果最后计算的结果有一位为1, Python都会输出1

0x0118: 0000 0001 0001 1000

& 0x8000: 1000 0000 0000 0000

-----------------------

Result: 0000 0000 0000 0000

Python输出:0

0xF118: 1111 0001 0001 1000

& 0x8000: 1000 0000 0000 0000

-----------------------

Result: 1000 0000 0000 0000

Python输出:1

temperature_decimal = -(0x10000 - temperature_data)如果数据为负数, 则需要进行数据处理

如果temperature_data为FF9F, 转换成十进制为654390x10000是十六进制数, 转成十进制为6553610000(65439) - FF9F(65536) = 97此时已经是正确数据, 然后因为高位为1, 为负数, 则进行取反操作取反后则变成-97, 数据再除10就得到正确数据-9.7℃以上操作基于负数补码进行的

推荐文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。