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)没清掉,我用断点单步运行却正常,请高手帮忙看看~~~~
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货