首页 > 其他分享 >modbus和字节序

modbus和字节序

时间:2024-04-25 10:12:25浏览次数:34  
标签:十六进制 顺序 字节 数值 modbus 内存 endian

numconvert软件上显示的十六进制是大端顺序,即数值顺序。

modbus协议规定是按大端传输(见英文版说明),但是确切的说,它只是借用“大端”这个术语以表示它是由左往右依次字节传输的,因为毕竟大小端只有到了数值层面才有意义。

针对16位传输,只存在正序(AB)或反序(BA)两种方式。

针对双字32位数据传输,存在四种顺序方式:

Big-endian :ABCD
Little-endian :DCBA
Big-endian byte swap :BADC
Little-endian byte swap :CDAB
ModbusSlave软件,它传输的顺序就是它显示的十六进制字节顺序,也即,对于一个寄存器中的数值来说,无论显示还是传输,都是它的大端序。

ModbusSlave软件,可以设置浮点数格式,如果设置为Little-endian byte swap,也就是先把四个字节调换为小端DCBA,再把字内部字节调换回大端,例如浮点数65.253,其数值即大端序为0x42828189,当在ModbusSlave上设置值为65.253后,切换为十六进制会看到,其两个寄存器先后是0x8189 0x4282。

ModbusSlave软件,要把一个浮点数切换为十六进制显示,需要按住ctrl键,选中它所占用的两个寄存器。

使用libmodbus库时,调用它的uint16_t相关接收函数时,它自动对每个字(注意,仅仅是字,即两字节,而不是四字节)在内存层面进行了高低字节转换,此时数据在内存中每个字的两个字节跟发送端顺序是对调了的,那么因此,字的数值顺序看上去反而是跟发送端顺序一致的,这个过程可以表示为[以数值4为例,程序以小端序0x0400赋值-->程序会按大端序0x0004发送-->libmodbus自动又转回小端序0x0400],在ModbusSlave软件上把一个寄存器赋值为4,看到十六进制显示的是0x0004,是因为它是直接按大端显示的,实际上相当于“程序以小端序0x0400赋值”,总之一句话,用了libmodbus后,无需再执行ntohs啥的进行转换,拿到的就是发送程序的;由于位运算用的是数值顺序而不是内存顺序,因此在做位运算时直接以发送端顺序为参照做即可,这一点尤其注意。

在使用printf(%04x)打印字时,它是把整个字看作一个整体,按大端输出的,即你看到的顺序跟内存中的顺序是反着的,这一点尤其在做位运算的时候注意迷惑性:
uint16_t d;
printf("[%04x]\n", d); // 输出的是大端,即跟内存中顺序相反

如果要按内存中的顺序打印,则应当使用printf(%02x)逐个字节打印:
printf("[%02x][%02x]\n", *((unsigned char *)(&d)), *((unsigned char *)(&d) + 1));

大小端转换可以使用htons和ntohs,并且对于大小端转换来说,它俩效果是一样的,用哪个都行。

位运算用的是数值顺序而不是内存顺序,这一点尤其在做位运算的时候需要注意。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/dyzhen/article/details/135980360

标签:十六进制,顺序,字节,数值,modbus,内存,endian
From: https://www.cnblogs.com/myibm/p/18156971

相关文章

  • Modbus转Profinet网关接电表与工控机通讯
    Modbus转Profinet网关(XD-MDPN100/300)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议,支持ModbusRTU主站/从站,并可以与RS485接口的设备,如变频器、智能高低压电器、电量测量装置等进行连接。同时,它自带网口和串口,......
  • Modbus转Profinet网关接称重设备与工控机通讯
    Modbus转Profinet网关接称重设备与工控机通讯Modbus转Profinet网关(XD-MDPN100)是一种能够实现Modbus协议和Profinet协议之间转换的设备。Modbus转Profinet网关可提供单个或多个RS485接口,使得不同设备之间可以顺利进行通信,进一步提升了工业自动化程度。通过使用Modbus转Profinet网关......
  • 字节面试:如何解决MQ消息积压问题?
    MQ(MessageQueue)消息积压问题指的是在消息队列中累积了大量未处理的消息,导致消息队列中的消息积压严重,超出系统处理能力,影响系统性能和稳定性的现象。1.消息积压是哪个环节的问题?MQ执行有三大阶段:消息生产阶段。消息存储阶段。消息消费阶段。很显然,消息堆积是出现在第三......
  • 如何解决Modbus转Profinet网关无法识别或连接Modbus设备
    Modbus转Profinet网关(XD-MDPN100)是一种用于工业自动化领域的设备,主要实现Modbus和Profinet之间的数据转换和传输。Modbus转Profinet网关(XD-MDPN100)不仅具有将Modbus协议转换为Profinet协议的功能,还具有RS485/232接口,使得不同厂商的设备之间能够连接实现通信和数据交换,从而提高系统......
  • Python字节转换为字符串 - 如何将字符串转换为字节,以及反向转换
    你可以在Python中使用字节来表示二进制形式的数据。在本文中,你将学习如何将字节转换为字符串,以及反之亦然。在我们看转换之前,让我们谈谈Python中的字节是如何工作的。如果你已经理解了这一点,或者只是对转换感兴趣,你可以跳到下一节。(本文视频讲解:java567.com)Python中的字节是如......
  • C# Modbus协议 几种常用格式
    ModbusRTU:物理层:ModbusRTU使用串口进行通信,常用的接口包括RS-232和RS-485。RS-485允许多个设备在同一总线上进行通信。数据格式:ModbusRTU使用二进制数据格式,将数据转换为16进制数,每个字节都包含8位数据。数据帧包括地址字段、功能码、数据域和错误检验等。传输方式:ModbusRTU......
  • 字节面试:领域、子域、核心域、通用域和支撑域怎么划分?
    领域驱动设计(DDD)里面有一堆专业术语,比如领域、子域、核心域、通用域、支撑域等等,听着是不是觉得挺吓人?别怕,我来带你轻松搞懂它们。如何理解领域和子域?领域是指一定的业务范围或问题域。在解决业务问题时,DDD会将业务领域进行细分,将问题范围限定在一定的边界内,在这个边界内建立领......
  • 翻译|指针很复杂,或者说:字节里究竟有什么?
    本文原作者:RalfJung,原文地址:https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html今天夏天,我再次完全使用Rust开发,并致力于(除其他事项外)为Rust/MIR开发一个“内存模型”。不过,在谈论我今年的想法之前,我终于要花点时间打破“指针很简单:他们只是一些整数”的神话了。......
  • C# NModbus 4 demo
    1.添加modbus程序包 2.创建 ModbusSerialMaster 实例对象 privatestaticModbusSerialMasterCreateModbusRtu(){SerialPortport=newSerialPort();port.PortName="COM11";port.BaudRate=9600;......
  • [Java SE] 经典问题:超出Java Long型(8字节/64位)的二进制比特流数据如何进行大数的数
    0问题描述经典问题:超出JavaLong型(8字节/64位)的二进制比特流数据如何进行大数的数值计算?近期工作上遇到了这个问题:需要将一个无符号数、且位长>=8字节(等于8字节时,首位bit为1,其他bit不全为0)的二进制字符串转为Java****对象(原始整数),进行整型运算、或浮点数运算浮点运算......