MFC的串口有两种操作方法,第一种是第三方库,SerialPort类;第二种是activeX控件MScomm控件。本文只介绍ActiveX控件方法。
activeX控件添加方法:
- VSdutio环境下可以直接在资源视图下右键dialog选择添加ActiveX控件。
- 打开工具箱->右键->选择项->COM组件,如图添加相应相即可:
添加控件后为控件后工程会自动添加两个文件:CMscomm.h,CMsconm.cpp, 它是MScomm控件类,使用过程中还需要添加“打开/关闭串口、设置波特率”等方法/函数。
//CMcomm.h
#pragma once
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
/
// CMscomm1 包装类
class CMscomm1 : public CWnd
{
protected:
DECLARE_DYNCREATE(CMscomm1)
public:
CLSID const& GetClsid()
{
static CLSID const clsid
= { 0x648A5600, 0x2C6E, 0x101B, { 0x82, 0xB6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14 } };
return clsid;
}
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext = NULL)
{
return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);
}
BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
UINT nID, CFile* pPersist = NULL, BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL)
{
return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,
pPersist, bStorage, bstrLicKey);
}
// 特性
public:
enum
{
NoHandshaking = 0,
XonXoff = 1,
RtsCts = 2,
XonXoffAndRtsCts = 3
}HandshakingConstants;
enum
{
comNone = 0,
comXOnXoff = 1,
comRTS = 2,
comRTSXOnXOff = 3
}HandshakeConstants;
enum
{
comInvalidPropertyValue = 380,
comGetNotSupported = 394,
comSetNotSupported = 383,
comPortInvalid = 8002,
comPortAlreadyOpen = 8005,
comPortOpen = 8000,
comNoOpen = 8012,
comSetCommStateFailed = 8015,
comPortNotOpen = 8018,
comReadError = 8020,
comDCBError = 8021,
comBreak = 1001,
comCTSTO = 1002,
comDSRTO = 1003,
comFrame = 1004,
comOverrun = 1006,
comCDTO = 1007,
comRxOver = 1008,
comRxParity = 1009,
comTxFull = 1010,
comDCB = 1011
}ErrorConstants;
enum
{
comEventBreak = 1001,
comEventCTSTO = 1002,
comEventDSRTO = 1003,
comEventFrame = 1004,
comEventOverrun = 1006,
comEventCDTO = 1007,
comEventRxOver = 1008,
comEventRxParity = 1009,
comEventTxFull = 1010,
comEventDCB = 1011
}CommEventConstants;
enum
{
comEvSend = 1,
comEvReceive = 2,
comEvCTS = 3,
comEvDSR = 4,
comEvCD = 5,
comEvRing = 6,
comEvEOF = 7
}OnCommConstants;
enum
{
comInputModeText = 0,
comInputModeBinary = 1
}InputModeConstants;
// 操作
public:
// IMSComm
// Functions
//
void put_CDHolding(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x1, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_CDHolding()
{
BOOL result;
InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_CDTimeout(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x2, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_CDTimeout()
{
long result;
InvokeHelper(0x2, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_CommID(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x3, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_CommID()
{
long result;
InvokeHelper(0x3, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_CommPort(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x4, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_CommPort()
{
short result;
InvokeHelper(0x4, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put__CommPort(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x0, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get__CommPort()
{
short result;
InvokeHelper(0x0, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_CTSHolding(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x5, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_CTSHolding()
{
BOOL result;
InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_CTSTimeout(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x6, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_CTSTimeout()
{
long result;
InvokeHelper(0x6, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_DSRHolding(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x7, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_DSRHolding()
{
BOOL result;
InvokeHelper(0x7, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_DSRTimeout(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x8, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_DSRTimeout()
{
long result;
InvokeHelper(0x8, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_DTREnable(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x9, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_DTREnable()
{
BOOL result;
InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_Handshaking(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0xa, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_Handshaking()
{
long result;
InvokeHelper(0xa, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_InBufferSize(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0xb, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_InBufferSize()
{
short result;
InvokeHelper(0xb, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_InBufferCount(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0xc, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_InBufferCount()
{
short result;
InvokeHelper(0xc, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_Break(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0xd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_Break()
{
BOOL result;
InvokeHelper(0xd, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_InputLen(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0xe, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_InputLen()
{
short result;
InvokeHelper(0xe, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_Interval(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0xf, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_Interval()
{
long result;
InvokeHelper(0xf, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void put_NullDiscard(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x10, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_NullDiscard()
{
BOOL result;
InvokeHelper(0x10, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_OutBufferSize(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x11, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_OutBufferSize()
{
short result;
InvokeHelper(0x11, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_OutBufferCount(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x12, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_OutBufferCount()
{
short result;
InvokeHelper(0x12, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_ParityReplace(LPCTSTR newValue)
{
static BYTE parms[] = VTS_BSTR ;
InvokeHelper(0x13, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
CString get_ParityReplace()
{
CString result;
InvokeHelper(0x13, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
void put_PortOpen(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x14, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_PortOpen()
{
BOOL result;
InvokeHelper(0x14, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_RThreshold(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x15, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_RThreshold()
{
short result;
InvokeHelper(0x15, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_RTSEnable(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x16, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_RTSEnable()
{
BOOL result;
InvokeHelper(0x16, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_Settings(LPCTSTR newValue)
{
static BYTE parms[] = VTS_BSTR ;
InvokeHelper(0x17, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
CString get_Settings()
{
CString result;
InvokeHelper(0x17, DISPATCH_PROPERTYGET, VT_BSTR, (void*)&result, NULL);
return result;
}
void put_SThreshold(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x18, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_SThreshold()
{
short result;
InvokeHelper(0x18, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_Output(VARIANT newValue)
{
static BYTE parms[] = VTS_VARIANT ;
InvokeHelper(0x19, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
}
VARIANT get_Output()
{
VARIANT result;
InvokeHelper(0x19, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}
void put_Input(VARIANT newValue)
{
static BYTE parms[] = VTS_VARIANT ;
InvokeHelper(0x1a, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, &newValue);
}
VARIANT get_Input()
{
VARIANT result;
InvokeHelper(0x1a, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);
return result;
}
void put_CommEvent(short newValue)
{
static BYTE parms[] = VTS_I2 ;
InvokeHelper(0x1b, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
short get_CommEvent()
{
short result;
InvokeHelper(0x1b, DISPATCH_PROPERTYGET, VT_I2, (void*)&result, NULL);
return result;
}
void put_EOFEnable(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x1c, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
BOOL get_EOFEnable()
{
BOOL result;
InvokeHelper(0x1c, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_InputMode(long newValue)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x1d, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long get_InputMode()
{
long result;
InvokeHelper(0x1d, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void AboutBox()
{
InvokeHelper(DISPID_ABOUTBOX, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
// Properties
//
};
// CMcomm.cpp
// 计算机生成了由 Microsoft Visual C++ 创建的 IDispatch 包装类
// 注意: 不要修改此文件的内容。如果此类由
// Microsoft Visual C++ 重新生成,您的修改将被覆盖。
#include "stdafx.h"
#include "mscomm1.h"
/
// CMscomm1
IMPLEMENT_DYNCREATE(CMscomm1, CWnd)
/
// CMscomm1 属性
/
// CMscomm1 操作
// cpp文件没有做改动,无须修改
//使用方法:
// m_ctrlComm2,串口控件变量
// m_Com_3303,串口选择combobox 变量
void CUSFDlg::OnCbnSelchangeCom3303()
{
// TODO: 在此添加控件通知处理程序代码
int nSel;
nSel = m_Com_3303.GetCurSel();//获取组合框控件的列表框中选中项的索引
m_ctrlComm2.put_CommPort(nSel + 1);//选择串口号(这里因为列表框的索引号是从0开始,所以(nSel+1)对应的才是我们所选的串口号)
m_ctrlComm2.put_PortOpen(TRUE);//打开串口
m_ctrlComm2.put_RThreshold(5);//收到两个字节引发OnComm事件
m_ctrlComm2.put_InputMode(1);//输入模式选为二进制
m_ctrlComm2.put_Settings(_T("9600,n,8,1"));//设置串口参数
m_ctrlComm2.put_InputMode(1); // 以二进制方式检取数据
m_ctrlComm2.put_RThreshold(5); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm2.put_InputLen(0); //设置当前接收区数据长度为0
m_ctrlComm2.get_Input();//先预读缓冲区以清除残留数据
m_setOK = true; //标记串口设置OK
}
// conmbobox 的selctchenge消息触发发送信号
void CUSFDlg::OnCbnSelchange3303cmd()
{
// TODO: 在此添加控件通知处理程序代码
int nSel = m_3303.GetCurSel();
CString str;
switch (nSel)
{
case 0:
str = _T("OUT1\n");
m_ctrlComm2.put_Output(COleVariant(str));
break;
case 1:
str = _T("OUT0\n");
m_ctrlComm2.put_Output(COleVariant(str));
break;
case 2:
str = _T("IOUT1?\n");
m_ctrlComm2.put_Output(COleVariant(str));
break;
case 3:
str = _T("IOUT2?\n");
m_ctrlComm2.put_Output(COleVariant(str));
break;
case 4:
str = _T("VSET1:3.3\n");
m_ctrlComm2.put_Output(COleVariant(str));
break;
case 5:
str = _T("VSET2:3.3\n");
m_ctrlComm2.put_Output(COleVariant(str));
break;
}
}
// 接收中断函数
// m_EditReveive :接收信号显示edit,cstring(值型变量)
void CUSFDlg::OnCommMscomm3()
{
// TODO: 在此处添加消息处理程序代码
if (m_ctrlComm2.get_CommEvent() == 2) //事件值为2表示接收缓冲区内有字符
{
char str[1024] = { 0 };
long k;
VARIANT InputData = m_ctrlComm2.get_Input(); //读缓冲区
COleSafeArray fs;
fs = InputData; //VARIANT型变量转换为COleSafeArray型变量
for (k = 0; k < fs.GetOneDimSize(); k++)
fs.GetElement(&k, str + k); //转换为BYTE型数组
//m_EditReveive = L("dwad");
m_EditReveive = str; // 接收到编辑框里面
//m_Icc = str;
//m_List.SetItemText(13, 0, m_Icc);
//m_EditReveive.SetWindowTextW();
//SetTimer(1,10,NULL); //
//UpdateData(false); //更新到控件
}
}
接收中断的添加,右键MScomm组件->添加消息处理程序->OnComm ,添加以上代码即可