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