通过modbus协议读取传感器数值(32字符)

32 位数表示时是使⽤两个相邻的寄存器合并为组成为⼀个 32 位数字,其中地址⼩的寄存器为 32 位数字中的低字。在主机编程时应注意⾼低字的配置,否则会造成读取出来的数字错误。

谨记:所有 32 位寄存器的读写应按照 32 位有符号⽅式进⾏操作,虽然有些时候以 16 位⽅式只读取 32 位寄存器中 的低字显示是正确的,但是这样做在负数、⼤数字的时候往往会存在显示异常。

我们想要读取传感器的数值,就需要通过串口连接Android开发板的底层系统。minicom是一个常用串口连接终端软件,在命令行终端下通过文本界面进行操作使用。

本篇文章我们使用python读取modbus协议传感器,首先要安装minicom

sudo apt install minicom

在连接上传感器后,我们通过以下命令行来查看我们的传感器名称(一般ttyUSB居多)

ls -l /dev/ttyUSB*

 此时我们可以看到我们的是ttyUSB0

然后我们打开minicom的参数设置

sudo minicom -s

 会出现一些选项,此时我们通过方向键来选择第三个,回车进去

根据前面的大写字母,比如我们要改设备名称,直接摁“A”来进行修改,改成我们刚刚查到的设备名称,即/dev/ttyUSB0 ,修改完如下图

然后查看我们的传感器的波特率,数据位,停止位。然后跟我们的“E”选项进行匹配,我的波特率是9600,数据为是8,停止位是1。修改完毕后摁两次回车返回最开始的选择界面,控制方向键选择第六个即“Save setup as dfl”

接下来我们开始打开终端,进入环境。安装minimalmodbus库

pip install minimalmodbus -i https://pypi.tuna.tsinghua.edu.cn/simple 

安装完毕后把下面代码复制上去运行 ,即可在终端看到读取的数值了,运行的时候注释掉time.sleep(1),就可以进行实时读取了

import minimalmodbus
import time
inst = minimalmodbus.Instrument('/dev/ttyUSB0', 1)
inst.serial.baudrate = 9600
inst.serial.timeout = 1
while True:
    try:
        register_0_value = int(inst.read_register(0, 0, 3, signed=True))
        register_1_value = int(inst.read_register(1, 0, 3, signed=True))
        merged_value = (register_1_value << 16) | (register_0_value & 0xFFFF)
        print('32merged_value',(merged_value/10))
    except minimalmodbus.InvalidResponseError:
        print('error')
        
    time.sleep(1)

下面终端处是我运行代码读取的数值,因为我是从体重称上面拆下来的没有对其进行归零,所以呈负数

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值