1. 程式人生 > >CSerialPort跨平臺串列埠類庫2018-11-20

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

http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm

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