首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

VC串口通信奇怪有关问题,请!小弟拜谢

2011-12-21 
VC串口通信奇怪问题,请高手指点!!!小弟拜谢!我编写了一个串口调试小程序,可是遇到以下问题,请各位前辈和高

VC串口通信奇怪问题,请高手指点!!!小弟拜谢!
我编写了一个串口调试小程序,可是遇到以下问题,请各位前辈和高手指点:

问题1:   随着接受数据的增多,程序越来越慢,我用的CString   对象来保存接受数据,然后显示,怎么回事,请大家帮忙看看,接受代码如下:

void   CTestDlg::OnOnCommMscommBird()  
{
//   TODO:   Add   your   control   notification   handler   code   here

    UpdateData(true);

    VARIANT   variant_inp;
    COleSafeArray   safearray_inp;

    long   i   =   0;
    long   len,   k,   lCheck;
    BYTE   rxdata[2048];
    CString   recvtmp,   sRecvTempAll;
    sRecvTempAll   =   " ";
   
    if   (m_mscom.GetCommEvent()   ==   2)
    {
        variant_inp   =   m_mscom.GetInput();
        safearray_inp   =   variant_inp;
        len   =   safearray_inp.GetOneDimSize();
        for   (i   =   0;   i   <   len;   i++)
        {
            safearray_inp.GetElement(&i,   &rxdata[i]);  
        }  
            rxdata[i]   =   '\0 ';
       
        for(k=0;k <len;k++)   //将数组转换为Cstring型变量
        {
            BYTE   bt=*(char*)(rxdata+k);  

            if(m_BuHexDisplay.GetCheck())//十六进制显示
            recvtmp.Format( "%02X   ",bt);   //将字符以十六进制方式送入临时变量
            else  
            recvtmp.Format( "%c ",bt);   //将字符送入临时变量存放

            sRecvTempAll   +=   recvtmp;   //加入接收编辑框对应字符串  

        }
        m_sRecv   +=   sRecvTempAll;
        m_EdRecvmes.SetWindowText(m_sRecv);
        CString   sRecvCount,   sRecvTCount;

        if   (m_bCount)//数据长度计数控制
        {
m_lNumrecv   +=   len;   //接收长度增加
sRecvCount.Format( "%d ",   m_lNumrecv);
m_EdRecvCount.SetWindowText(sRecvCount);
        }

        if   (m_BuTime.GetCheck()   &&   m_mscom.GetInBufferCount()   ==   0   )   //接受次数计数
        {
m_lTimeRecv++;//接收次数增加
sRecvTCount.Format( "%d ",   m_lTimeRecv);
m_EdTimeRecv.SetWindowText(sRecvTCount);
        }
        }

}

问题2:接收计数时,发送数据稍长,大概〉50个字符,接受计数就会出错,越长出错越厉害,但是出错一定次数以后就正常计数了??   而且当加上端点调试时就不出错了,为什么???那位高手能帮的看看为什么?

大家帮忙顶一下,谢谢了啊!

[解决办法]
BYTE bt=*(char*)(rxdata+k);
为什么不直接写为
BYTE bt=*(rxdata+k);
或是
char bt=*(char*)(rxdata+k);
[解决办法]
if (m_mscom.GetCommEvent() == 2)
只表示有数据可读取
并不代表你一次传输的比方说100字符都到了啊


所以你可能会进入两次
OnOnCommMscommBird
自然计数就多了
[解决办法]
if (m_mscom.GetCommEvent() == 2)
只表示有数据可读取
我觉得你还应该进一步判断读取的是否为空,
我现在也是在做串口是接受gprs定位信息,也总是出现这种情况

热点排行