Modbus协议数据读取!

a995733 2014-07-01 11:00:25
我使用VC mfc想做一个简单的气压读取小串口。气压表是使用的modbus协议写的,接收到的十六进制数据为:02 03 02 0F 1D XX XX;02为仪表ID,03是功能代码,02是读取字节数,0F 1D为需要读取的电流值,XX XX为前面数据的CRC码。问题是:我怎么 把0F 1D(电流值)正确的读取出来?
...全文
3137 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc8fans 2014-07-27
  • 打赏
  • 举报
回复
常用用MFC VC6弄这东西,, 两种方法1,用指针,2,数组,, N年以前例子: UCHAR cBuf[7]; //串口已经收到字符 cBuf[0] = 02; cBuf[1] = 03 cBuf[2] = 02 cBuf[3] = 0F; //高字节 cBuf[4] = 1D; //低字节 .... int nValue = cBuf[3]*256+cBuf[4]; double dwValue = (nValue - 4)/0.1333; //我这是转4-20ma模块
zaxife 2014-07-25
  • 打赏
  • 举报
回复
其实,简单通讯这种小软件,建议还是用VB写更实在,直接调用串口控件,配置串口控件,初始化数据帧发送出去后就等待接收中断接收数据。
zaxife 2014-07-25
  • 打赏
  • 举报
回复
既然是标准的modbus rtu数据帧,那么返回数据是02 03 02 0F 1D xx xx的话,读取的保持寄存器的数据帧范围会很宽,可以从0x00~0xFFFF全范围寻址。 请求数据帧是02 03 00 00 00 01 xx xx ....... 02 03 00 01 00 01 xx xx....... 02 03 FF FF 00 01 xx xx。 只能从00 00 地址开始每次寄存器地址增1尝试了。
萧凯 2014-07-09
  • 打赏
  • 举报
回复
首先,你应该了解气压表数据帧是如何编码的,知道怎么编码,就知道如何解码。
张三san 2014-07-05
  • 打赏
  • 举报
回复
int iCurrent;//电流值
int RxLength;//数据包长度
char RxBuf[20];//数据包

void crc16(unsigned char *buf,unsigned char len, unsigned char CrcResult[2]);

if(RxLength!=7)//长度判断
	return;
crc16(RxBuf,RxLength-2,crc);//校验判断
if(crc[0]!=RxBuf[5] || crc[1]!=RxBuf[6])
	return;
if(RxBuf[0]!=0x02 || RxBuf[1]!=0x03 || RxBuf[2]!=0x02)//地址、命令及长度判断
	return;
iCurrent =Buf[0];iInstantFlow<<=8;
iCurrent+=Buf[1];//电流值数据获取
张三san 2014-07-05
  • 打赏
  • 举报
回复
供参考: int iCurrent;//电流值 int RxLength;//数据包长度 char RxBuf[20];//数据包 void crc16(unsigned char *buf,unsigned char len, unsigned char CrcResult[2]); if(RxLength!=7)//长度判断 return; crc16(RxBuf,RxLength-2,crc);//校验判断 if(crc[0]!=RxBuf[5] || crc[1]!=RxBuf[6]) return; if(RxBuf[0]!=0x02 || RxBuf[1]!=0x03 || RxBuf[2]!=0x02)//地址、命令及长度判断 return; iCurrent =Buf[0];iInstantFlow<<=8; iCurrent+=Buf[1];//电流值数据获取
f27ny105t5123 2014-07-04
  • 打赏
  • 举报
回复
一个一个if下去 if 设备ID正确 那么继续if 下一个十六进制是否正确 直到最后一个正确 执行对应动作 如果任何一个有错 返回对应error code 以前写过modbus rtu 看了好久……
a995733 2014-07-03
  • 打赏
  • 举报
回复
是的,但是具体函数不知怎么写?
x_j_w1125 2014-07-03
  • 打赏
  • 举报
回复
#2楼正解 看气压表的读出数据代表什么意思来解析这个数据就行了!
zhxianbin 2014-07-02
  • 打赏
  • 举报
回复
02为仪表ID,03是功能代码(正确返回是 03,错误返回是 03+128),02是数据字节数 所以从数据字节数后面开始有这么多个字节的数据表示电流
dceacho 2014-07-01
  • 打赏
  • 举报
回复

int current;
if(sbuf[0]==2 && sbuf[1]==3 && CRC校验正确)
{
  current=sbuf[3];
  current<<=8;
  current|=sbuf[4];
}
你想这样?
woshi_ziyu 2014-07-01
  • 打赏
  • 举报
回复
你要看气压表对应的通讯协议 上面会说明 0F 1D(电流值)代表的意思 以前做的时候这个字段代表的电流值应该是 0x0F1D*1.68750

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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