电脑上位机调试 使用的是 ModbusV1.024(Modbus调试精灵-调试专用工具)
功能码 06
部分程序
// 串行中断程序 void commIntProc() interrupt 4 { if(TI) { TI = 0; if(sendPosi < sendCount) { sendPosi++; ACC = sendBuf[sendPosi]; TB8 = P; //加上校验位 SBUF = sendBuf[sendPosi]; } else { receCount = 0; //清接收地址偏移寄存器 checkoutError = 0; } } else if(RI) { RI = 0; receTimeOut = 10; //通讯超时值 receBuf[receCount] = SBUF; ACC = receBuf[receCount]; if(P != RB8) checkoutError = 2; //偶校验出错 receCount++; //接收地址偏移寄存器加1 receCount &= 0x0f; //最多一次只能接收16个字节 }
} // void CommIntProc()
//初始化串口 void initUart(void) { //T2 用于波特率 9600 T2CON = 0x30; RCAP2H = 0xff; RCAP2L = 0xdc; //0xb8; TR2 = 1; //start
//偶校验 SCON = 0xd0; //uart模式3 9位 (8位数据+ 校验) PCON = 0; ES = 1; }//void initUart(void)
void main(void) { initProg();
while(1) { timeProc(); checkComm0Modbus(); CheckKeys(); WDT_CONTR = 0x3c;//看门狗 喂狗
}
}
//检查uart0数据 只实现了 功能码03 06 读写 单个寄存器(16位的) void checkComm0Modbus(void) { uint16 crcData; //uint16 tempData;
if(receCount > 4) { switch(receBuf[1]) { case 3://读取保持寄存器(一个或多个) case 6://设置单个寄存器 if(receCount >= 8) {//接收完成一组数据 //应该关闭接收中断 if(receBuf[0]==localAddr && checkoutError==0) { crcData = crc16(receBuf,6); if(crcData == receBuf[7]+(receBuf[6]<<8)) {//校验正确 if(receBuf[1] == 3) //###################### {//读取保持寄存器(一个或多个) readRegisters(); } else if(receBuf[1] == 6)//######################### {//预置单寄存器 把具体二进值装入一个保持寄存器 presetSingleRegister(); }
} } receCount = 0; checkoutError = 0; } break; default: break; } } }//void checkComm0(void)
|