注:此为本人使用的ModBus协议,对其他使用者参考价值不大
1.相关文件(如modbus_slave.h,modbus_slave.c等)移入文件夹(一般是user),加入路径
2.轮询方式,将"MODS_Poll();"加入while(1)中,可能会因程序原因无法及时接收到数据,可隔几行加一个"MODS_Poll();"
3.tim中断中写入代码段,定时器可以用任意,但建议用tim3,因modbus_slave.c中用的是tim3
extern __IO uint8_t g_mods_timeout;
void TIM3_IRQHandler(void)//TIMER3中断服务函数
{
u8 num;
if( TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET )//检测到TIMER3中断标志位不为0
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中断标志位
g_mods_timeout=1;
if(ledShowtick)
ledShowtick--;
if(ledShowtick==1)
SetLed(1,1);
TIM_Cmd(TIM3,DISABLE); //使能定时器3
}
}
4.如遇接收错误,可能是"MODS_03H(void)"函数中reg_value缓存不够大,
5.如在读、写寄存器时异常跳出,可能是地址错误,虽然看起来数字没问题,但建议在keil中重新打一遍,也许有用(可能是不同编辑器中字符编码的问题?)
6.有些变量在modbus中用到,在include.h中声明后,还需定义
7.注意include中的变量前有EXT(extern),
#ifdef __GLOBALS__
#define EXT
#else
#define EXT extern
#endif
若宏定义"__GLOBALS__",则有EXT的变量将会被声明为全局变量;若宏定义"__GLOBALS__"在main()函数前,则EXT变量将会被声明为本工程内所有代码的全局变量。