我最近刚开始做串口编程的工作,VC++ + MSComm控件实现。我参考的是
http://www.gjwtech.com/vcandc/scommassistantcode.htm 龚建伟老师的介绍。
我的问题很让我迷惑不解,郁闷死了,没法交差啊!!希望各位长者经常来我
这个帖子里看看,因为我不能一下表达清楚我的错误。各位慢慢就会发现错误的
地方,所以请大家以后继续关注我的问题好吗?先谢谢啊!!
部分代码如下:
void CCOMTestDlg::OnOnCommMscomm1() 
{
if(this->m_ctrlComm.GetCommEvent()==2)
{
VARIANT vResponse;
k=this->m_ctrlComm.GetInBufferCount();//k是CCOMTestDlg的变量存放接收到的字节数
if(k>0)
{
vResponse=m_ctrlComm.GetInput();
char * str;
str=(char *)(BYTE*)vResponse.parray->pvData;
rxdata=new BYTE[k];//rxdata是CCOMTestDlg类的变量接收到的字符存入rxdata
memset(rxdata,0,k);
for(int i=0;i<k;i++)
    rxdata[i]=(BYTE)(*(str+i));
this->xianshi(rxdata,k,this->m_strRXData);//自定义函数,将接收到的字符显示到接收编辑框, m_strRXData是接收框的变量
}
}
this->UpdateData(false);
}void CCOMTestDlg::xianshi(BYTE *data, int len, CString &str)//自定义函数
{
CString strtemp;
for(int k=0;k<len;k++)
{

BYTE bt=*(data+k);
strtemp.Format("%c",bt);
str+=strtemp;
}
}
运行结果是对的,可问题是如果我把OnOnCommMscomm1()函数中加AfxMessageBox("aaa")
当发送的数据比较多时,AfxMessageBox("aaa")被调用多次,也就是OnOnCommMscomm1()
会被执行多次,为什么啊?
对此我很迷惑,在我后续的工作当中出现了很多麻烦我认为和我对串口触发事件了解不透彻
有关系,请各位长者指点啊!!!!
有人愿意听我慢慢的把问题道来吗??

解决方案 »

  1.   

    我试图把xianshi(rxdata,k,this->m_strRXData)函数放到别的地方去那就不对啊.我做一个按扭IDC_BUTTON_CONVERT,当我点击它时执行xianshi函数.在它的BN_CLICKED事件中调用xianshi(rxdata,k,this->m_strRXData),我发现当发送的数据少于14字节时可以正确接收,而多于时,前面的14个字节数据就没有了,为什么啊?我该怎么解决?谢谢啊
      

  2.   

    SetRThreshold(short newValue)是设置收到多少字节时触发ONCOMM事件的
    先说问题,
    1。这里的rxdata每次都new,却没看到释放,很明显有内存泄漏,建议做成大的数组,也就是接收缓冲区了
    2。从SAFEARRAY中读数组,最好用它的AccessData,不要直接用parray,如下: UCHAR* p = NULL;
    int nlen = v.GetOneDimSize();
    v.AccessData((void**)&p);
             memcpy(rxdata, p, nlen);
    v.UnaccessData();
    3。 你收到的数据既然是字符串,为什么你用二进制模式接收,而不用字符串模式接收,可以用
        SetInputMode(0)设置为字符串模式,就没这么麻烦了吧
    4。为什么要把xiaoshi放在其它地方,当你点你的按钮时,你怎么知道你是不是漏过了几次OnComm事件,也就丢掉了几趟rxdata数据了