|
楼主 |
发表于 2013-11-8 22:10:51
|
显示全部楼层
本帖最后由 oldbeginner 于 2013-11-9 16:32 编辑
小结一下报文再继续
例子
STX , CMD , ADDRESS, BYTES, ETX, SUM
02H, 30H, 31H,30H,46H,36H, 30H,34H, 03H, 37H,34H
指令解释如下:
STX, "E01", "10F6", "04", ETX, "74"
报文开始, 读命令, 地址10F6H处, 04H字节数据, 报文结束, 累加方式和校验
Buffer[0] Buffer[1:3] Buffer[4:7] Buffer[8:9] Buffer[10] Buffer[11:12]
其中 SUM=CMD+......+ETX=30h+31h+30h+46h+36h+30h+34h+03h=74h;
累加和超过两位取低两位,转换成ascii码,分 SUM(upper),SUM(lower)二次传送。
Buffer[11] Buffer[12]
边研究代码边学习协议看起来可行。
进入Read code的第二部分
// 计算得到读取字节数:
for(i=8;i<10;i++)Buffer=ascto0F(Buffer);
ReadLen = Buffer[8]*16+Buffer[9];
UartSendchar(STX)
首先
for(i=8;i<10;i++)
Buffer=ascto0F(Buffer);
得到Buffer[8]和Buffer[9]转换值,在上面的报文协议中可知,Buffer[8]和Buffer[9]表示要读出的字节数,
剩余代码,
ReadLen = Buffer[8]*16+Buffer[9];
UartSendchar(STX);
其中,
ReadLen是定义在这个通讯函数内部的局部变量, unsigned char ReadLen=0;
因为Buffer[8]和Buffer[9]组成一个16位的数,保存要读取的字节数,高位是Buffer[8],所以Buffer[8]*16就是高位的值,再加上Buffer[9]就完整了。
然后
UartSendchar(STX);
根据字面理解,串口发出STX指令,需要确认一下协议和该函数的定义。
// 函数名称: UartSendchar
//uart.c中定义
// 功能描述:放入一个字节到发送缓冲区
UartSendchar这个函数代码有点多,暂时了解功能即可,继续研究协议,为什么要发送STX。
找到定义(FX1N.h)
#define ENQ 0x05 //请求
#define ACK 0x06 //PLC 接收正确响应
#define NACK 0x15 //PLC 接收错误响应
#define STX 0x02 //报文开始
#define ETX 0x03 //报文结束
PLC回答是以STX开头的,这也可以理解了。
可以进入Read code第三部分了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|