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

VC學習:Windows CE下的串口通訊類

編輯:vc教程

  串行通訊是目前計算機、通信和控制領域最基本的通信方式。在CSDN的“嵌入式開發/WINCE”社區中,經常有人提問該到哪找串口通訊類,其實這個問題我自己也問過。:)而一般的回答是給你提供一個Pocket PC 2002的SDK例子程序。但到底SDK的程序和MFC的結構有很大的不同,對於想用MFC編寫通信程序的人來說也不是很便利。
  
  另一方面,由於Windows CE是一個基於Unicode的操作系統,並且Windows CE不支持Windows下常用的串行通信重疊I/O方式(OVERLAPPED),因此編寫Windows CE下的串口通訊類有一些與桌面Windows不同的地方。
  
  以下是我從SDK程序改寫而來的MFC類,希望能和致力於WINCE開發的朋友多多交流,由於本人才疏學淺,程序中有許多不完善的地方,請大家指正。我的程序是基於“主動發送請求,被動接收響應”的假設,因此我只設置了一個接收數據的線程。如果有朋友能提供有獨立發送數據和接收數據線程的類,我將十分感激。我的E_mail:[email protected]
  
  感謝“嵌入式開發/WINCE”社區為我提供SDK例子的朋友,感謝CSDN上所有熱心的朋友,祝願中國的軟硬件水平能早日擠身世界一流。
  
  頭文件Serial.h
  
  // Serial.h: interface for the CSerial class.
  
  //
  
  /////////////////////////////
  
  #if !defined(AFX_SERIAL_H__59575586_AAA9_4FEF_B2A7_E089553698EF__INCLUDED_)
  
  #define AFX_SERIAL_H__59575586_AAA9_4FEF_B2A7_E089553698EF__INCLUDED_
  
  #if _MSC_VER > 1000
  
  #pragma once
  
  #endif // _MSC_VER > 1000
  
  DWord WINAPI ReadPortThread(LPVOID lpvoid); //讀數據線程
  
  class CSerial
  
  {
  
  public:
  
  BOOL InitCommTimeouts(); //設置超時參數
  
  BOOL InitDCB(); //配置串口

  BOOL m_bConnected;
  
  BOOL ClosePort(HANDLE hCommPort); //關閉串口
  
  DWORD WritePort(TCHAR *buf,DWord dwBytesToWrite); //寫數據
  
  BOOL OpenPort(LPTSTR lpszPortName); //打開串口
  
  CSerial();
  
  HANDLE hReadThread;
  
  virtual ~CSerial();
  
  };
  
  #endif // !defined(AFX_SERIAL_H__59575586_AAA9_4FEF_B2A7_E089553698EF__INCLUDED_)
  
  源文件:Serial.cpp
  
  // Serial.cpp: implementation of the CSerial class.
  
  //
  
  /////////////////
    #include "stdafx.h"
  
  #include "Serial.h"
  
  #ifdef _DEBUG
  
  #undef THIS_FILE
  
  static char THIS_FILE[]=__FILE__;
  
  #define new DEBUG_NEW
  
  #endif
  
  HANDLE hPort;
  
  CString strInChar;
  
  //////////////////////////////////////////
  
  // Construction/Destruction
  
  /////////////////////////////////////////

  CSerial::CSerial()
  
  {
  
  }
  
  CSerial::~CSerial()
  
  {
  
  if(hPort != INVALID_HANDLE_VALUE)
  
  ClosePort(hPort);
  
  }
  
  BOOL CSerial::OpenPort(LPTSTR lpszPortName)
  
  {
  
  DWord dwError,
  
  dwThreadID;

  if(hPort)
  
  {
  
  return FALSE;
  
  }
  
  //打開串口
  
  hPort = CreateFile (lpszPortName, GENERIC_READ | GENERIC_WRITE,
  
  0, NULL, OPEN_EXISTING,0, NULL);
  
  //如果打開端口出錯, 返回FALSE
  
  if ( hPort == INVALID_HANDLE_VALUE )
  
  {
  
  //不能打開端口
  
  CString strError;
  
  strError.Format(_T("Unable to open %s, Error No.=%d"),
  
  lpszPortName, GetLastError());
  
  MessageBox (NULL, strError,TEXT("Error"), MB_OK);
  
  return FALSE;
  
  }

  //指定端口監測的事件集

  SetCommMask (hPort, EV_RXCHAR);
  
  //分配設備緩沖區
    
  SetupComm(hPort,512,512);
  
  //初始化緩沖區中的信息
  
  PurgeComm(hPort,PURGE_TXCLEAR|PURGE_RXCLEAR);
  
  //配置串行端口
  
  if(!InitDCB())
  
  return FALSE;
  
  //設置端口超時值
  
  if(!InitCommTimeouts())
  
  return FALSE;
  
  //設置端口上指定信號的狀態
  
  // SETDTR: 發送DTR (dat

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

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