|
本帖最后由 Andrew888 于 2020-3-18 11:54 編輯
一、本項(xiàng)目意義:實(shí)現(xiàn)通過USART通信,通過幀信息控制通過信號(hào)機(jī)狀態(tài),可以設(shè)置燈絲故障,設(shè)置區(qū)間狀態(tài),點(diǎn)燈信息基于Flash內(nèi)的固定信息,與幀序列無直接交互,相當(dāng)于實(shí)現(xiàn)了電子連鎖,可用于教學(xué)實(shí)驗(yàn)。
二、通信協(xié)議定義
1、發(fā)送幀格式
8.png (418.96 KB, 下載次數(shù): 35)
下載附件
發(fā)送幀格式
2020-3-18 11:47 上傳
2、返回幀格式
9.png (506.09 KB, 下載次數(shù): 28)
下載附件
返回幀格式1
2020-3-18 11:47 上傳
10.png (477.32 KB, 下載次數(shù): 25)
下載附件
返回幀格式2
2020-3-18 11:47 上傳
3、具體實(shí)現(xiàn)代碼
- //通信協(xié)議內(nèi)容識(shí)別邏輯
-
- //非廣播命令 及 CRC校驗(yàn) 及 設(shè)備類型 及 密鑰檢驗(yàn) 及 是否收到新的幀
- //CRCCHECK = CRCcheck();return true/false;
- CRCcheck();
- if( CRCCHECK && TypeFrame == TongGuoXHJ && AccessFrame == 0xAA && key)
- {
- if(OrderFrame == 0x01)
- {
- //修改flash設(shè)備編號(hào)
- //傳回相應(yīng)幀;void SendBackMessage(0x01);根據(jù)參數(shù)判斷需要的返回信息,自動(dòng)形成格式,提取flash中內(nèi)容填充幀序列;
- Write_CV(SerailFrame,QJ_Position_Addr);
- SendBackFrame[0] = 0x10;
- SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
- SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
- SendBack();
- }
-
- else if(SerailFrame == STMFLASH_ReadHalfWord(QJ_Position_Addr))
- {
- switch(OrderFrame)
- {
- case 0x02:
- //讀狀態(tài):命令+密鑰(0xAA)+設(shè)備類型+設(shè)備編號(hào)+00+00+CRC
- //返回格式:命令+設(shè)備類型+設(shè)備編號(hào)+燈絲狀態(tài)+故障信息+00+CRC
- //參數(shù):cv位置
- SendBackFrame[0] = 0x20;
- SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
- SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
- SendBackFrame[3] = STMFLASH_ReadHalfWord(DS_State_Addr);
- SendBackFrame[4] = STMFLASH_ReadHalfWord(Fault_Setting_Addr);
- SendBack();
- break;
- case 0x03:
- //寫狀態(tài):命令+密鑰(0xAA)+設(shè)備類型+設(shè)備編號(hào)+故障信息+00+CRC
- //返回格式:命令+設(shè)備類型+設(shè)備編號(hào)+故障信息+00+00+CRC
- //參數(shù):故障內(nèi)容
-
- Write_CV(Context5Frame,Fault_Setting_Addr);
- SendBackFrame[0] = 0x30;
- SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
- SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
- SendBackFrame[3] = STMFLASH_ReadHalfWord(Fault_Setting_Addr);
- SendBack();
- break;
- case 0x04:
- //讀區(qū)間狀態(tài):命令+密鑰(0xAA)+設(shè)備類型+設(shè)備編號(hào)+00+00+CRC
- //返回格式:命令+設(shè)備類型+設(shè)備編號(hào)+最近四個(gè)分區(qū)的狀況+00+00+CRC
- //返回此區(qū)間前4個(gè)區(qū)間的狀態(tài)
- SendBackFrame[0] = 0x40;
- SendBackFrame[1] = STMFLASH_ReadHalfWord(Device_Type_Addr);//0x03
- SendBackFrame[2] = STMFLASH_ReadHalfWord(QJ_Position_Addr);
- SendBackFrame[3] = QJ_Situation();
- SendBack();
- break;
-
- default:break;
-
- }
- }
-
- }
-
- //區(qū)間信息廣播幀;不產(chǎn)生返回幀
- if(OrderFrame == 0x05 && CRCCHECK && TypeFrame == TongGuoXHJ && key)
- {
- //第一組數(shù)據(jù)區(qū)間1~8;9~16;17~24
- if(AccessFrame == 0x01)
- {
- Write_CV(rs485buf[3],FQ_State_1_8_Addr);
- Write_CV(rs485buf[4],FQ_State_9_16_Addr);
- Write_CV(rs485buf[5],FQ_State_17_24_Addr);
- }
- //第二組數(shù)據(jù)區(qū)間25~32;33~40;41~48
- if(AccessFrame == 0x02)
- {
- Write_CV(rs485buf[3],FQ_State_25_32_Addr);
- Write_CV(rs485buf[4],FQ_State_33_40_Addr);
- Write_CV(rs485buf[5],FQ_State_41_48_Addr);
- }
- //第三組數(shù)據(jù)區(qū)間49~56;57~64
- if(AccessFrame == 0x03)
- {
- Write_CV(rs485buf[3],FQ_State_49_56_Addr);
- Write_CV(rs485buf[4],FQ_State_57_64_Addr);
- }
- //單幀區(qū)域廣播;命令+密鑰(幀類型)+設(shè)備類型+區(qū)間Sector(0~7;可擴(kuò)展)+區(qū)間信息+00+CRC
- if(AccessFrame == 0x10)
- {
- Write_CV(Context5Frame,FQ_State_1_8_Addr * 2 * (int)SerailFrame);//待測(cè)試(int)SerailFrame
- }
- }
復(fù)制代碼 4,點(diǎn)燈部分還未調(diào)試完成,后續(xù)發(fā)帖再寫
|
|