//添加的对串口的初始化语句
if(m_Comm.get_PortOpen()) //如果发现串口本来是打开的,则关闭串口
m_Comm.put_PortOpen(FALSE);
m_Comm.put_CommPort(2); //选择 COM2 端口
m_Comm.put_InputMode(1); //输入方式为二进制方式
m_Comm.put_InBufferSize(1024); //设置输入缓冲区
m_Comm.put_OutBufferSize(512); //设置输出缓冲区
m_Comm.put_Settings(TEXT("9600,n,8,1"));//波特率 9600,无校验,8 个数据位,1 个停止位
m_Comm.put_Settings(_T("9600,n,8,1"));
if(!m_Comm.get_PortOpen())
{
m_Comm.put_PortOpen(TRUE); //打开串口
m_Comm.put_RThreshold(1); //每当接收缓冲区有 1 个字符则接收串口数据
m_Comm.put_InputLen(0); //设置当前缓冲区长度为 0
m_Comm.get_Input(); //预读缓冲区以清除残留数据
}
else
AfxMessageBox(TEXT("打开端口失败!"),MB_ICONSTOP,0);
//AfxMessageBox(_T("打开端口失败!2222"),MB_ICONSTOP,0);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
//从串口接收数据并显示在编辑框中
void CSCommTestDlg::OnComm()
{
// TODO: 在此添加命令处理程序代码
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len,k;
unsigned int data[2048]={0};
byte rxdata[1024]; //设置 BYTE 数组
CString strtemp;
if(m_Comm.get_CommEvent()==2) //值为 2 表示接收缓冲区内有字符
{
AfxMessageBox(TEXT("0000000000"),MB_ICONSTOP,0);
variant_inp=m_Comm.get_Input(); //读缓冲区消息
safearray_inp=variant_inp; //VARIANT型变量转换成COleSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效的数据长度
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
}
for(k=0;k<len;k++) //将数组转换为 CString 型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format(TEXT("%c"),bt); //将字符送入临时变量 strtemp 存放
strtemp.Format(_T("%c"),bt);
m_Recv+=strtemp;//加入接收编辑框对应字符串
}
}
//AfxMessageBox(TEXT("11111111"),MB_ICONSTOP,0);
UpdateData(FALSE); //更新编辑框内容
//AfxMessageBox(TEXT("2222222"),MB_ICONSTOP,0);
}
运行效果如下图所示:
我在网上找到一个方法,说:
VS2010 中在 CPP 代码中手动加入映射 ACTIVEX 事件:
BEGIN_EVENTSINK_MAP(CControlDisplayView, CFormView)
ON_EVENT(CControlDisplayView,IDC_MSCOMM1
,1,OnMscomm1,VTS_NONE)
END_EVENTSINK_MAP()
在 H 文件 PROTECTED 定义
DECLARE_EVENTSINK_MAP()
在 FORM 界面选中 MSCOMM 控件,打开类向导,查看 MSCOMM 的 COMMAND 有没有指
定事件处理 OnMscomm1()。我试了但也还是没有解决问题,该如何解决呢?请大家帮忙!
8 个解决方案
#1
运行效果图,没有加载成功,这里附上:
#2
以上问题,这个帖子帮助我解决了问题。http://blog.csdn.net/drlsdrls/article/details/11126069
#3
我也刚好遇到这个问题,按照http://blog.csdn.net/drlsdrls/article/details/11126069 帖子的方法解决了,但是这是为什么呢?
有没有大神飘过的?
有没有大神飘过的?
#4
为什么只能想另一个串口发送数据,自己发送的数据 自己不能接受吗
#5
为什么我的控件不可以用
#6
你这个问题怎么解决的,我试了好多种方法,我编写的串口程序只能发送数据,但是不可以接收到数据,不能触发onmscomm时间,我也很纳闷
#7
你解决了嘛?我也遇到这个问题呢
#8
还是没有解决,VARIANT InputData = m_mscom.GetInput();//读缓冲区 就是这一句代码执行有问题。我进行了调试,把断点放在这句话之前就可以调试运行,把断点放在这句话之后完全没有作用,也就是说程序执行到这里就不起作用了,我到现在也没有解决这个问题,你能不能帮我看看。链接 http://bbs.csdn.net/topics/391975282
#1
运行效果图,没有加载成功,这里附上:
#2
以上问题,这个帖子帮助我解决了问题。http://blog.csdn.net/drlsdrls/article/details/11126069
#3
我也刚好遇到这个问题,按照http://blog.csdn.net/drlsdrls/article/details/11126069 帖子的方法解决了,但是这是为什么呢?
有没有大神飘过的?
有没有大神飘过的?
#4
为什么只能想另一个串口发送数据,自己发送的数据 自己不能接受吗
#5
为什么我的控件不可以用
#6
你这个问题怎么解决的,我试了好多种方法,我编写的串口程序只能发送数据,但是不可以接收到数据,不能触发onmscomm时间,我也很纳闷
#7
你解决了嘛?我也遇到这个问题呢
你这个问题怎么解决的,我试了好多种方法,我编写的串口程序只能发送数据,但是不可以接收到数据,不能触发onmscomm时间,我也很纳闷
#8
你解决了嘛?我也遇到这个问题呢
你这个问题怎么解决的,我试了好多种方法,我编写的串口程序只能发送数据,但是不可以接收到数据,不能触发onmscomm时间,我也很纳闷
还是没有解决,VARIANT InputData = m_mscom.GetInput();//读缓冲区 就是这一句代码执行有问题。我进行了调试,把断点放在这句话之前就可以调试运行,把断点放在这句话之后完全没有作用,也就是说程序执行到这里就不起作用了,我到现在也没有解决这个问题,你能不能帮我看看。链接 http://bbs.csdn.net/topics/391975282