1. 程式人生 > >MFC簡單的串列埠使用

MFC簡單的串列埠使用

其實這裡也不算是MFC的串列埠,c++應該都可以用。

標頭檔案

#pragma once
class Serial
{
public:
	Serial(void);
	~Serial(void);

private:
	HANDLE hCom;  //全域性變數,串列埠控制代碼

public:
	/*
		建立一個串列埠物件
		引數,埠,波特率
		作者:HES

	*/
	BOOL Create_Serial(CString port,int bt);
		/*
		關閉埠
		
		作者:HES

	*/
	void Close_COM();
	
	/*
		接收一個位元組
		引數 資料
		作者:HES

	*/

	BOOL Read_Byte(char &ch);
	/*
		傳送一個位元組
		引數 資料
		作者:HES

	*/
	BOOL Write_Byte(char ch);

		/*
		接收一個字串
		引數 資料 長度
		作者:HES

	*/

	BOOL Read_Buf(char *ch, DWORD len);

};


c檔案
#include "stdafx.h"
#include "Serial.h"


Serial::Serial(void)
{
}


Serial::~Serial(void)
{
}
	/*
		建立一個串列埠物件
		引數,埠,波特率
		作者:HES

	*/
BOOL Serial::Create_Serial(CString port,int bt)
{
	hCom=CreateFile( port,
      GENERIC_READ|GENERIC_WRITE,
      0,
      NULL,
      OPEN_EXISTING,
      0,
      NULL);
 if(hCom==(HANDLE)-1)
 {
  //MessageBox(L"開啟COM 失敗!");
  return false;
 }
 else
 {
	
 }
			 SetupComm(hCom,100,100);//輸入緩衝區和輸出緩衝區的大小都是1024
			 COMMTIMEOUTS TimeOuts;
			 //設定讀超時
			 TimeOuts.ReadIntervalTimeout=MAXDWORD;
			 TimeOuts.ReadTotalTimeoutMultiplier=0;
			 TimeOuts.ReadTotalTimeoutConstant=0;
			 //在讀一次輸入緩衝區的內容後讀操作就立即返回,
			 //而不管是否讀入了要求的字元.
			 //設定寫超時
			 TimeOuts.WriteTotalTimeoutMultiplier=100;
			 TimeOuts.WriteTotalTimeoutConstant=500;
			 SetCommTimeouts(hCom,&TimeOuts);//設定超時
			 DCB dcb;
			 GetCommState(hCom,&dcb);
			 dcb.BaudRate=bt;//波特率
			 dcb.ByteSize=8;//每個位元組有8 位
			 dcb.Parity=NOPARITY;//無奇偶校驗位
			 dcb.StopBits= ONE5STOPBITS;//1個停止位
			 SetCommState(hCom,&dcb);
			 PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR); 
	return true;
}
	/*
		接收一個位元組
		引數 資料
		作者:HES

	*/
BOOL Serial::Read_Byte(char &ch)
{
	
 DWORD wCount=0;//讀取的位元組數
 BOOL bReadStat;
 bReadStat=ReadFile(hCom,&ch,1,&wCount,NULL);
 
 if(!bReadStat)
 {
	//MessageBox(_T("讀串列埠失敗!"));
	 return false;
 }
	return true;
}
	/*
		傳送一個位元組
		引數 資料
		作者:HES

	*/
BOOL Serial::Write_Byte(char ch)
{
	 DWORD dwBytesWrite=0;
	 COMSTAT ComStat;
	 DWORD dwErrorFlags;
	 BOOL bWriteStat;
	 ClearCommError(hCom,&dwErrorFlags,&ComStat);
	 bWriteStat=WriteFile(hCom,&ch,1,&dwBytesWrite,NULL);
	 if(!bWriteStat)
	 {
	  //MessageBox(_T("寫串列埠失敗!"));
		 return false;
	 } 
	return true;
}
		/*
		關閉埠
		
		作者:HES

	*/
void Serial::Close_COM()
{

	 CloseHandle( hCom ); 

}

		/*
		接收一個字串
		引數 資料 長度
		作者:HES

	*/

BOOL Serial::Read_Buf(char *ch, DWORD len)
{
	 memset(ch,'\0',len);
	 DWORD dwBytesWrite=len;
	 COMSTAT ComStat;
	 DWORD dwErrorFlags;
	 BOOL bWriteStat;
	 ClearCommError(hCom,&dwErrorFlags,&ComStat);
	 bWriteStat=WriteFile(hCom,ch,len,&len,NULL);
	 if(!bWriteStat)
	 {
	  //MessageBox(_T("寫串列埠失敗!"));
		  PurgeComm(hCom,PURGE_TXABORT|
			PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
		 return false;
	 } 
	  PurgeComm(hCom,PURGE_TXABORT|
	  PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
	return true;

}

初始化串列埠
void CMFC串列埠Dlg::OnBnClickedInit()
{
	if(!COM3.Create_Serial(L"COM3",115200))
	{
		MessageBox(_T("開啟串列埠失敗!"));
	}

}

讀寫這裡就不寫了,看函式說明使用吧。