AVR單片機的串口轉FSK的通信模塊設計
4 軟件實現
ATmega48芯片具有4 KB內部Flash和512字節的片內SRAM,軟件實現需考慮資源分配問題,特別是SRAM使用情況。由于程序涉及串口通信、DTMF通信和FSK通信3種情況,理論上需要開辟6個緩沖區。如果這樣,每一個緩沖區的大小顯然不能確保達到實際通信數據量的需求。結合FSK通信特點,DTMF數據傳輸與FSK數據傳輸不可能同時發生,因此FSK與DTMF可共用相同緩沖區。同樣串口接收與FSK發送、串口發送與
FSK接收都不會同時發生,這樣通信只需要開辟兩個緩沖區就可以確保模塊正常通信,考慮實際業務平臺數據量情況,軟件設計中為FSK接收開辟255字節緩沖區復用;FSK發送開辟45字節緩沖區復用。
4.1 主程序實現流程
通信模塊主程序包括:CPU初始化、CMX865初始化、初始化建鏈、串口通信和FSK通信子程序等。主程序流程如圖2所示。初始化建鏈環節是模塊正常工作的基礎,通過初始化建鏈操作,信息終端可以根據線路環境以及平臺超時機制對通信模塊參數進行設置,確保通信的穩定性。通信主流程循環執行3個子功能函數:線路狀態處理函數、串口數據解析與處理函數、鏈路保持函數。線路狀態處理函數設計了3種線路狀態,即初始狀態、空閑狀態和摘機狀態;正常工作時僅在空閑狀態和摘機狀態之間切換。其中在空閑狀態檢測振鈴、根據狀態位執行摘機、DTMF撥號等操作;在摘機狀態根據狀態位執行FSK收發、脫線檢測、掛機控制等操作。串口數據解析與處理函數包含串口數據按命令集解析、對解析命令進行應答和狀態置位處理部分。這樣線路狀態處理函數和串口數據解析與處理函數通過狀態置位標志緊密連接起來。FSK數據采用中斷方式直接接收,接收完畢后在摘機狀態下直接通過串口發送給信息終端。由于串口發送應用相對單一,為簡單處理串口發送采用即時應答處理方式,分散在通信主流程各子功能函數中實現,提高了通信效率。通過鏈路保持函數判斷串口通信是否異常,通信模塊周期性地向信息終端發送鏈路保持命令,如果3次重發均未收到終端應答命令,通信模塊將自動鎖閉線路,重新執行初始化建鏈操作,實現串口異常的處理。本文引用地址:http://www.j9360.com/article/172028.htm
4.2 對外串口通信協議
模塊采用標準串口通信,波特率為19 200 bps,10位異步方式。定義串口通信數據包格式為:0x1E+命令+校驗和反碼(對命令的校驗和反碼),其中部分命令以變長方式發送。串口通信主要命令有:模塊初始化、鏈路保持、DTMF接收/發送、FSK接收/發送、振鈴、掛機等,命令具體格式和描述此處不加詳述。模塊初始化上電后由通信模塊自動發起,直到正確接收到終端應答初始化命令后,通信模塊才建鏈成功。信息終端初始化應答命令主要提供FSK通信模塊參數配置信息。上電后如果FSK模塊未收到終端初始化應答信息,則周期性地(每2 s)發送一次初始化建鏈命令,直到成功為止;模塊FSK通信過程中周期性地向終端發送鏈路保持命令,如果未收到終端應答信息,則斷開FSK鏈接重新開始模塊初始化。
4.3 串口通信實現
AVR單片機串口通信往往采用SPI通信方式,通信模塊串口通信采用UART0控制/狀態寄存器和數據寄存器實現。串口通信子程序主要由串口發送/接收中斷子程序、串口接收命令解析子程序和串口組包發送子程序3部分組成。其中串口中斷接收程序為:
具體執行串口數據發送時,需要提供發送數據長度、發送起始地址、置UCSROB寄存器值(UCSR0B |=0x28)。串口接收命令解析子程序按照對外串口通信協議解析串口命令,并根據命令描述調用子程序代碼執行相應子功能操作。為了通信容錯處理,通信模塊需對接收串口數據進行校驗,如果解析的串口命令格式正確,則向終端發送肯定應答;否則發送否定應答,等待終端重傳命令數據。串口組包發送子程序對接收的FSK數據以及線路狀態等信息數據,按照串口通信協議組包發送給信息終端。
評論