串口有关问题:接收到字符的总是比小弟我发的少1,而最后发的那个字符则会触发新的一次中断

串口问题:接收到字符的总是比我发的少1,而最后发的那个字符则会触发新的一次中断
if(m_ctrlComm.GetCommEvent()==2)   //事件值为2表示接收缓冲区内有字符
{
strRXData=_T( " ");
variant_inp=m_ctrlComm.GetInput();   //读缓冲区
safearray_inp=variant_inp;     //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize();   //得到有效数据长度
.................
                    }
其中len=safearray_inp.GetOneDimSize();接收到字符的总是比我发的少1,而我最后发的那个字符则会触发新的一次中断,不知道是怎么回事?本来是一个字符串现在给分成了两次处理
串口初始化步骤如下:
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1);       //选择COM
m_ctrlComm.SetInputMode(1);   //输入方式为二进制方式
m_ctrlComm.SetInBufferSize(1024);   //设置输入缓冲区大小
m_ctrlComm.SetOutBufferSize(512);   //设置输出缓冲区大小
//波特率9600,无校验,8个数据位,1个停止位  
m_ctrlComm.SetSettings( "9600,n,8,1 ");  


------解决方案--------------------
标准的USB转成串口与普通的串口使用起来没什么区别的~

设置过程如下:
if(m_Com.GetPortOpen())
m_Com.SetPortOpen(FALSE);
m_Com.SetCommPort(1);//select com1
if(!m_Com.GetPortOpen())
m_Com.SetPortOpen(TRUE);//open serial port
m_Com.SetSettings( "9600,n,8,1);
m_Com.SetInputMode(1);
m_Com.SetRThreshold(1);
m_Com.SetInputLen(0);
m_Com.GetInput();
------解决方案--------------------
SetRThreshold(n)方法用于指定当组件收到的字符个数 > = n 时触发接收数据事件。如果你设的为1,那么就是每收到1个字符时,接收数据事件被触发。但是,由于应用程序处理与串口硬件通讯在速度上不可能保持一致,就有可能实际已经收到了2个、3个或是更多的字符,接收数据事件才被触发。所以,在做这一类通讯程序的时候,切不可假想我发送n个字符,接收端就一定能一次性接收到n个字符。你必须要根据实际通讯的要求,将接收的数据进行组合。这也就是各类通讯系统都要有“协议”的原因,通过起始标志、结束标志或其它特殊标志,用来对数据的完整性进行标识。