VS2010使用Mscomm控件,接收数据时出现异常,求解答?

feidengshan 2016-04-21 02:46:36
void CRSDlg::OnBnClickedButtonOpen()
{
// TODO: 在此添加控件通知处理程序代码
CString str,str1,n;//定义字符串
GetDlgItemText(IDC_BUTTON_OPEN,str);
CWnd *h1;
h1=GetDlgItem(IDC_BUTTON_OPEN);//指向空间的caption
if(!m_mscom.get_PortOpen())
{
m_Comb2.GetLBText(m_Comb2.GetCurSel(),str1);//取得所选的字符,放在str1里面
str1=str1+','+'n'+','+'8'+','+'1';//设置数据格式
m_mscom.put_CommPort((m_Comb1.GetCurSel()+1));//选择串口
m_mscom.put_InputMode(1);//设置输入方式为二进制方式
m_mscom.put_Settings(str1);//设置波特率
//m_mscom.put_Settings(_T("9600,n,8,1"));
m_mscom.put_InputLen(1024);//设置当前接收区数据长度为1024
m_mscom.put_RThreshold(1);//缓冲区一个字符引发事件
m_mscom.put_RTSEnable(1);//设置RT允许
m_mscom.put_PortOpen(true);//打开串口
if(m_mscom.get_PortOpen())
{
str=_T("关闭串口");
UpdateData(true);
h1->SetWindowText(str);//改变按钮名称为“关闭按钮”
}
}
else
{
m_mscom.put_PortOpen(false);
if(str!=_T("打开串口"))
{
str=_T("打开串口");
UpdateData(true);
h1->SetWindowText(str);//改变按钮名称为打开串口
}
}
void CRSDlg::OnComm()
{
static unsigned int cnt = 0;
VARIANT variant_inp;
COleSafeArray safearryay_inp;
long len,k;
unsigned int data[1024]={0};
byte rxdata[1024];
CString stremp;
if(m_mscom.get_CommEvent() == 2)
{
cnt++;
variant_inp = m_mscom.get_Input();
safearryay_inp = variant_inp;
len = safearryay_inp.GetOneDimSize();
for(k=0;k<len;k++)
{
safearryay_inp.GetElement(&k,rxdata+k);
}
for (k=0;k<len;k++)
{
stremp.Format(_T("%c"),*(rxdata+k));
m_EditReceive += stremp;
CString temp=_T("\r\n");
m_EditReceive += temp;
}
}
UpdateData(FALSE);
}

以上是部分代码,疯了,总是有问题,最后这个问题,程序调试没问题,运行之后,打开串口接收数据就会提示图片显示的那样,
RS.exe 中的 0x7582845d (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x00000000 处的 [rethrow]。
RS.exe 中的 0x7582845d (KernelBase.dll) 处最可能的异常: Microsoft C++ 异常: 内存位置 0x003bd7d4 处的 COleDispatchException。
实在是不知道为啥了?求各位大神解决
...全文
1782 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-05-09
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。 判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}
三岁、就很帅 2017-05-09
  • 打赏
  • 举报
回复
Cstring m_EditReceive,stremp ; for (k=0;k<len;k++) { BYTE bt=*(char*)(rxdata+k); //字符型 stremp.Format("%02X ",bt); m_EditReceive += stremp; }
zhujinqiang 2017-05-09
  • 打赏
  • 举报
回复
引用 5 楼 sunnyloves 的回复:
Mscomm是vc6时代的了,相信你也很烦那些varient,用第三方类,几个函数就可以解决问题http://blog.csdn.net/sunnyloves/article/details/5575995
楼主如果一定要用Mscomm可以安装一个vc6
zongkan3161 2017-05-09
  • 打赏
  • 举报
回复
我也是这个问题有没有人能帮忙解决的啦
嘻嘻666 2017-03-03
  • 打赏
  • 举报
回复
我也遇到同样问题,请问有解决的吗?
Sky-Ye 2017-03-03
  • 打赏
  • 举报
回复
我也遇到同样问题,请问有解决的吗?
cheng_xu_yuan123 2016-09-08
  • 打赏
  • 举报
回复
我也遇到同样问题,请问有解决的吗?
feidengshan 2016-04-28
  • 打赏
  • 举报
回复
多谢各位了,,虽然还是没找到问题,,但是debug得到的exe文件在其他计算机上却运行的很好,没有出现问题,不知道为啥!先这样吧
zgl7903 2016-04-27
  • 打赏
  • 举报
回复
有没有映射事件 ? DECLARE_EVENTSINK_MAP BEGIN_EVENTSINK_MAP ON_EVENT END_EVENTSINK_MAP
qq_29818485 2016-04-27
  • 打赏
  • 举报
回复
我遇到和你一样的问题,我将数据通过蓝牙适配器转串口接收后出现这个问题,直接用usb串口能接收到数据,不知道你是不是也是用蓝牙传输才出的这个问题,我也在想如何才能解决蓝牙接收这个问题。
洗洗睡去 2016-04-27
  • 打赏
  • 举报
回复
Mscomm是vc6时代的了,相信你也很烦那些varient,用第三方类,几个函数就可以解决问题http://blog.csdn.net/sunnyloves/article/details/5575995
许文君 2016-04-25
  • 打赏
  • 举报
回复
先catch下,看看抛出的啥异常,然后下断跟,看看在哪一步出现问题
schlafenhamster 2016-04-21
  • 打赏
  • 举报
回复
调试一下 看哪里问题 ?

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