賈小文,賀秀良
(軍事交通學院 基礎部,天津300161)
串行通信是計算機與外圍設備進行數據通信常見的通信方式。按電氣標準和協議串行通信標準 有 RS232-C、RS422、RS485、USB 等[1-2]。RS232-C(ANSI/EIA232 標準)是IBM-PC 及其兼容機上的串行連接標準。由于個人計算機的普及,RS232-C 成為使用最為廣泛的串口通信標準。通用串行總線(universal serial bus,USB)是一個新的外部總線標準,于20 世紀90 年代由英特爾、康柏、IBM、微軟等多家公司聯合推出,由于支持熱插拔、即插即用、傳輸速率高等原因,目前被計算機廣泛用為與外設進行串行通信的標準接口[3]。筆記本計算機由于其輕薄的特點,絕大多數并不提供RS232-C 串口,也即普通意義上的“COM”串口,但都提供USB 接口。當筆記本計算機與僅支持RS232 串口的設備進行串行通信時,通常需要從USB 到RS232 的轉換。這種轉換可以通過專用的芯片完成,比較成熟的芯片有PL2303、CP2102 等[4-5]。通過USB—RS232 轉換,可以方便地利用筆記本對支持串口通信的設備進行讀寫操作。
CSerialPort 類是為了方便對RS232 串口操作而開發的一個C + +類,可以代替常用的ActiveX控件進行串口應用開發。該類封裝了相關的文件操作Windows API 函數,采用異步文件讀寫模型,結構良好,功能明確,能夠滿足絕大多數串口開發應用場合[6]。但是,由于串口應用環境的復雜性,CSerialPort 類存在一些漏洞,特別是在進行USB—RS232 串口讀寫操作時,不能向串口寫入數據。本文分析了這些漏洞產生的原因,并給出了修正漏洞的方案。
在Windows 環境下,開發RS232 串口經常采用的方法是使用ActiveX 控件或者直接采用Windows API 函數。
當采用ActiveX 控件時,通常使用的是微軟開發的MSComm 控件。MSComm 控件屬于微軟組件對象模型(component object model,COM)的產品,為應用程序提供了串行接口收發數據的簡便方法。
MSComm 采用事件驅動方式和查詢方式,提供了一系列標準通信命令和接口,可以方便地與串口建立連接并對串口發送數據和接收數據。MSComm 與開發環境無關,無論是VC、VB,還是Dephi 等流行開發工具都能使用。MSComm 的缺點是可定制性不強,對于復雜的串口應用場合缺乏靈活性。MSComm 屬于ActiveX 控件,必須注冊以后才能使用,增加了程序的體積,給使用上帶來不便。當MSComm 不能滿足使用要求時,就必須利用Windows API 直接進行串口操作。
利用Windows API 對串口讀寫操作的困難在于異步文件讀寫的復雜性,要寫出高效穩定的串口讀寫程序需要相當的編程知識和技巧。這實際上限制了利用API 直接操作串口的可行性。
CSerialPort 本質上屬于利用Windows API 對串口進行操作這種形式。但它以類的形式將相關Win32 API 以及對串口文件異步操作所涉及到的多線程、線程同步等復雜編程技術封裝起來,大大降低了對串口讀寫操作的復雜性,提供給使用者比MSComm 更簡單和直接的使用接口。與MSComm 控件COM 訪問方式相比較,CSerialPort不涉及對讀寫數據的封裝和轉換。CSerialPort 以C + +代碼類的方式提供,可以直接包含到程序源代碼里,不像MSComm 必須安裝注冊控件才能使用。CSerialPort 結構良好,對串口的操作采用典型成熟的多線程異步Overlapped 文件讀寫模型,所有的源代碼都是公開透明的,使用者可以通過修改或者直接從該類派生而擴展該類的功能,寫出功能更強的串口操作應用程序。同時該類也是一份很好的關于串口讀寫操作Win32 API 編程的技術范例,對于開發自己個性化的串口讀寫應用具有一定參考價值[2]。
CSerialPort 屬于事件驅動,使用非常簡單,讀寫串口前先產生該類的實例,1 個串口對應1 個實例。主程序通過直接調用實例的寫操作接口和關閉接口進行寫操作和關閉操作,通過響應消息的方式進行讀操作。串口檢測到的其他事件也以消息的方式發送給主程序,主程序通過響應該消息來處理相應的串口事件。表1 為CSerialPort 定義的基本消息,表2 為CSerialPort 提供的接口函數。關于該類的詳細使用方法可參考文獻[7]。

