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

基础准备

  • 使用的485设备
    • https://item.taobao.com/item.htm?spm=a1z09.2.0.0.29902e8dKQTU6d&id=584607646349&_u=p208d7bb2e05dc​​​
  • 485设备资料
  • 使用的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_dataFF9F, 转换成十进制为65439
    • 0x10000是十六进制数, 转成十进制为65536
    • 10000(65439) - FF9F(65536) = 97此时已经是正确数据, 然后因为高位为1, 为负数, 则进行取反操作
    • 取反后则变成-97, 数据再除10就得到正确数据-9.7℃
    • 以上操作基于负数补码进行的
  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于Python RS485传感器数据处理,可以按照以下步骤进行操作: 1. 首先,安装`serial`包以支持串口通信。 2. 引入所需的模块,例如`serial`、`time`、`string`、`binascii`和`threading`。 3. 定义一个函数,例如`timerDelay()`,用于周期性采集传感器数据。 4. 在函数中,初始化串口对象,例如`s = serial.Serial('/dev/ttyUSB0', 4800)`,其中`'/dev/ttyUSB0'`是串口设备的路径,`4800`是波特率。 5. 使用`s.inWaiting()`方法采集缓冲数据,并判断是否有数据可读。 6. 如果有数据可读,使用`binascii.b2a_hex(s.read(n))`方法读取数据,并转换为十六进制字符串格式。 7. 根据数据格式解析出温度和湿度信息,并进行相应的转换和计算。 8. 打印输出温度和湿度信息。 9. 使用`s.write(d)`方法向传感器发送命令。 10. 关闭串口连接,`s.close()`。 11. 创建一个定时器对象,例如`q = threading.Timer(2, timerDelay)`,表示每2秒执行一次`timerDelay()`函数。 12. 启动定时器,`q.start()`。 13. 如果需要传递一个数据的时间间隔,可以使用`q = threading.Timer(10, timerDelay)`,其中`10`表示传递一个数据的时间。 14. 最后,根据自己的操作系统和设备情况,确保安装了必要的驱动程序。 这样,你就可以使用Python处理RS485传感器的数据了。请注意根据实际情况调整代码中的串口设备路径、波特率和命令等参数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python读取RS485接口的TH10S-B温度传感器数据](https://blog.csdn.net/java_raylu/article/details/125663712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [用python采集RS485温湿度传感器信息](https://blog.csdn.net/weixin_43042621/article/details/82012597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值