日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

STM32与宇电设备实现AI-BUS通讯

發布時間:2024/7/23 ChatGpt 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32与宇电设备实现AI-BUS通讯 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

宇電的設備使用基于RS-485的自定義協議,協議本身比較簡單,只有2條指令:

讀:地址代號+52H82 +要讀的參數代號+0+0+校驗碼

寫:地址代號+43H67+要寫的參數代號+寫入數低字節+寫入數高字節+校驗碼

校驗碼采用 16 位求和校驗方式,其中讀指令的校驗碼計算方法為:要讀參數的代號×256+82+ADDR。

寫指令的校驗碼計算方法為以下公式做 16 位二進制加法計算得出的余數(溢出部分不處理):要寫的參數代號×256+67+要寫的參數值+ADDR。

返回的數據格式更是固定的,無論是讀還是寫,儀表都返回以下10個字節數據:測量值 PV+給定值 SV+輸出值 MV 及報警狀態+所讀/寫參數值+校驗碼。

其中 PV、 SV 及所讀參數值均各占 2 個字節,代表一個 16 位二進制有符號補碼整數,低位字節在前,高位字節在后,整數無法表示小數點,要求用戶在上位機處理; MV 占一個字節,按 8 位有符號二進制數格式,數值范圍-110~+110,狀態位占一個字節,校驗碼占 2 個字節,共 10 個字節。

而返回的校驗碼計算則是:PV+SV+(報警狀態*256+MV)+參數值+ADDR。清楚協議的這些規則后,編寫程序只是順理成章的事。直接上代碼:

/*讀取目標設備的參數值*/ void ReadAiBusDeviceParameter(uint8_t deviceAddr,uint8_t paraAddr,void (*AiBusSendByte)(uint8_t *,uint16_t)) {uint8_t readCommand[INSTRUCTION_LENGTH];uint16_t index=0;readCommand[index++]=0x80+deviceAddr;readCommand[index++]=0x80+deviceAddr;readCommand[index++]=READ_INSTRUCTION;readCommand[index++]=paraAddr;readCommand[index++]=0x0;readCommand[index++]=0x0;uint16_t checkSum=(uint16_t)paraAddr*256+READ_INSTRUCTION+(uint16_t)deviceAddr;readCommand[index++]=checkSum;readCommand[index++]=(checkSum>>8);AiBusSendByte(readCommand,INSTRUCTION_LENGTH); }/*設置目標設備的參數值*/ void WriteAiBusDeviceParameter(uint8_t deviceAddr,uint8_t paraAddr,uint16_t data,void (*AiBusSendByte)(uint8_t *,uint16_t)) {uint8_t writeCommand[INSTRUCTION_LENGTH];uint16_t index=0;writeCommand[index++]=0x80+deviceAddr;writeCommand[index++]=0x80+deviceAddr;writeCommand[index++]=WRITE_INSTRUCTION;writeCommand[index++]=paraAddr;writeCommand[index++]=data;writeCommand[index++]=(data>>8);uint16_t checkSum=(uint16_t)paraAddr*256+WRITE_INSTRUCTION+(uint16_t)deviceAddr+data;writeCommand[index++]=checkSum;writeCommand[index++]=(checkSum>>8);AiBusSendByte(writeCommand,INSTRUCTION_LENGTH); }/*解析返回數據,返回值為讀或者寫的參數值*/ int ParsingReturnData(uint8_t *receiveData,uint16_t *returnData,uint8_t *deviceAddr,uint16_t deviceNum) {int status=-1;uint16_t pValue=0;uint16_t sValue=0;uint16_t mValue=0;uint16_t alarmStatus=0;uint16_t paraValue=0;uint16_t checkSum=0;pValue=receiveData[0]+receiveData[1]*256;sValue=receiveData[2]+receiveData[3]*256;mValue=(uint16_t)receiveData[4];alarmStatus=(uint16_t)receiveData[5];paraValue=receiveData[6]+receiveData[7]*256;checkSum=receiveData[8]+receiveData[9]*256;uint16_t chk=pValue+sValue+alarmStatus*256+mValue+paraValue;for(int i=0;i<deviceNum;i++){if(checkSum==chk+deviceAddr[i]){status=i;returnData[0]=pValue;returnData[1]=sValue;returnData[2]=mValue;returnData[3]=alarmStatus;returnData[4]=paraValue;break;}}return status; }

歡迎關注:

總結

以上是生活随笔為你收集整理的STM32与宇电设备实现AI-BUS通讯的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。