表1 CSerialPort 消息

表2 CSerialPort 主要接口函數(不含返回類型和函數參數)
CSerialPort 最初發布只是解決了串口讀寫操作最關鍵的部分,亦即多線程異步overlapped 文件讀寫機制實現,并未充分考慮串口操作所涉及到的一些細節問題,而是把這些問題留給了使用者。使用者可以利用其開源特性,根據自己的應用需求直接對源類進行擴充和修改,實現自己要求的功能。這些細節問題,如果在使用的過程中不注意,就會成為程序的漏洞,嚴重者會導致串口操作失敗。
CSerialPort 提供寫操作接口如下:

當要向串口寫入數據時,CSerialPort 將寫操作事件m_hWriteEvent 置為有信號狀態,同時將待寫入字符串拷貝到寫入緩沖區m_szWriteBuffer,并指定寫入字符長度m_nWriteSize。由于寫事件為有信號狀態,監聽線程通過查詢該信號狀態調用Windows API 函數WriteFile 將數據寫入串口。上述寫操作函數在寫入二進制數據時存在問題。
strcpy 和strlen 函數都是以標準C/C + +字符串作為操作對象。在C/C + + 規范中,標準字符串是以“ 主站蜘蛛池模板: 日韩人妻精品一区| 国产乱子伦手机在线| 国产精品久久久久无码网站| 久久精品人人做人人| 国产白丝av| 91精品啪在线观看国产91| 欧美视频在线第一页| 国产人在线成免费视频| 99久久成人国产精品免费| 国产精品视频观看裸模| 一本大道东京热无码av| 日韩av高清无码一区二区三区| 成人自拍视频在线观看| 精品乱码久久久久久久| 免费视频在线2021入口| 91无码视频在线观看| 久久无码av三级| 国产亚洲高清在线精品99| 999国产精品永久免费视频精品久久| 国产白浆视频| 免费国产高清视频| 国产精品亚洲αv天堂无码| 91色综合综合热五月激情| 亚洲一区二区三区国产精品 | 国产丝袜一区二区三区视频免下载| 亚洲AⅤ波多系列中文字幕| 无码中文字幕加勒比高清| 精品国产电影久久九九| 女人天堂av免费| 色综合天天综合| 99久久婷婷国产综合精| 色婷婷亚洲综合五月| 成人a免费α片在线视频网站| 毛片a级毛片免费观看免下载| 精品无码人妻一区二区| 在线观看亚洲人成网站| 天天综合色天天综合网| 三上悠亚在线精品二区| 亚洲视频一区| 国产丝袜91| 中文字幕 91| 久久这里只精品热免费99| 波多野结衣第一页| 日韩免费成人| 国产在线视频二区| 996免费视频国产在线播放| 久久这里只有精品2| 国产流白浆视频| 亚洲毛片网站| 夜夜操狠狠操| 国产亚洲高清在线精品99| 色婷婷在线播放| 亚洲天堂在线免费| 人妻丰满熟妇av五码区| 尤物国产在线| 国产乱子伦精品视频| 色噜噜狠狠狠综合曰曰曰| 九九精品在线观看| 国产日韩精品一区在线不卡| 国产91精品调教在线播放| 国产丝袜第一页| 国产精品区视频中文字幕| 伊人五月丁香综合AⅤ| 亚洲AV无码久久精品色欲| av性天堂网| 国产精品无码在线看| 激情六月丁香婷婷| 国产精品香蕉在线观看不卡| 一本大道东京热无码av| 成人在线不卡| 欧美国产在线一区| 国产精品思思热在线| 暴力调教一区二区三区| 毛片在线播放网址| 久久久精品国产亚洲AV日韩| 久久精品无码一区二区日韩免费| 久久精品aⅴ无码中文字幕| 最新亚洲人成无码网站欣赏网| 精品视频免费在线| 最新日本中文字幕| 国产剧情国内精品原创| 国产精品综合色区在线观看|