RT,两个COM口时编译没报错,可是一点运行就不行了,提示联机检查解决方案并关闭该程序或者关闭程序的对话框。
程序如下,不知道是不是哪里打错了还是怎么了?
初始化部分://////////////////////////初始化COM1/////////////////// m_ctrlComm.SetCommPort(1);   //选择COM1
m_ctrlComm.SetInputMode(1); //输入方式为二进制方式
m_ctrlComm.SetInBufferSize(1024); //设置输入缓冲区大小
m_ctrlComm.SetOutBufferSize(512); //设置输出缓冲区大小
//波特率57600,无校验,8个数据位,1个停止位 
m_ctrlComm.SetSettings("57600,n,8,1"); 
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打开串口
//参数1表示每当串口接收缓冲区中有多于
//或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetRThreshold(1); 
m_ctrlComm.SetInputLen(0);  //设置当前接收区数据长度为0
m_ctrlComm.GetInput();    //先预读缓冲区以清除残留数据 //////////////////////初始化COM2//////////////////////// m_ctrlComm2.SetCommPort(3);   //选择COM3
m_ctrlComm2.SetInputMode(1); //输入方式为二进制方式
m_ctrlComm2.SetInBufferSize(1024); //设置输入缓冲区大小
m_ctrlComm2.SetOutBufferSize(512); //设置输出缓冲区大小
//波特率57600,无校验,8个数据位,1个停止位 
m_ctrlComm2.SetSettings("57600,n,8,1"); 
if(!m_ctrlComm2.GetPortOpen())
m_ctrlComm2.SetPortOpen(TRUE);//打开串口
//参数1表示每当串口接收缓冲区中有多于
//或等于1个字符时将引发一个接收数据的OnComm2事件
m_ctrlComm2.SetRThreshold(1); 
m_ctrlComm2.SetInputLen(0);  //设置当前接收区数据长度为0
m_ctrlComm2.GetInput();    //先预读缓冲区以清除残留数据
oncom部分
void CChuankouDlg::OnComm() 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
long ltr,dushu;
int i;
double tstr=0;
char tt[10],ff[7];
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
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("%02X",bt);    //将字符送入临时变量strtemp存放
m_strEditRXData+=strtemp;  //加入接收编辑框对应字符串  
} ltr=strlen(m_strEditRXData);            if (m_strEditRXData[ltr-10]=='F' &&  m_strEditRXData[ltr-9]=='F' &&  m_strEditRXData[ltr-8]=='8' && m_strEditRXData[ltr-7]=='1'  )
{
tt[0]=m_strEditRXData[ltr-10];
     tt[1]=m_strEditRXData[ltr-9];
     tt[2]=m_strEditRXData[ltr-8];
     tt[3]=m_strEditRXData[ltr-7];
     tt[4]=m_strEditRXData[ltr-6];
     tt[5]=m_strEditRXData[ltr-5];
     tt[6]=m_strEditRXData[ltr-4];
     tt[7]=m_strEditRXData[ltr-3];
     tt[8]=m_strEditRXData[ltr-2];
     tt[9]=m_strEditRXData[ltr-1];

}            else 
goto k; m_strEditRXData="\0"; for(i=0;i<10;i++)
{
                m_strEditRXData+=tt[i];
}
}
UpdateData(FALSE); //更新编辑框内容
k:;
}void CChuankouDlg::OnComm2() 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组
CString strtemp;
if(m_ctrlComm2.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
long ltr,dushu;
int i;
double tstr=0;
char tt[10],ff[7];
variant_inp=m_ctrlComm2.GetInput(); //读缓冲区
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("%02X",bt);    //将字符送入临时变量strtemp存放
m_strEditRXData2+=strtemp;  //加入接收编辑框对应字符串  
} ltr=strlen(m_strEditRXData2);            if (m_strEditRXData2[ltr-10]=='F' &&  m_strEditRXData2[ltr-9]=='F' &&  m_strEditRXData2[ltr-8]=='8' && m_strEditRXData2[ltr-7]=='1'  )
{
tt[0]=m_strEditRXData2[ltr-10];
     tt[1]=m_strEditRXData2[ltr-9];
     tt[2]=m_strEditRXData2[ltr-8];
     tt[3]=m_strEditRXData2[ltr-7];
     tt[4]=m_strEditRXData2[ltr-6];
     tt[5]=m_strEditRXData2[ltr-5];
     tt[6]=m_strEditRXData2[ltr-4];
     tt[7]=m_strEditRXData2[ltr-3];
     tt[8]=m_strEditRXData2[ltr-1];

}            else 
goto g; m_strEditRXData2="\0"; for(i=0;i<10;i++)
{
                m_strEditRXData2+=tt[i];
} }
UpdateData(FALSE); //更新编辑框内容
g:;
}

解决方案 »

  1.   

    错误好像是这个:the program 'C:\Users\...\chuankou.exe' has exited with code -1073741819 (0xC0000005).
    但是不知道是什么意思?
      

  2.   

    你还是单步执行吧,但下位机先不要运行,就是不让串口执行通信,先看看程序执行到哪出的错,不知道是不是两个串口事件的事,你的第二个串口事件是怎么加的,如果手工加,就得加全了,你可以查找一下OnCOmm这个关键字,看都哪些地方出现,在凡是出现的地方原样你加上OnComm2,就是把OnComm改成OnComm2就行了