CSerialPort跨平臺串列埠類庫2018-11-20
CSerialPort跨平臺串列埠類庫2018-11-20
如需轉載請標明出處:http://blog.csdn.net/itas109
QQ技術交流群:129518033
前言
CSerialPort是一份優秀的串列埠類檔案,好多的地方值得我們學習,具體在多執行緒,事件,自定義訊息,類的封裝方面等等。 Remon提供的串列埠類網址為: https://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm, 由於已經執行十幾年了,原文的問答部分列出來這麼多年來的問題,經過網友們的總結,補充和修改原來程式碼後,整理出一份相對比較完美的程式碼。
但是,CSerialPort只適應於Windows平臺,我們希望有一個輕量級、跨平臺、高效的串列埠類庫。因此,這裡將設計一個以CSerialPort命名的跨平臺類庫。
為什麼會再寫一篇文章,因為CSDN的評論系統有問題,博文CSerialPort串列埠類最新修正版2018-06-21無法顯示評論。多次給官方反映沒有結果。
news
跨平臺串列埠類庫CSerialPort:
目前進展 2018-11-20
Windows:
1.重新設計多執行緒,支援讀寫併發
2.重新設計通知模組,提高讀寫效率
Unix & Unix Like:
框架搭建中…
新的跨平臺類庫,將具有極高的擴充套件性,開發者可以自己設計自己平臺的類庫
Todo List
1.通用通訊協議封裝
2.儘可能的封包完整資料給開發者,實際由開發者控制
3.基於通用通訊協議的打包類庫
4.跨平臺類庫的整合與分離,如定時器、多執行緒等
CSerialPort類地址:
https://github.com/itas109/CSerialPort
Last Modify
Version:3.0.3.180621
by itas109 on 2018-06-21
http://blog.csdn.net/itas109
https://github.com/itas109
- 增加訊號與槽機制傳輸資料 add sigslot.h to send data
- 修復handle初始化問題,全部初始化為INVALID_HANDLE_VALUE modify handle init INVALID_HANDLE_VALUE
- 修復串列埠開啟失敗,再次成功開啟串列埠後,不能正常讀寫問題 fix can not read and write when the port open failed
CSDN下載地址:
V3.0.3.180621
歷史下載:
V3.0.2.180615
a lightweight library of serial port, which can easy to read and write serical port on windows with C++
License
since V3.0.0.171216 use LGPL v3 License
First Version by Remon Spekreijse on 2000-02-08
Second Version by mrlong on 2007-12-25
https://code.google.com/p/mycom/
- 增加 ClosePort
- 增加 WriteToPort 兩個方法
- 增加 SendData 與 RecvData 方法
by liquanhai on 2011-11-04
http://blog.csdn.net/liquanhai/article/details/4955253
- 增加 ClosePort 中交出控制權,防止死鎖問題
by liquanhai on 2011-11-06
http://blog.csdn.net/liquanhai/article/details/6941574
- 增加 ReceiveChar 中防止執行緒死鎖
by viruscamp on 2013-12-04
https://github.com/viruscamp/CSerialPort
- 增加 IsOpen 判斷是否開啟
- 修正 InitPort 中 parity Odd Even 引數取值錯誤
- 修改 InitPort 中 portnr 取值範圍,portnr>9 時特殊處理
- 取消對 MFC 的依賴,使用 HWND 替代 CWnd,使用 win32 thread 函式而不是 MFC 的
- 增加使用者訊息編號自定義,方法來自 CnComm
by itas109 on 2014-01-10
http://blog.csdn.net/itas109/article/details/18358297
https://github.com/itas109
- 解決COM10以上埠無法顯示的問題
- 擴充套件可選擇埠,最大值MaxSerialPortNum可以自定義
- 新增QueryKey()和Hkey2ComboBox兩個方法,用於自動查詢當前有效的串列埠號。
##by liquanhai on 2014-12-18
- 增加一些處理措施,主要是對減少CPU佔用率
by itas109 on 2016-05-07
http://blog.csdn.net/itas109
https://github.com/itas109
- 修復每次開啟串列埠傳送一次,當串列埠無應答時,需要關閉再開啟或者接收完資料才能傳送的問題。
解決辦法:在m_hEventArray中調整m_hWriteEvent的優先順序高於讀的優先順序。CommThread(LPVOID pParam)函式中讀寫的位置也調換。
參考:
http://zhidao.baidu.com/link?url=RSrbPcfTZRULFFd2ziHZPBwnoXv1iCSu_Nmycb_yEw1mklT8gkoNZAkWpl3UDhk8L35DtRPo5VV5kEGpOx-Gea - 修復停止位在標頭檔案中定義成1導致SetCommState報錯的問題,應為1對應的停止位是1.5。UINT stopsbits = ONESTOPBIT
- switch(stopbits)和switch(parity)增加預設情況,增強程式健壯性
##by itas109 on 2016-06-22
http://blog.csdn.net/itas109
https://github.com/itas109
- 增加ReceiveStr方法,用於接收字串(接收緩衝區有多少字元就接收多少字元)。
解決ReceiveChar只能接收單個字元的問題。
by itas109 on 2016-06-29
http://blog.csdn.net/itas109
https://github.com/itas109
- 解決RestartMonitoring方法和StopMonitoring方法命令不準確引起的歧義,根據實際作用。
將RestartMonitoring更改為ResumeMonitoring,將StopMonitoring更改為SuspendMonitoring。 - 增加IsThreadSuspend方法,用於判斷執行緒是否掛起。
- 改進ClosePort方法,增加執行緒掛起判斷,解決由於執行緒掛起導致串列埠關閉死鎖的問題。
- 增加IsReceiveString巨集定義,用於接收時採用單位元組接收還是多位元組接收
by itas109 on 2016-08-02
http://blog.csdn.net/itas109
https://github.com/itas109
- 改進IsOpen方法,m_hComm增加INVALID_HANDLE_VALUE的情況,因為CreateFile方法失敗返回的是INVALID_HANDLE_VALUE,不是NULL
- 改進ClosePort方法:增加串列埠控制代碼無效的判斷(防止關閉死鎖);m_hWriteEvent不使用CloseHandle關閉
- 改進CommThread、ReceiveChar、ReceiveStr和WriteChar方法中異常處理的判斷,增加三種判斷:串列埠開啟失敗(error code:ERROR_INVALID_HANDLE)、連線過程中非法斷開(error code:ERROR_BAD_COMMAND)和拒絕訪問(error code:ERROR_ACCESS_DENIED)
- 採用安全函式sprintf_s和strcpy_s函式替換掉sprintf和strcpy
- 改進QueryKey方法,用於查詢登錄檔的可用串列埠值,可以搜尋到任意的可用串列埠
- 改進InitPort方法,串列埠開啟失敗,增加提示資訊:串列埠不存在(error code:ERROR_FILE_NOT_FOUND)和串列埠拒絕訪問(error code:ERROR_ACCESS_DENIED)
- 加入viruscamp 取消對 MFC 的依賴
- 改進InitPort方法,如果上次串列埠是開啟,再次呼叫InitPort方法,關閉串列埠需要做一定的延時,否則有機率導致ERROR_ACCESS_DENIED拒絕訪問,也就是串口占用問題
- 初始化預設波特率修改為9600
- 修復一些釋放的BUG
- 規範了一些錯誤資訊,參考winerror.h – error code definitions for the Win32 API functions
- 刪除SendData和RecvData方法
by itas109 on 2016-08-10
http://blog.csdn.net/itas109
https://github.com/itas109
- 改進ReceiveStr方法,comstat.cbInQue = 0xcccccccc的情況(如串列埠異常斷開),會導致RXBuff初始化失敗
by itas109 on 2017-02-14
http://blog.csdn.net/itas109
https://github.com/itas109
- 相容ASCII和UNICODE編碼
- ReceiveStr函式中傳送函式SendMessage的第二個引數採用結構體形式,包括portNr串列埠號和bytesRead讀取的位元組數,可以處理16進位制的時候0x00截斷問題
- 精簡不必要的函式SendData和RecvData
- 儘量的取消對 MFC 的依賴,Hkey2ComboBox函式暫時保留
- 其他小問題修改
by itas109 on 2017-03-12
http://blog.csdn.net/itas109
https://github.com/itas109
- 增加巨集定義_AFX,用於處理MFC的必要函式Hkey2ComboBox
- 進一步去除MFC依賴,修改AfxMessageBox函式
by itas109 on 2017-12-16
Version:3.0.0.171216
http://blog.csdn.net/itas109
https://github.com/itas109
- 支援DLL輸出
- 去除QueryKey和Hkey2ComboBox,採用CSerialPortInfo::availablePorts()函式代替
- 增加CSerialPortInfo類,目前只有availablePorts靜態函式,用於獲取活躍的串列埠到list
- 增加名稱空間itas109
- 精簡不必要的標頭檔案
- InitPort和~CSerialPort()中直接整合ClosePort()
by itas109 on 2018-02-14
Version:3.0.1.180214
http://blog.csdn.net/itas109
https://github.com/itas109
- ★修復不能連續傳送的問題 ★ fix can not continue send error
- ★一次性寫入儘可能多的資料到串列埠 ★ try best to send mutil data once in WriteChar funtion
- 修復BYTE記憶體設定的問題 fix BYTE memset error
- 在建構函式中初始化和釋放臨界區 initialize and delete critical section in Constructor
- 精簡程式碼
by itas109 on 2018-06-15
Version:3.0.2.180615
http://blog.csdn.net/itas109
https://github.com/itas109
- 修復availablePorts函式不能列舉所有串列埠問題 fix function availablePorts can not enum all port error
覺得文章對你有幫助,可以用微信掃描二維碼捐贈給博主,謝謝!
如需轉載請標明出處:http://blog.csdn.net/itas109
QQ技術交流群:129518033