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

VC++ 的串口通訊

編輯:vc教程

  在VC++中有兩種方法可以進行串口通訊。一種是利用Microsoft公司提供的ActiveX控件 Microsoft Communications Control。另一種是直接用VC++訪問串口。下面將簡述這兩種方法。

  一、Microsoft Communications Control

  Microsoft公司在Windows中提供了一個串口通訊控件,用它,我們可以很簡單的利用串口進行通訊。在使用它之前,應將控件加在應用程序的對話框上。然後再用ClassWizard 生成相應的對象。現在我們可以使用它了。

  該控件有很多自己的屬性,你可以通過它的屬性窗口來設置,也可以用程序設置。我推薦用程序設置,這樣更靈活。

   SetCommPort:指定使用的串口。

   GetCommPort:得到當前使用的串口。

   SetSettings:指定串口的參數。一般設為默認參數"9600,N,8,1"。這樣方便與其他串口進行通訊。

   GetSettings:取得串口參數。

   SetPortOpen:打開或關閉串口,當一個程序打開串口時,另外的程序將無法使用該串口。

   GetPortOpen:取得串口狀態。

   GetInBufferCount:輸入緩沖區中接受到的字符數。

   SetInPutLen:一次讀取輸入緩沖區的字符數。設置為0時,程序將讀取緩沖區的全部字符。

   GetInPut:讀取輸入緩沖區。

   GetOutBufferCount:輸出緩沖區中待發送的字符數。

   SetOutPut:寫入輸出緩沖區。

  一般而言,使用上述函數和屬性就可以進行串口通訊了。以下是一個范例。

#define MESSAGELENGTH 100

class CMyDialog : public CDialog
{
protected:
VARIANT InBuffer;
VARIANT OutBuffer;
CMSComm m_Com;
public:
......
}

BOOL CMyDiaLog::OnInitDialog()
{
CDialog::OnInitDialog();
m_Com.SetCommPort(1);
if (!m_Com.GetPortOpen()) {
m_Com.SetSettings("57600,N,8,1");
m_Com.SetPortOpen(true);
m_Com.SetInBufferCount(0);
SetTimer(1,10,NULL);
InBuffer.bstrVal=new unsigned short[MESSAGELENGTH];
OutBuffer.bstrVal=new unsigned short[MESSAGELENGTH];
OutBuffer.vt=VT_BSTR;
}
return true;
}

void CMyDiaLog::OnTimer(UINT nIDEvent)
{
if (m_Com.GetInBufferCount()>=MESSAGELENGTH) {
InBuffer=m_Com.GetInput();
// handle the InBuffer.
// Fill the OutBuffer.
m_Com.SetOutput(OutBuffer);
}
CDialog::OnTimer(nIDEvent);
}

  用該控件傳輸的數據是UNICODE格式。關於UNICODE和ANSI的關系和轉換請參看MSDN。

  關於該控件的其他詳細資料請查看MSDN關於COMM CONTROL部分。

  二、直接用VC++訪問串口。

  在VC++中,串口和磁盤文件可以統一的方式來簡單讀寫。這兩者幾乎沒有什麼不同,只是在Windows 9X下磁盤文件只能做同步訪問,而串口只能做異步訪問。

  CreateFile:用指定的方式打開指定的串口。通常的方式為

  m_hCom = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );

  m_hCom為文件句柄。GENERIC_READ | GENERIC_WRITE指定可以對串口進行讀寫操作。第三個參數0表示串口為獨占打開。OPEN_EXISTING表示當指定串口不存在時,程序將返回失敗。 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED則表示文件屬性。當打開串口時,必須指定 FILE_FLAG_OVERLAPPED,它表示文件或設備不會維護訪問指針,則在讀寫時,必須使用OVERLAPPED 結構指定訪問的文件偏移量。

   ReadFile:讀取串口數據。

   WriteFile:向串口寫數據。

   CloseHandle:關閉串口。

  COMMTIMEOUTS:COMMTIMEOUTS主要用於串口超時參數設置。COMMTIMEOUTS結構如下:

typedef struct _COMMTIMEOUTS {
DWord ReadIntervalTimeout;
D

[1] [2] [3] [4] [5] 下一頁

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