關鍵字:SerialPort 轉 TCP/IP、串口編成、遠程串口調試
我正是從VCKBASE 開始學習VC++ 的,沒有他我進步不會如此迅速,一直想給VCKBASE貢獻點什麼,正好今天有空,就把早些時候寫的一個串口轉TCP/IP的程序發上來,希望對初學者學習串口編程有點幫助。
程序的最大缺陷:
Windows把硬件驅動的接口都進行了抽象和標准化,串口也不例外,大部分的設備都可以通過文件操作API進行存儲控制,如:CreateFile、ReadFile、WriteFile等,其實很簡單。網上有個SerialPort的類寫得還不錯,我就直接拿來用了,只做了小小的修改以滿足我的要求。原本的類一次只能收發一個Byte,根據需要我改成了512 Byte,需要重點提出的是,當收發多字節數據時,數據的正確性和完整性更需要自己保證,因為串口協議標准只是定義在物理層和數據鏈路層,打個比方說,如果一次發送512 Byte,收到不一定是正確的512 Byte,所以自己要進行相關校驗保證正確性,也可能不是一次就會完整的收到512 Byte,而是分多次收完所有數據,這時就要我們定義相關結構保證數據收發完整性。這些細節都是跟串口驅動的實現有關,讀者感興趣的話,可以查看相關文檔。在這個應用程序中完全沒有對這個問題進行防護處理,鑒於一次收發數據量小(512 Byte),並且只是自己的試驗品,所以寫得並不嚴謹,把數據收發理想為一次性正確收發,希望各位都能注意了。
程序的整體結構:
程序功能實現如下:
客戶端<————> (CTcpSocket)轉接程序(CSerialPort) <————>串口設備
對於每個CTcpSocket和CSerialPort對用一個CItem的結構進行管理,可以在配置文件裡配置多個連接轉發對。
程序中主要的類有:CSerialPort、CTcpSocket、CItem。可以把從串口收到的數據轉發向數據套接字和調試套接字,而且可以寫入日志文檔。
圖一 程序顯示條目
日志文檔結構:
[時間 數據傳輸方向 數據尺寸] 16 Byte 16進制顯示數據 [字符顯示]
圖二 日志結構
程序配置文件(config.ini)說明:
[item1] #連接名稱
TcpDataPort=9990 #數據端口
TcpDebugPort=9991 #調試端口
SerialPort=1 #串口號
Baud=9600 #串口波特率
LogFile=item1.txt #日志名稱
LogOn=On #日志開關
Enabled=0 #連接開關
重要數據結構說明:
class CItem
{
public:
CItem(void);
~CItem(void);
public:
CTcpSocket m_sockDateListen; //數據監聽套接字
CTcpSocket m_sockDateMain; //數據套接字
CTcpSocket m_sockDebugListen; //調試監聽套接字
CTcpSocket m_sockDebugMain; //調試套接字
CTcpSocket m_sockTemp; //臨時 socket
BOOL m_dataSockInUse; //相關標志
BOOL m_debugSockInUse;
CSerialPort m_serialPort;
int m_iTotalSendDate; //收發數據統計
int m_iTotalRecvDate;
int m_iDebugPort; //調試端口,用來連接額外調試程序,輸出數據進行調試
int m_iDataPort; //數據端口
int m_iSerialPort; //串口號
int m_iBaud; //串口波特率
CString m_strDataLinkTo; //數據遠端IP
CString m_strDebugLinkTo; //調試遠端IP
CString m_strItemName; //轉發連接名稱
CString m_mistake; //錯誤信息
CString m_strLogFileName; //日志文件
BOOL m_logFlag; //日志文件打開標志
CSerialTcpDlg* m_pParent;
void SetParentItem();
};
串口消息響應在主對話框中:
LRESULT OnCommunication(WPARAM ch, LPARAM port) //當串口收到數據會調用此程序
結束語
最初寫完這個小程序是為了遠程調試串口設備,新手編程習慣極為不好,代碼裡基本就沒有注釋,所以現在程序裡重要結構和函數的注釋都是我後期加的,由於時隔太久,注釋不太明晰,讀者還要自己多斟酌。風格很爛,此文僅僅是串口編成一個比較實用的例子,不能為生產所用。雖然名義上是用C++寫得,但完全是C的風格,而且代碼很淺顯,高手看看笑過就算了。如有任何問題可與我聯系。
代碼在VC++ 2005調試通過
本文配套源碼