<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 設計應用 > 支持多串口同時(shí)抄表的智能儀表程序設計

支持多串口同時(shí)抄表的智能儀表程序設計

作者: 時(shí)間:2016-10-10 來(lái)源:網(wǎng)絡(luò ) 收藏

摘要:介紹了支持同時(shí)抄表的軟件構架、驅動(dòng)層程序設計方法,并設計了一種支持同時(shí)抄表的程序。通過(guò)層和應用層中的接收、發(fā)送、接收幀處理和發(fā)送幀處理詳細過(guò)程,有效地實(shí)現多個(gè)用戶(hù)根據自己的權限同時(shí)對同一塊儀表進(jìn)行抄讀。實(shí)踐證明,該設計獲得了較好的預期效果,具有良好的應用前景。

本文引用地址:http://dyxdggzs.com/article/201610/306452.htm

引言

隨著(zhù)計算機技術(shù)、通信技術(shù)、電子技術(shù)的發(fā)展,推動(dòng)了儀表行業(yè)快速發(fā)展;同時(shí),隨著(zhù)人力成本的增加,人工抄表將會(huì )逐漸被淘汰;將成為儀表行業(yè)發(fā)展的方向??梢灶A見(jiàn),在未來(lái)20年儀表行業(yè)將經(jīng)歷一次革命,我國將由目前的人工抄表方式逐漸轉變?yōu)檫h程抄表,各級水、氣和電力管理部門(mén)可以根據不同的權限對同一塊儀表進(jìn)行遠程抄讀。為了支持多用戶(hù)同時(shí)抄表,本文設計了一種支持同時(shí)抄讀的智能儀表程序,對程序設計流程做了詳細的闡述。

1 支持多串口智能儀表軟件構架

支持多串口智能儀表軟件構架如圖1所示,支持多串口智能儀表的軟件構架分為4層:驅動(dòng)層、基于任務(wù)調度的操作系統、層和應用層。驅動(dòng)層主要提供智能儀表的各種硬件驅動(dòng)。其中,串口驅動(dòng)程序實(shí)現的功能包括:串口的配置、提供在串口發(fā)送列表和串口接收列表中注冊的接口函數、為通信協(xié)議層提供數據服務(wù)?;谌蝿?wù)調度的操作系統的設計可以提高程序的通用性和擴展性;通信協(xié)議層和應用層根據需要在操作系統中注冊任務(wù),如果以后需要增加一個(gè)功能,則可以直接增加一個(gè)任務(wù)而不需要對以前的代碼進(jìn)行改動(dòng)。

通信協(xié)議層主要對從物理層接收的數據幀和命令幀,按照通信協(xié)議的幀格式進(jìn)行解析和對從應用層接收到的數據和命令按照通信協(xié)議的幀格式進(jìn)行組幀。應用層主要實(shí)現智能電表和抄表客戶(hù)端應用對象之間的通信。支持多協(xié)議的智能儀表軟件構架如圖1所示。

支持多串口同時(shí)抄表的智能儀表程序設計

2 驅動(dòng)層串口程序設計

通信協(xié)議層系統初始化時(shí),通信協(xié)議需要在每個(gè)串口的發(fā)送列表和接收列表中注冊。其中,串口發(fā)送協(xié)議列表和串口接收協(xié)議列表如下所示:

支持多串口同時(shí)抄表的智能儀表程序設計

3 協(xié)議層和應用層程序設計

在通信協(xié)議層定義一個(gè)類(lèi)型為PROTOCOL的數組ProtocolPortList,ProtocolPortList數組的主要作用是:存放對應串口接收的數據和要發(fā)送的數據、表征該串口目前的狀態(tài)。代碼如下:

PROTOCOL ProtocolPortList[SERIAL_PORT_COUNT];

typedef struct{

UINT8 RxBuff[RECV_FRAME_BUFF_LEN];

UINT8 TxBuff[SEND_FRAME_BUFF_LEN];

UINT8 ReceiveSuccessFlag;

UINT8 RxLen:

UINT8 TxLen;

}PROTOCOL;

RxBuff是用來(lái)存放從串口接收的數據,TxBuff為要發(fā)送的數據,如果接收到一幀合法數據將ReceiveSuccessFlag置0xFF,該標志的作用是為操作系統提供一個(gè)處理RxBuff中數據的標志,防止已經(jīng)接收的幀被后續幀覆蓋。RxLen為RxBuff接收字節的長(cháng)度,TxLen為T(mén)xBuff要發(fā)送數據的長(cháng)度。

3.1 接收程序設計

