Modbus RTU 解析接收到的byte[] 数组该如何解析成十进制数?

Tidal_Choidi 2018-04-24 09:36:00
串口RS485Modbus 通讯协议,下行数据帧是功能码为3的读从站的保持寄存器。读两个寄存器地址,从站返回四个字节的数据。


问题:接收到缓冲区是包含了4个byte类型的十进制数据,如:00,00,18,64.请问,可以通过什么办法将左边的四个byte类型的数据拼接成一个十进制数据? 我尝试着用 BitConvert.toInt(recBuffer,0)这个方法进行转换,实际转换出来的结果不对。上面的四个数据实际上已经是十进制的数了,能不能有一种办法把上面的四个byte类型数据拼接成一个十进制数?
...全文
1914 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwqwag 2018-04-25
  • 打赏
  • 举报
回复
高低位互换应该就可以了
xuzuning 2018-04-25
  • 打赏
  • 举报
回复
            var b = new byte[] { 00, 00, 18, 64 }; //大端序
            var n = BitConverter.ToInt32(b, 0);//直接转换
            Console.WriteLine(n);//1074921472 结果不对 
            Console.WriteLine(BitConverter.ToInt32(b.Reverse().ToArray(), 0));//转置后转换 4672
            Console.WriteLine(System.Net.IPAddress.NetworkToHostOrder(n));//网络转本地 4672
            Console.WriteLine((((b[0] * 256) + b[1]) * 256 + b[2]) * 256 + b[3]); //验算 4672
具体情况要具体分析。显然你是不会一次只收到这4个字节的 用连续的 BitConvert.toInt(recBuffer,offs) 读取出所有的整形数后,再转成本地的比较稳妥
  • 打赏
  • 举报
回复
Array.Reverse(recBuffer) 转一下再调BitConverter.ToUInt16
秋的红果实 2018-04-25
  • 打赏
  • 举报
回复
据我所知,RTU模式下,是16进制数,以二进制串方式传输的 能不能有一种办法把上面的四个byte类型数据拼接成一个十进制数? ==> 需要说出拼接的方式
xuzuning 2018-04-25
  • 打赏
  • 举报
回复
c#直接提供了网络字节序转换方法。 System.Net.IPAddress.HostToNetworkOrder(本机到网络转换) System.Net.IPAddress.NetworkToHostOrder(网络字节转成本机)
toto0805 2018-04-25
  • 打赏
  • 举报
回复
C#要先将字符转成无符号短整。然后把高低位调换后赋值给一个32位的int
toto0805 2018-04-25
  • 打赏
  • 举报
回复
在C里搞过 rbuf是接受的字节;四个ziyji int mdbadr=0,LoHex=0,HiHex=0;//寄存器起始地址,地址高位,地址地位 int mdbqty=0,qLoHex=0,qHiHex=0;//寄存器数量,寄存器数量地位,寄存数量器高位 LoHex=rbuf[3] ; HiHex=rbuf[2] ; mdbradr=HiHex<<8|LoHex;//寄存器起始地址的高位低位合并 qLoHex=rbuf[5] ; qHiHex=rbuf[4] ; mdbqty=qHiHex<<8|qLoHex;//寄存器数量的高位低位合并
xuzuning 2018-04-24
  • 打赏
  • 举报
回复
计算机里多是低位在前,通讯中多是高位在前

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