MFC簡單的串列埠使用
阿新 • • 發佈:2019-02-19
其實這裡也不算是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("開啟串列埠失敗!"));
}
}
讀寫這裡就不寫了,看函式說明使用吧。