33,008
社区成员
发帖
与我相关
我的任务
分享
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); 字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}
int com_index = 0;
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); 字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
for( int l = 0; l < len; l++)
{
if( 0xDD == rxdata[l])
{
com_index = 0; //就是将扫描接收到的字节里面有没有0xDD,有就将其存入全局数组中
//即,0xDD就是帧头,下次再到达的数据,就累积填到oxdd后面,之后再判断
//oxdd后面是否为0x22,如果是,将继续接收,再根据oxlen字节后面再接收len字节
DataRX[com_index + l] = rxdata[l];// DataRX为全局BYTE数组,con_index 为int全局
com_index++;
}
if(0xDD == DataRX[0]) //这步判断,如果有东西填进了datarx且DataRX[0]为oxdd,则继续接收
{
DataRX[com_index + l] = rxdata[l];//注意,这里的len是数据到来的长度,可能是1 2 3 4 5 6 7 中的任意一个
}
//如果上面的达成了,那DataRX数组,里面至少 0 1 位置至少为DataRX[0] = 0xDD ;DataRX[1]= 0x22
//接下来就是要判断数组DataRX[2]位置有没有填进0xlen,即长度,(只有0x04,0x05两种情况)
//有的话,根据0xlen信息,继续读取长度为0xlen个字节,但到这里,有点思路混乱,也感觉上面的那些步骤也不够好
//所以请教大家给点建议,怎么接收好,com_index什么时候致零号,还有就是不管是0xlen是0x04或0x05都不丢帧。
}
}
UpdateData(FALSE); //更新编辑框内容
}