各位大哥,小弟最近作关于串口通信的工程,遇到一点困难,协议如下:7B是协议头,7D
是协议尾,还有一个校验位,对中间的内容进行分析,我用的是VC中的MSComm控件,可
触发函数是每次接收8个字符,而不是全部,可调试的时候是全部,我就进行了一下处理
,把接收到的字符先写入一个缓冲区里,如果判断是尾部,就进行分析,传送一条命令是
正确的,连续传送两条命令就错误了,第一条正确,第二条错误.我把关键代码贴出来,
各位替我分析一下:
extern CString buffer;//buffer是全局变量
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;
static int var=1;
int temp[3],index=1;
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("%02X ",bt);
buffer+=bt;
}
for(i=0;i<buffer.GetLength();i++)
{
var++;
 if(buffer.GetAt(i)==0x7d)
{
temp[index++]=var; //temp[]里存的是每条数据的尾部位置
end=TRUE;
}
}
if(end==FALSE)
return; //说明数据没有接受完,继续接收
CString str;
for(i=0;i<index-1;i++)
{
str=buffer.Mid(temp[i],temp[i+1]-temp1[i]);
cmd[i]=str;  //cmd[]里存的是分析后的每条数据
for(j=0;j<str.GetLength();j++)
 {string.Format("%02X ",str.GetAt(j));
m_display=m_display+string; //把它显示出来
 }
 m_display+="\r\n";
}
......