使用Windows API和多執行緒進行串列埠通訊[1] (轉)

themoney發表於2007-10-05
使用Windows API和多執行緒進行串列埠通訊[1] (轉)[@more@]

用操作串列埠:namespace prefix = o ns = "urn:schemas--com::office" />

// MyCom.h

UINT CommWatchProc(LPVOID pParam);  // 串列埠監視執行緒

class CMy

{

public:

  CMyCom();

  ~CMyCom();

  BOOL SetupMyCom();  // 初始化埠

  BOOL WriteMyCom(LPVOID lpSnuffer, D dwBytesToWrite);  // 寫埠

  DWORD ReadMyCom(LPVOID lpInBuffer, DWORD dwBytesToRead=35);  // 讀埠

  void CloseMyCom();  // 關閉埠

};

// MyCom.cpp

// 裝置的初始化

// 利用CreateFile函式實現,該函式獲得序列裝置控制程式碼並對其進行通訊引數設定

// 包括設定輸出/接受緩衝區大小、超時控制和事件監視等

BOOL CMyCom::SetupMyCom()

{

  DCB dcb;

  COMMTIMEOUTS timeouts;

 

  if(bOpen)return FALSE;  // 串列埠被佔用

  // 開啟COM1

  hComDev = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL,

  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  if(hComDev == INVALID_HANDLE_VALUE)

  {

  //  MessageBox(NULL, _T("埠被佔用,列印不能繼續執行!"), _T("TRACE"), MB_OK);

  return FALSE;  // 開啟埠失敗

  }

  // 設定超時控制

  SetCommTimeouts(hComDev, &timeouts);

  // 設定接收緩衝區和輸出緩衝區的大小

  SetupComm(hComDev, 1024, 512);

  // 獲取預設的DCB結構的值

  GetCommState(hComDev, &dcb);

  // 設定波特率為9600 bps

  dcb.BaudRate = CBR_9600;

  // 設定無奇偶校驗

  dcb.fParity = NOPARITY;

  // 設定資料位為8

  dcb.ByteSize = 8;

  // 設定一個停止位

  dcb.StopBits = ONESTOPBIT;

  // 設定相應監視串列埠的錯誤和接收到字元兩種事件響應

  SetCommMask(hComDev, EV_ERR|EV_RXCHAR);

  // 設定序列裝置控制引數

  SetCommState(hComDev, &dcb);

  // 設定參數列示裝置已開啟

  bOpen = TRUE;

  // 建立一個人工重設,

  hEvent = CreateEvent(NULL, FALSE, FALSE, "WatchEvent");

  return TRUE;

}

// 資料傳送

// 資料傳送利用WriteFile函式實現。對於同步I/O操作,它的最後一個引數可為

// NULL;而對非同步I/O操作,它的最後一個引數必需是一個指向OVERLAPPED結構的指標,

// 透過OVERLAPPED結構來獲得當前的操作狀態。

// lpSndBuffer為傳送資料緩衝區指標,

// dwBytesToWrite為將要傳送的位元組長度

BOOL CMyCom::WriteMyCom(LPVOID lpSndBuffer, DWORD dwBytesToWrite)

{

  BOOL bWriteState;

  DWORD dwBytesWritten;  // 實際傳送的位元組數

  if(!bOpen)return FALSE;  // 串列埠未開啟

bWriteState = WriteFile(hComDev, lpSndBuffer, dwBytesToWrite, &dwBytesWritten, NULL);

  if(!bWriteState || (dwBytesToWrite != dwBytesWritten))

  return FALSE;  // 傳送資料失敗

  return TRUE;

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10794571/viewspace-974833/,如需轉載,請註明出處,否則將追究法律責任。

相關文章