李宇洋
(中國聯合網絡通信有限公司 黑龍江省分公司,黑龍江 哈爾濱 150056)
串口通信具有傳輸距離遠、成本低以及抗干擾能力強等優點,在計算機通信領域占有重要地位,已被廣泛應用在實時監控與工業自動化系統中。基于此,開發一個傳輸效率快且實用性強的串口數據通信系統有著十分重要的意義。
串行數據通信是指計算機與外部設備之間通過計算機串行接口進行數據采集和數據傳輸。串行接口一般是指計算機COM接口,是通用設備的通信接口,串口連接到鼠標等外部設備,是外部設備與計算機系統之間進行數據傳輸的通道。如果計算機沒有串行端口,則可以使用USB適配器將USB接口轉換為串行端口。由于該裝置使用方便,可以實現超長距離的數據傳輸,因此工業自動化系統中的數據通信一般采用串行接口。
使用串行接口進行數據通信時,首先設置靜止位置和配對檢測位置,其次打開串行接口等待接口數據通信(即讀取或發送數據到串行端口),最后當數據通信完成時關閉串行端口并釋放資源。在VB6.0環境下,利用MSComm實現串行通信。MSComm控制隱藏串行通信過程,用戶只需要編寫少量的程序代碼就可以實現數據通信。檢測方負責檢測所有重要程序功能的事件和通信錯誤,并確定和驗證注釋屬性的值。如果MSComm控件用于數據通信,則每個控件都屬于一個串行端口。如果應用程序需要多個串行端口,則需要添加MSComm控件[1]。數據采集通信系統實物如圖1所示。

