我是靠谱客的博主 震动橘子,最近开发中收集的这篇文章主要介绍VS2010编写的MFC串口程序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

刚刚学习MFC串口通讯,调试了一个串口通讯的程序,实现PC机与单片机的串口通讯,能够正常地收发数据。部分源代码如下:

// 打开串口函数
void CcommtestDlg::OnBnClickedButtonOpen()
{
// TODO: 在此添加控件通知处理程序代码
CString str1;
m_comb2.GetLBText(m_comb2.GetCurSel(),str1);//取得所选的字符串,并放在str里面
//str1=str1+','+'n'+','+'8'+','+'1';
//这句很重要
str1=str1+_T(",n,8,1");
if(m_mscomm.get_PortOpen()) //如果串口是打开的,则行关闭串口(在程序最后再打开串口)
{
m_mscomm.put_PortOpen(false);
}
//m_mscomm.put_CommPort(1); //选择COM1
m_mscomm.put_CommPort((m_comb1.GetCurSel()+1)); //选择COM口
m_mscomm.put_InBufferSize(1024); //接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);//以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件
//m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600,无检验位,,1个停止位8个数据位
m_mscomm.put_Settings(str1);//波特率
,无检验位,,1个停止位8个数据位
if(!m_mscomm.get_PortOpen())//如果串口没有打开则打开
{
m_mscomm.put_PortOpen(TRUE);//打开串口
AfxMessageBox(_T("串口打开成功"));
}
else
{
m_mscomm.put_OutBufferCount(0);//清空发送缓冲区
AfxMessageBox(_T("串口打开失败"));
}
}
// 关闭串口函数
void CcommtestDlg::OnBnClickedButtonClose()
{
// TODO: 在此添加控件通知处理程序代码
m_mscomm.put_PortOpen(FALSE);//关闭串口
AfxMessageBox(_T("串口已关闭"));
}
// 发送函数
void CcommtestDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true); //读取编辑框内容
m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据
//m_EditSend.Empty(); //发送后清空输入框
UpdateData(false); //更新编辑框内容
}
BEGIN_EVENTSINK_MAP(CcommtestDlg, CDialogEx)
ON_EVENT(CcommtestDlg, IDC_MSCOMM1, 1, CcommtestDlg::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()
// 事件处理函数
void CcommtestDlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
static unsigned int cnt=0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
static long totallen=0;
unsigned int data[1024]={0};
byte rxdata[1024]; //设置 BYTE 数组
CString strtemp;
if(m_mscomm.get_CommEvent()==2) //值为 2 表示接收缓冲区内有字符
{
cnt++;
variant_inp=m_mscomm.get_Input(); //读缓冲区消息
safearray_inp=variant_inp; ///变量转换
len=safearray_inp.GetOneDimSize(); //得到有效的数据长度
totallen+=len;
if(totallen>=4000)//接收窗口最多显示4000byte的数据,太多会使软件卡顿
{
m_EditReceive.Empty(); //发送后清空输入框
}
/*
//将接收到的数据总数在发送窗口显示出来
m_EditSend.Empty(); //发送后清空输入框
strtemp.Format(_T("%d"),totallen);
m_EditSend+=strtemp;
UpdateData(false); //更新编辑框内容
*/
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
for(k=0;k<len;k++) //将数组转换为 CString 型变量
{
strtemp.Format(_T("%c"),*(rxdata+k));
m_EditReceive+=strtemp;
CString temp=_T("rn"); //换行
m_EditReceive+=temp;
}
}
UpdateData(false); //更新编辑框内容
m_Edit.SetSel(-1, -1);
this->SetDlgItemTextW(IDC_EDIT2,m_EditReceive);//将m_EditReceive内容显示到ID为IDC_EDIT2的编辑框的最后位置
m_Edit.LineScroll(m_Edit.GetLineCount()-1,0);//将垂直滚动条滚动到最后一行
}
// 清空显示函数
void CcommtestDlg::OnBnClickedButtonCleardispaly()
{
// TODO: 在此添加控件通知处理程序代码
m_EditReceive.Empty(); //发送后清空输入框
UpdateData(false); //更新编辑框内容
}

最后

以上就是震动橘子为你收集整理的VS2010编写的MFC串口程序的全部内容,希望文章能够帮你解决VS2010编写的MFC串口程序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部