综合ModBus协议规范和磁致伸缩位移传感器应用场合,编程实现基本参数设定、参数校正、起点位置、终点位置和当前数据读取的功能。采用单片机内部串口接收数据,并解析收到的信息帧。若信息帧的地址域值与本机地址相同,则解析信息帧的功能代码。根据不同的功能代码,将各个字节排序,组成一帧信息发送到ModBus网络上。ModBus协议C语言程序实现流程图如图1所示。
数据帧的接收通过单片机串口中断子函数来完成。接收数据完成后,置位新数据到来标志。主程序中循环查询新数据到来标志,若有新数据到来,则进行数据帧解析,数据帧生成以及数据帧发送等工作。数据帧校验采用CRC校验来完成,保证了ModBus数据发送与接收的正确性。关键代码如下:
UBRRH=0x00;
UBRRL=Ox33;//波特率9600
UCSRC=OxOE;//异步通讯方式,8位数据,2位停止位
UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);//开启接收中断
UCSRA=0x00;//不使用倍速模式
串口工作模式一设置如上代码所示,按照一定的顺序将数据帧通过串口发送出去。本设计采用CRC校验,其关键代码如下:
unsigned int uchCRCHi=OxFF;//高CRC字节初始化
unsigned int uchCRCLo=OxFF;//低CRC字竹初始化
unsigned int ulndex ; //CRC循环中的索引
while (usDataLen一)//计算CRC值
{
ulndex=uchCRCHi ^ *puchMsg++;
uchCRCHi=uchCRCLo ^ auchCRCHi[ulndex];
uchCRCLo=auchCRCLo[ulndex};
}
return (uchCRCHi<<8|uchCRCLo);//返回CRC值
由于本设计采用RS232物理连接方式,磁致伸缩位移传感器可直接与电脑连接实现ModBus数据和命令的传输。