圖1 數據采集通信系統實物示例
當人們使用計算機時,外圍設備不直接連接到中央處理器(Central Processing Unit/Processor,CPU),通常通過接口交換信息。接口設備包括內部設備和外部設備,其中外部設備包含特定的主機和操作器,使用接口協議可將不同的外部設備一起連接到主機和CPU。外部設備的操作過程所涉及的環節少,操作起來相對簡單。應用特殊的外部設備接口技術或輸入/輸出接口技術,根據接口數據有效判斷應當使用并行總線接口還是串行總線接口。并行接口速度快、實時性好,但線路多、復雜度高。串行接口的數據傳輸速度通常較慢,但正確率高[2]。并行接口設計為輸入和輸出接口,可以實現實時的數據輸入和輸出,即在同一接口中輸入和輸出使用相同的雙向路徑。串行通信和并行通信可用于計算機之間或計算機與終端之間的數據傳輸。在遠程傳輸的情況下,串行通信在實際應用中可以有效避免多線路偏差。其設置了兩個通信標準接口,以便不同的設備可以輕松連接和通信。rs-223-c接口(iso-22-c)是最常見的串行通信接口,其是基于RS-232標準的串行通信接口標準進行重新改造的。
Modbus是一種串行通信協議,是施耐德電氣公司在1979年為使用可編程邏輯控制器((Programmable Logic Controller,PLC)進行通信而發表的。目前Modbus已經成為工業通信協議的行業標準,在工業電子設備中被普遍使用。Modbus通信協議分為兩種串行通信模式,即美國信息交換標準代碼(American Standard Code for Information Interchanged,ASCII)通信模式和遠程終端單元(Remote Terminal Unit,RTU)通信模式。協議由起始位、設備地址、功能代碼、數據、檢查位以及結束符號組成[3-6]。
NMEA 0183是為海用電子設備建立的標準格式,NMEA 0183協議使用ASCII碼傳輸GPS定位信息的外在表現為幀,幀格式包括$Aaccc、DDD等。其中,“$”為幀命令起始位;“Aaccc”為地址域,前兩位是標識符(Aa),后三位是標識符(ccc);“DDD”為數據內容。同時,該種協議還存在兩種數據處理方式,即連續方式和指令方式。連續方式是主機不需要發出命令,可以自動從機器向主機發送數據;指令方式則是主機向從機發出指令,從機根據指令執行操作并響應主機。導航設備通常采用連續方法,等待所有的數據建立聯系之后可以連續上傳數據。傳感器和控制器通常采用讀/寫命令查詢數據,并保證能夠控制控制器。自定義協議通常具有固定的數據內容,單個監視設備采用連續方法,數據內容多、頻率要求不固定、配備指令設置的測控裝置則采用指令方法。
數據處理主要包括數據讀寫、數據包處理,為保證數據完整有效的解析,不同的協議下數據處理方法也有所不同。
連續方式下往往會因通信延時、中斷等導致數據端口會出現數據長度不夠一幀或超出一幀的情況,對此主要考慮數據讀寫速度匹配性及數據包粘包/半包的問題。
根據通信數據長度,將其分為定長和變長兩種。定長數據處理根據端口數據長度控制數據讀取速度,端口數據不夠一幀長度時循環等待,大于等于一幀長度時全部讀回。在新的情況下,必定要從上一次斷幀數據開始進行核實,等待核實完畢之后再讀取新的數據。通過查找幀頭并讀取固定長度數據的方式拆包,取出完整數據包,并保存剩余斷幀數據,通過“幀頭+固定長度”的方式解決粘包/半包的問題[7-9]。變長數據處理根據數據產生頻率(循環周期)控制數據讀取速度,定時循環將端口數據全部讀回,前提是端口數據長度大于零。讀取后對數據尾部先進行幀尾判斷,若是幀尾,即為完整數據;若不是幀尾,將斷幀數據截取保存。數據不為空時,再將上次的斷幀數據與本次的數據連接,完成解析處理。通過“幀頭+幀尾”的方式拆包解決粘包/半包的問題。定長數據讀取速度根據端口數據長度控制,有數即讀。但考慮線程資源,通常設定50~100 ms循環周期,從而保證資源的合理分配。定長數據處理方式和變長數據處理方式針對數據堵塞時的處理結果略有不同。定長數據處理方式將擁堵數據讀回快速循環處理,最大程度保證數據的完整性;變長數據處理方式將擁堵數據讀回,但僅能讀取一幀且會由于人為因素造成少量數據丟失,得到的數據并不完整,甚至存在著誤差。
指令方式的數據處理方法相對連續方式簡單很多,建立連接后根據測量/控制周期發送指令,等待接收數據。不超時時,格式檢驗成功后解析數據;超時或校驗不成功時,等待進入下次循環。這種指令方式主要分為一問一答和一問多答兩種情況。一問一答時,發一條收一條即可;一問多答時,發一條后,循環讀取多條指令,直至顯示為“結束指令”之后才可發送下一條指令。此外,有些設備自帶接口函數,直接調用其讀寫函數即可。
數據包處理通常根據協議內容格式進行處理。協議內容通常有固定位置定義和指定字符索引兩種。固定位置定義以MODBUSRTU為例,即“起始位(1個字節)+設備地址(1個字節)+功能代碼(1個字節)+長度(4個字節)+…+校驗碼(2個字節)+結束符(1個字節)”,將數據包格式化成數組,索引相應位置字段即可。指定字符索引以NEMA協議為例,即“$aaccc,ddd,ddd,,,,ddd*hh(CR)(LF)”,根據地址域字符找到所需的數據幀,使用分隔符拆分字段后再根據字段定義解析。針對多臺設備連接數據處理或程序數據量較大時,建議采用并行結構,將數據讀取和數據處理分線程并行處理。
API函數庫串行通信系統的設計思路是所涉及的串口數據觸發傳輸設備觸點時能夠依據現實情況對其進行自動計數,通過網絡在指定的時間間隔內將計數數據傳輸到接收傳輸設備中,最終讓數據傳輸設備將接收的數據通過串行接口傳輸到數據通信軟件。數據通信軟件通過串行接口接收數據并存儲到數據庫,同時軟件以圖表或其他方式顯示最終的數據,增強數據的易懂性。基于API函數庫的串口數據通信軟件采用VS2012集成開發環境,存儲數據庫采用Access2013。設計串口數據通信通用類,充分發揮面向對象程序設計的優勢,提高程序的通用性和可移植性,實現串口通信接收文件的建立、打開串口以及數據接收轉換。打開串口方法名為open,實現過程是先建立串口參數及標志,并設置結構體變量dcbCommPort和超時結構體變量ctoCommPort,然后調用外部方法Create-File建立串口文件并打開。如果返回的句柄無效則提示錯誤信息,否則設置通信超時時間。調用外部方法GetCommState方法取得串口狀態參數,調用SetCommState方法設置串口參數。如果出現錯誤,則拋出異常,否則設置串口狀態為打開[10]。串口數據通信在接收數據前要先打開串口,在程序設計的主窗體上添加“打開/關閉”按鈕,用于打開或關閉串口。“打開/關閉”按鈕的代碼主要包括按鈕的Click單擊事件和打開串口的方法OpenCom-Port,在窗體級聲明串口通信通用類對象_myserialPort,實現串口的打開、關閉、接收數據。
根據系統實際需求構建多層次的組成結構框架,可在滿足物理層接口標準的前提下實現對數據的傳輸,保障數據采集系統能夠快速實現數據采集與傳輸,同時實現數據內容的共享,從而達到理想的通信效果。通過調用系統API庫中的串口實現數據采集,同時系統實際所應用到的硬件較少且傳輸速度快,可有效滿足高標準、遠距離的數據通信需求,具有較強的實用性。