其实这里也不算是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("打开串口失败!"));
}
}
读写这里就不写了,看函数说明使用吧。