void CRS232Dlg::OnSendData() //第一次按这个按钮接收数据
{
// TODO: Add your control notification handler code here
int len;
CString m_ascii;
CByteArray m_Array;
flag = 0;
m_ascii="7E 01 0C 8B CC"; 
len=String2Hex(m_ascii,m_Array);
m_comport.SetOutput(COleVariant(m_Array));} 
void CRS232Dlg::OnButton1() //第2次发送按钮
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_comport.SetInBufferCount(0);
if (m_input1>112.99 || m_input1<0) 
MessageBox("超出数据范围");
int len;
    CString gdata,gjiao,sendchar;
CByteArray m_Array;
double x;
flag= 1;
    m_input1=int(m_input1);
gdata=Dotohex(int(m_input1));//调用十进制转换十六进制的函数
x=m_input1+335.0;
    gjiao=Dotohex(x);
    sendchar="7E01D0"+gdata+gjiao+"CC";
len=String2Hex(sendchar,m_Array);
    m_comport.SetOutput(COleVariant(m_Array));
   }
void CRS232Dlg::OnComm() 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp,n;
COleSafeArray safearray_inp,a;
LONG len,i,k=0;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp,m_RcvData,x,m_scvData;
if(m_comport.GetCommEvent()==2 ) //事件值为2表示接收缓冲区内有字符
{
k=m_comport.GetInBufferCount();//缓冲区接收字符字节数
j+=k;
//MessageBox(j);
if (j<160 && flag) {
m_comport.GetInput();
     m_comport.SetInBufferCount(0);
//ProcessData(10,m_scvData);
// m_comport.SetInputLen(0);
}
if (j>160  ) 
{
j=0;
variant_inp=m_comport.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(i=0;i<len;i++)
safearray_inp.GetElement(&i,rxdata+i);//转换为BYTE型数组
for(i=0;i<len;i++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+i); //字符型strtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔
m_RcvData+=strtemp; //加入接收编辑框对应字符串 
}
ProcessData(68,m_RcvData);
}
}
}现在问题是按了第一次接收数据正常,数据长度34字节,然后按第2个接收数据是5个字节,忽略接收,第3次我再按第一个按钮,接收到了39字节,上次的5个字节还在,没有清除,缓冲区到底是怎么清的,我用了m_comport.SetInBufferCount(0)没清掉,我用断点单步运行却正常,请高手帮忙看看~~~~

解决方案 »

  1.   

    if  (j>160)改为if(j>160 && !flag)  160为了一次读出全部字符
      

  2.   

    m_comport,SetInBufferCount,SetOutput等变量和函数是自己定义的还是第三方开发包啊?没看明白。如果你想清空socket缓冲区的话,你可以接收这5个字节不处理就行了啊,或者在WSAIoctl()中使用SIO_FLUSH吧。
      

  3.   

    我用的是MSComm控件~~你说的哪些是API函数吗?
      

  4.   

    DDDDD,高手过来帮忙看看啊~~~清缓冲区的问题
      

  5.   

    SetInBufferCount,SetOutput等变量和函数是自己定义的还是第三方开发包啊?应该是这些函数的问题