关于MSCommm控件解决办法

关于MSCommm控件
今天在做串口通信的时候,碰到一个问题
void CCharTerminalDlg::OnCommMscomm()
{
    VARIANT vResponse;
char *str;
char *str1;
    int k, nEvent, i;
   
    nEvent = m_Com.GetCommEvent();

    switch(nEvent)
{
case 2:  //收到大于RTHresshold个字符
k = m_Com.GetInBufferCount(); //接收到的字符数目

if(k > 0)
{
vResponse=m_Com.GetInput(); //read
//对数据进行其他处理 
           str = (char*)(unsigned char*) vResponse.parray->pvData;
}    
// 接收到字符,MSComm控件发送事件
i = 0;
str1 = str;
while (i < k)
{
i++;
str1++;
}
*str1 = '\0';
m_strReceive = (const char *)str;
//清除字符串中的不必要字符
break;
case 3:  //CTS线状态发生了变化
break;
case 4:  //DSR线状态发生了变化
break;
case 5:  //CD线状态发生了变化
break;
case 6:  //Ring Indicator发生变化
break;
    }    

UpdateData(FALSE);
m_nEdit.Invalidate();
}


我通过虚拟串口可以让k的值大于0,但不知道为什么老是在vResponse=m_Com.GetInput();死循环
------解决方案--------------------
是不是控件的参数设置有误了。。

------解决方案--------------------
你对比一下定义及顺序,函数名不一样没关系,因为VC版本不一样,但你能看明白函数含义:
void CMy72V300AView::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
long i = 0,len;
switch (m_Comm1.get_CommEvent())
{
case 2:
//表示接收缓冲区内有字符
{

variant_inp = m_Comm1.get_Input();
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize();
for (i = 0; i < len; i++)
{
safearray_inp.GetElement(&i, &m_ReceBuff[i]);   
}   
m_Comm1.put_OutBufferCount(0);// '清空发送缓冲区
m_Comm1.put_InBufferCount(0);// '滑空接收缓冲区
safearray_inp.Clear();
}
break;
default:
break;
}
}
串口初始化:
view1->m_Comm1.put_CommPort(1); //串口1
view1->m_Comm1.put_InBufferSize(4096); //设置输入缓冲区的大小,Bytes   
view1->m_Comm1.put_OutBufferSize(2048); //设置输入缓冲区的大小,Bytes   
if(!view1->m_Comm1.get_PortOpen()) //打开串口
{
view1->m_Comm1.put_PortOpen(true);   
}
view1->m_Comm1.put_OutBufferCount(0);// '清空发送缓冲区
view1->m_Comm1.put_InBufferCount(0);// '滑空接收缓冲区

view1->m_Comm1.put_InputMode(1); //设置输入方式为二进制方式   
view1->m_Comm1.put_Settings(str); //设置波特率等参数   
view1->m_Comm1.put_RThreshold(8); //为8表示有8个字符即引发事件   
view1->m_Comm1.put_InputLen(0);
这是发送函数:
int i,Count;
BYTE SendBuff[8];
CByteArray Array;
Count=8;
Array.RemoveAll();
Array.SetSize(Count);

SendBuff[0]=0;
SendBuff[1]=0;
SendBuff[2]=0;
SendBuff[3]=0;
SendBuff[4]=0x55;
SendBuff[5]=0xaa;
SendBuff[6]=0x55;
SendBuff[7]=0xaa;
for(i=0;i<Count;i++)
Array.SetAt(i,SendBuff[i]);
m_CurrentCommandId=2;
m_Comm1.put_OutBufferCount(0);
// m_Comm1.put_InBufferCount(0);

m_Comm1.put_Output(COleVariant(Array)); 
------解决方案--------------------
我的串口可以收到数据,而且这个程序用了得有10年以上了.你先拿个串口助手试试能不能收到数据,别是虚拟串口的驱动有问题.另外LINUX下的CH341驱动有问题,只能满16个字节才能上传,也就是如果不到16个字节你就会死循环在那
------解决方案--------------------
应该是一直触发oncommmscomm()吧