最近做一个东西,由于是开发板向PC一直传输数据,故采用MSComm组件,
在台式机上调试时,程序良好,出现过丢数也出现过CPU利用率高,改了些东西,后来一直很好。
到了笔记本电脑上,问题出现了,开始丢数,于是我把MSComm的接收事件处理程序改更简单了一些,丢数基本解决,程序运行良好,后来就开始出现CPU录用率很高的问题,近100%,电脑累趴了……
MScomm初始化部分:if(m_MsComm.get_PortOpen())
m_MsComm.put_PortOpen(false);
m_MsComm.put__CommPort(1); //打开comm1
m_MsComm.put_InputMode(1); //输入方式为1:二进制方式,0:文本方式
m_MsComm.put_InBufferSize(512); //输入buffer设置
m_MsComm.put_OutBufferSize(512); //输出buffer设置
m_MsComm.put_Settings(TEXT("115200,n,8,1")); //串口通信参数设置,
m_MsComm.put_OutBufferCount(0); //清空发送缓冲区
m_MsComm.put_InBufferCount(0); //清空接收缓冲区 if(!m_MsComm.get_PortOpen())    //判断出为关闭的串口
{
m_MsComm.put_PortOpen(true); //打开串口
m_MsComm.put_RThreshold(1);//每当接收缓冲区有一个及以上字符则接收串口数据
m_MsComm.put_InputLen(0);//设置当前缓冲区长度为,0表示读取全部数据
m_MsComm.get_Input(); //预读缓冲区以清除残留数据
}
OnMSComm事件处理函数:就是双buff轮流接受,每收满一个buff换另一个,两个buff一样大
        if(m_MsComm.get_CommEvent()==2)     //事件值为2表示接收缓冲区内有字符
{
variant_inp = m_MsComm.get_Input();   //读缓冲区
safearray_inp = variant_inp;           
len=safearray_inp.GetOneDimSize(); //得到有效数据长度

    for(k=0;k<len;k++)
    {
safearray_inp.GetElement(&k,revData+k);//转换为BYTE型数组
if(strt_flg==false && 满足是一个有效帧的帧头的条件开始)
     strt_flg=true;
if(strt_flg)
  {
if(Revbuf_flg)
RevData1[Cunt_MSComm]=*(revData+k);
else
RevData2[Cunt_MSComm]=*(revData+k);
Cunt_MSComm++;
if(若接受数组buff已满) //lulu:不能再存储一个完整的最大帧
  {
if(Revbuf_flg)
{
   Cunt_MSComm=0;
    Revbuf_flg = false;
    处理第一个buff;
 }
else
{
    Cunt_MSComm=0;
    Revbuf_flg = true;
    处理第二个buff;
}
    }
                     }
              }
          }
屏蔽掉处理buff的部分程序就只剩下onMScomm的工作了,CPU利用率依然很高,
真心不知道怎么改了,大家帮帮忙呗!!!   我都不知道怎么查了,

解决方案 »

  1.   

    m_MsComm.put_RThreshold(1); 这个值改大点最高效的还是用API  http://msdn.microsoft.com/en-us/library/ff802693.aspx
      

  2.   

    m_MsComm.put_RThreshold(1);在m_MsComm.get_CommEvent()==2会反复处理下面的
    zgl7903的方法也可以
    或在 m_MsComm.get_CommEvent()==2 下面加上 if m_MsComm..GetInBufferCount()>= 数量,去处理下面的也可以
      

  3.   

    m_MsComm.put_Settings(TEXT("115200,n,8,1")); //串口通信参数设置,
    这个波特率太大了吧,通信不保证
      

  4.   

    你这种情况只要有一个数据就调用接收函数,你又同时在接收函数里进行了数据处理.你这么改试试:
    接收函数只把数据赋给buff就退出,开一个线程专门处理数据.如果线程都处理完数据,就sleep(10),然后再判断是否有数据.
      

  5.   

    谢谢,zgl7903   和 lid617,我会按照你们的建议去改改试试看,这个可能真是问题,只是今天忽然CPU利用率又降下来正常的,
    worldy:没办法,下位机那边的人说必须要这个速度,
    hdg3707:我接收buff满之后是发送消息,且不等返回让程序主线程处理的,应该不占用MScomm的接收时间吧!!ONMSComm函数不是一个独立线程么???新的问题:就是用串口调试精灵收,发现了较大的错帧,错数据,等,怀疑是笔记本上USB转232不靠谱,决定用USB在本子上调试看看。
      

  6.   

    分数不够发新的技术帖了,没办法,只能写在这了………………
    在VS2008中开发一个基于USB通信的上位机的程序,写好后在同事那里使用,一直运行良好。
    同样的代码,同一块开发板,换到别的PC机上就发现不行了,SetupDiEnumDeviceInterfaces()一直返回ERROR_NO_MORE_ITEMS。但在电脑的设备管理器上我能看到开发板设备。换了两台电脑一台笔记本都是同样的问题,也换过其他USB后,问题依然。另外,在跟踪调试中发现,在usb的驱动程序头文件guid.H中看到的预定义的GUID,与在设备管理器中通过设备详细信息,从注册表中看到的一个128位的ID不一样,从厂家提供的USB驱动中包含的一个.inf文件中看到的ClassGUID也都不一样。但是这些GUID也都不能得到USB句柄。  不解的很!!!本身技术就捉襟见肘,略占硬件,更是什么也不会了,挫败的很,望大侠不吝赐教。
      

  7.   

    问题基本解决,CPU利用率高的问题最近不出现了,谢谢各位!结了