2.例程
程序的功能和界面(如下图)都与本文连载三中《基于WIN32 API的串口编程》相同,不同的只是连载三的串口通信以API实现,而本节的串口通信则以MSComm控件实现。





这样就建立了m_mscom和IDC_MSCOMM1控件的相互映射:
void CSerialPortActivexDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSerialPortActivexDlg)
DDX_Text(pDX, IDC_RECV_EDIT, m_recv);
DDX_Text(pDX, IDC_SEND_EDIT, m_send);
DDX_Control(pDX, IDC_MSCOMM1, m_mscom);
//}}AFX_DATA_MAP
}
同时,在对话框的头文件也会由"MFC类向导"自动定义CSerialPortActivexDlg类的CMSComm型成员变量m_mscom:
CMSComm m_mscom;
在对话框初始化时(即在CSerialPortActivexDlg::OnInitDialog函数中)打开串口1:
BOOL CSerialPortActivexDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,
strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_mscom.SetCommPort(1); //串口1
m_mscom.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_mscom.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes
if(!m_mscom.GetPortOpen()) //打开串口
{
m_mscom.SetPortOpen(true);
}
m_mscom.SetInputMode(1); //设置输入方式为二进制方式
m_mscom.SetSettings("9600,n,8,1"); //设置波特率等参数
m_mscom.SetRThreshold(1); //为1表示有一个字符即引发事件
m_mscom.SetInputLen(0);
return TRUE; // return TRUE unless you set the focus to a control
}
最核心的发送串口数据函数("发送"按钮单击事件)如下:
void CSerialPortActivexDlg::OnSendButton()
{
// TODO: Add your control notification handler code here
UpdateData(true);
CByteArray sendArr;
WORD wLength;
wLength = m_send.GetLength();
sendArr.SetSize(wLength);
for(int i =0; i<wLength; i++)
{
sendArr.SetAt(i, m_send.GetAt(i));
}
m_mscom.SetOutput(COleVariant(sendArr));
}
