新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機的MODBUS C語言程序(從機)

        51單片機的MODBUS C語言程序(從機)

        作者: 時間:2016-11-28 來源:網絡 收藏

        //檢查uart0數據
        void checkComm0Modbus(void)
        {
        uint16 crcData;
        uint16 tempData;
        if(receCount > 4)
        {
        switch(receBuf[1])
        {
        case 1://讀取線圈狀態(讀取點 16位以內)
        case 3://讀取保持寄存器(一個或多個)
        case 5://強制單個線圈
        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] == 1)
        {//讀取線圈狀態(讀取點 16位以內)
        readCoil();
        }
        else if(receBuf[1] == 3)
        {//讀取保持寄存器(一個或多個)
        readRegisters();
        }
        else if(receBuf[1] == 5)
        {//強制單個線圈
        forceSingleCoil();
        }
        else if(receBuf[1] == 6)
        {
        //presetSingleRegister();
        }
        }
        }
        receCount = 0;
        checkoutError = 0;
        }
        break;
        case 15://設置多個線圈
        tempData = receBuf[6];
        tempData += 9; //數據個數
        if(receCount >= tempData)
        {
        if(receBuf[0]==localAddr && checkoutError==0)
        {
        crcData = crc16(receBuf,tempData-2);
        if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
        {
        //forceMultipleCoils();
        }
        }
        receCount = 0;
        checkoutError = 0;
        }
        break;
        case 16://設置多個寄存器
        tempData = (receBuf[4]<<8) + receBuf[5];
        tempData = tempData // 2; //數據個數
        tempData += 9;
        if(receCount >= tempData)
        {
        if(receBuf[0]==localAddr && checkoutError==0)
        {
        crcData = crc16(receBuf,tempData-2);
        if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
        {
        presetMultipleRegisters();
        }
        }
        receCount = 0;
        checkoutError = 0;
        }
        break;
        default:
        break;
        }
        }
        }//void checkComm0(void)
        //取線圈狀態 返回0表示成功
        uint16 getCoilVal(uint16 addr,uint16 //tempData)
        {
        uint16 result = 0;
        uint16 tempAddr;
        tempAddr = addr & 0xfff;
        //只取低8位地址
        switch(tempAddr & 0xff)
        {
        case 0:
        break;
        case 1:
        //tempData = testCoil;
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
        case 5:
        break;
        case 6:
        break;
        case 7:
        break;
        case 8:
        break;
        case 9:
        break;
        case 10:
        break;
        case 11:
        break;
        case 12:
        break;
        case 13:
        break;
        case 14:
        break;
        case 15:
        break;
        case 16:
        break;
        default:
        break;
        }
        return result;
        }//uint16 getCoilVal(uint16 addr,uint16 //data)
        //設定線圈狀態 返回0表示成功
        uint16 setCoilVal(uint16 addr,uint16 tempData)
        {
        uint16 result = 0;
        uint16 tempAddr;
        tempAddr = addr & 0xfff;
        switch(tempAddr & 0xff)
        {
        case 0:
        break;
        case 1:
        testCoil = tempData;
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
        case 5:
        break;
        case 6:
        break;
        case 7:
        break;
        case 8:
        break;
        case 9:
        break;
        case 10:
        break;
        case 11:
        break;
        case 12:
        break;
        case 13:
        break;
        case 14:
        break;
        case 15:
        break;
        case 16:
        break;
        default:
        break;
        }
        return result;
        }//uint16 setCoilVal(uint16 addr,uint16 data)
        //取寄存器值 返回0表示成功
        uint16 getRegisterVal(uint16 addr,uint16 //tempData)
        {
        uint16 result = 0;
        uint16 tempAddr;
        tempAddr = addr & 0xfff;
        switch(tempAddr & 0xff)
        {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
        case 5:
        break;
        case 6:
        break;
        case 7:
        break;
        case 8:
        break;
        case 9:
        break;
        case 10:
        break;
        case 11:
        break;
        case 12:
        break;
        case 13:
        break;
        case 14:
        break;
        case 15:
        break;
        case 16:
        //tempData = testRegister;
        break;
        default:
        break;
        }
        return result;
        }//uint16 getRegisterVal(uint16 addr,uint16 &data)
        //設置寄存器值 返回0表示成功
        uint16 setRegisterVal(uint16 addr,uint16 tempData)
        {
        uint16 result = 0;
        uint16 tempAddr;
        tempAddr = addr & 0xfff;
        switch(tempAddr & 0xff)
        {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
        case 5:
        break;
        case 6:
        break;
        case 7:
        break;
        case 8:
        break;
        case 9:
        break;
        case 10:
        break;
        case 11:
        break;
        case 12:
        break;
        case 13:
        break;
        case 14:
        break;
        case 15:
        break;
        case 16:
        testRegister = tempData;
        break;
        default:
        break;
        }
        return result;
        }

        上一頁 1 2 下一頁

        關鍵詞: 51單片機MODBUSC語

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永和县| 拜城县| 丰县| 仙游县| 山东省| 巍山| 遂昌县| 峨眉山市| 杨浦区| 大邑县| 亚东县| 临洮县| 深水埗区| 沙雅县| 若羌县| 铜川市| 蒲江县| 尤溪县| 太谷县| 文水县| 元阳县| 新建县| 禄劝| 资兴市| 绍兴市| 拜城县| 开封市| 紫云| 临清市| 海伦市| 博罗县| 辽阳县| 增城市| 鲜城| 无为县| 岳阳市| 宝丰县| 津市市| 东兰县| 田林县| 梁山县|