當串口接收到一個(gè)字節后調用接收回調函數,接收數據回調函數數據處理流程圖如圖2所示。首先判斷返回的channel是否為物理通道1、物理通道2或物理通道3。如果不是則將此數據拋棄,如果是則判斷ProtocolList[channel].ReceiveSuccesFlag是否為0xFF。如果是,說(shuō)明該串口已經(jīng)接收到一幀數據但還沒(méi)有被處理,不能接收數據。如果不是,則判斷接收字節是否符合通信協(xié)議的幀格式,如果不符合則將接收字節拋棄,如果符合將接收字節Data存入接收緩沖區ProtocolList[channel].RxBuff中,并且將接收長(cháng)度ProtocolList[channel].RxLen加1,最后判斷是否一幀數據接收完畢,如果接收完成則將ProtocolList[channel].ReeeiveSuiccesFlag置為0xFF。

支持多串口同時(shí)抄表的智能儀表程序設計

3.2 消息格式

在應用層和通信協(xié)議層中都有一個(gè)消息列表,分別來(lái)收集協(xié)議棧發(fā)送給它的消息和應用層發(fā)送給通信協(xié)議層的消息。

Message MessageList[MAX_MESSAGE_NUM];

其中Message的結構如下所示:

typedef struct{

Un8 Channel;

Un8 STaskID;

Un8 DTaskID;

Un8 MessageType;

Un8*Data;

}Message;

通道號為協(xié)議棧接收數據的串口號,STaskID為源任務(wù)號(協(xié)議棧的任務(wù)號或應用層的任務(wù)號),DTaskID為目的任務(wù)ID(協(xié)議棧的任務(wù)號或應用層的任務(wù)號),MessageType代表什么類(lèi)型的消息(讀數據請求、寫(xiě)數據請求),Data為所要寫(xiě)入數據的指針。

3.3 基于任務(wù)調度的操作系統對接收幀的處理

當基于任務(wù)調度的操作系統執行通信協(xié)議層任務(wù)時(shí)會(huì )搜索ProtocolList數組中哪個(gè)元素的ProtocolList[channel].ReceiveSuccesFlag為0xFF,然后對其ProtocolList[channel].RxBuff中的數據進(jìn)行處理,處理過(guò)程是:

①首先按照通信協(xié)議層的幀格式對接收數據進(jìn)行解析。

②解析出需要發(fā)往應用層的數據,按一定的消息格式(包含發(fā)送數據和通道號)組成一條消息,然后將其發(fā)送給應用層,應用層收到這個(gè)消息后將其存入AMessageList應用層消息列表中。

當處理完成后將ProtocolList[channel].RxLen置0,將ProtocolList[channel].ReceiveSuccessFlag置0,以便于該channel串口通道可以接收下一幀數據。

基于任務(wù)調度的操作系統會(huì )按一定的調度時(shí)間來(lái)搜索ProtocolList中各個(gè)串口通道是否接收到一個(gè)完整的幀并進(jìn)行處理,這樣就能夠實(shí)現協(xié)議棧對多個(gè)串口接收到的數據幀進(jìn)行及時(shí)處理,多串口同時(shí)進(jìn)行通信。

基于任務(wù)調度的操作系統會(huì )按一定的調度時(shí)間來(lái)搜索AMessageList是否為空,如果不為空則對相應的消息進(jìn)行處理,這樣就能夠實(shí)現應用層對收到的多個(gè)消息進(jìn)行及時(shí)處理,實(shí)現并行通信。

3.4 協(xié)議層對從應用層接收到的消息處理

智能儀表需要向客戶(hù)機返回抄讀數據時(shí),首先智能儀表應用層將抄讀數據按照一定的消息格式組成一條消息,然后將該消息發(fā)送給通信協(xié)議層。通信協(xié)議層收到該消息后將其存入PMessageList協(xié)議層消息列表中。

基于任務(wù)調度的操作系統會(huì )按一定的調度時(shí)間來(lái)搜索PMessageList是否為空,如果不為空則對相應的消息進(jìn)行處理。

通信協(xié)議層對消息的處理過(guò)程如下:

①通信協(xié)議層將消息進(jìn)行解析,解析出發(fā)送的Data和發(fā)送通道channel。

②將需要發(fā)送的數據按照通信協(xié)議的幀格式進(jìn)行組幀,并存儲于ProtocolList[channel].TxBuff中。ProtocolList[channel].TxLen為需要發(fā)送的長(cháng)度。

③調用串口發(fā)送函數,將該幀數據通過(guò)串口channel發(fā)送出去。

3.5 發(fā)送回調函數程序設計

當channel的串口將協(xié)議層數據幀發(fā)送出去后會(huì )調用發(fā)送回調函數將ProtocolList[channel].TxLen置為0。

結語(yǔ)

本文根據智能儀表的發(fā)展方向和多用戶(hù)同時(shí)抄表的需求,闡述了設計支持多串口同時(shí)抄表的智能儀表程序的必要性。給出了支持多串口同時(shí)抄表的智能儀表軟件構架、驅動(dòng)層程序設計、通信協(xié)議層程序設計和應用層程序設計。它可以使多個(gè)抄表部門(mén)根據各自的權限同時(shí)對同一塊儀表進(jìn)行抄讀和設置。該設計可以廣泛地應用于智能儀表行業(yè),從而推動(dòng)我國儀表行業(yè)的發(fā)展和國際化。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>