论坛元老
 
- 积分
- 3083
- 金钱
- 3083
- 注册时间
- 2014-7-19
- 在线时间
- 413 小时
|

楼主 |
发表于 2016-4-21 19:04:22
|
显示全部楼层
[mw_shl_code=c,true]/******************************************************************************
** 功能: MODBUS 数据帧解析函数
** 参数: void
** 返回值: void
** 说明: 无
********************************************************************************/
void ParseRecieve(void)
{
u8 crcDataHi;
u8 crcDataLo;
u8 j;
if(ReceBuf[0] == 0x01) //设备地址是否匹配 站号 00
{
crcData = crc16(ReceBuf,usDataLen);//从接收到的数据帧中获取CRC
crcDataLo = crcData/256; // 132 84 crc低
crcDataHi = crcData%256; // 10 0A crc
if((crcDataHi == ReceBuf[usDataLen+1])&&(crcDataLo == ReceBuf[usDataLen] ))//CRC校验
{
if(ReceBuf[1] == 0x03)//功能号0x03
{
start_addr = ReceBuf[3] | (ReceBuf[2] << 8);//起始寄存器地址
reg_num = ReceBuf[5] | (ReceBuf[4] << 8);//寄存器数量
Read_Answer(start_addr,XBUF,reg_num);
}
if(ReceBuf[1] == 0x10)//功能号0x10
{
start_addr = ReceBuf[3] | (ReceBuf[2] << 8);//起始寄存器地址
reg_num = ReceBuf[5] | (ReceBuf[4] << 8);//寄存器数量
if( start_addr <= 99)//
{
for(j = 0; j < reg_num; j++)
{
XBUF[start_addr+j] = (ReceBuf[2*j+8] | (ReceBuf[2*j+7] << 8));
xbuf[2*(start_addr+j)] = (XBUF[start_addr+j] >> 8);
xbuf[2*(start_addr+j)+1] = (XBUF[start_addr+j] & 0x00FF);
SPI_FLASH_Erase_Sector((start_addr+j)*4096);
SPI_FLASH_PageWrite(xbuf+2*(start_addr+j),(start_addr+j)*4096,2);
}
WriteAnswer();
}[/mw_shl_code]
|
|