程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 串口轉TCP/IP實用程序

串口轉TCP/IP實用程序

編輯:關於VC++

關鍵字: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調試通過

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved