分享

单片机Modbus RTU实验成功

 hmc688 2012-04-07

电脑上位机调试 使用的是 ModbusV1.024(Modbus调试精灵-调试专用工具)

功能码 03

功能码 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)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多