我用Mscomm控件通过串口读取条形码,mscomm控件已初始化,大不知为什么每次用扫描枪扫描条形码的时候,扫描枪好像会读两次数据的,代码如下:
void CMyDlg::OnOnCommMscomm1() 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray colesafearry_inp;
LONG len,k;
BYTE rxdata[50];
CString strBarNum,strtemp;
if (m_com.GetCommEvent()==2)
{
variant_inp=m_com.GetInput();
colesafearry_inp=variant_inp;
len=colesafearry_inp.GetOneDimSize();
for(k=0;k<len;k++)
{
colesafearry_inp.GetElement(&k,rxdata+k);
}
for (k=0;k<len;k++)
{
BYTE bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
                            strBarNum+=strtemp;
                   }
                   AfxMessageBox(strBarNum);
           }
}
每扫描一次会弹出两次MessageBox的,请问这时甚么原因?谢谢

解决方案 »

  1.   

    不知道为什么,mscomm控件一次oncomm(commevent == 2),8个字符,9个字符就会oncomm两次
      

  2.   

    mscomm用的比较少,也就没太去了解。
      

  3.   

    要多收几次.直接缓冲区空了为止.搞一块内存,一个指针,收一次,放进去点,指针指到结尾,再收,再从指针处放...直到串口级冲区为空.它收得多了,就会触发多次OnOnCommMscomm1() 
      

  4.   

    我把SetInputLen 设为14(条形码的位数)和SetRThreshold设为14后问题就解决
      

  5.   

    我是一个c++的初学者,想就这位仁兄的代码提一些问题:    COleSafeArray colesafearry_inp;//COleSafeArray是类名吗? 为什么m_com.GetInput()付给variant_inp后,还要将variant_inp付给colesafearry_inp 这是什么意思?是不是
    colesafearry_inp.GetOneDimSize()中的GetOneDimSize()在variant_inp里边没有?而colesafearry_inp.GetOneDimSize()是什么意思?感觉是variant_inp中的内容扣到colesafearry_inp中之后colesafearry_inp又调用自身的GetOneDimSize()方法获取读入的条形码    colesafearry_inp.GetElement(&k,rxdata+k);中的GetElement(&k,rxdata+k)函数是干啥用的rxdata不是数组名吗?它加上k是啥意思?
      

  6.   

    VC下面我从来没用过MSCOMM,只在Delphi里用,vc里直接用API更方便。
      

  7.   

    直接使用API来处理更方便,我们把Com口当做一个文件来处理不好么?
      

  8.   

    MSCOMM也很好用啊,只要设置几个参数就好了,接收都在OnComm里面