使用了MSComm控件。
在OnInitDialog中:
m_Com.SetCommPort(1); //选择COM1
m_Com.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
m_Com.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes if(!m_Com.GetPortOpen()) //打开串口   
m_Com.SetPortOpen(TRUE);
m_Com.SetInputMode(1); //设置输入方式为二进制方式
m_Com.SetSettings("9600,n,8,1"); //设置波特率等参数
m_Com.SetRThreshold(1); //为1表示有一个字符引发一个事件    
m_Com.SetInputLen(0);
接收代码如下:
void CMyDlg::OnCommMscomm()
{
    VARIANT vResponse;
char *str;
char *str1;
    int k, nEvent, i;
   
    nEvent = m_Com.GetCommEvent();    switch(nEvent)
{
case 2:  
k = m_Com.GetInBufferCount(); //接收到的字符数目
                  //为什么k总是不能大于8 ***
                 
m_K = k; 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;
   }       UpdateData(FALSE);
}***处为什么k总是不能大于8?比如我发送abcdefghi时,k为1,也只显示收到i?用串口调试助手发送的字符串应该没错,可是接收处代码哪错了?

解决方案 »

  1.   

    可能是每次都是一个字符就启动接受程序一次,导致k是1,而只显示收到最后一个字符!建议添加一个成员变量,在每次接受程序启动的时候,在cstring变量后面,加上字符,直到结束符!串行通信的结束符要自己定义,否则,不好判断终结时刻!!
      

  2.   

    以前在VB里用过MSCOMM控件,VB里设置了控件各参数后要使用DoEvents语句才能接收,好像这个控件不是独立的线程,你调用它它才工作。楼主,VC里干嘛要用它?应该利用VC的灵活性,开个线程调用API函数,就不会有这些问题了。
      

  3.   

    CString recvBuf;
    recvBuf.Empty();
    ....
    if(k > 0)
    {
    vResponse=m_Com.GetInput(); //read
    //对数据进行其他处理 
             str = (char*)(unsigned char*) vResponse.parray->pvData;
             recvBuf+=str;
    ......
    }    recvBuf就是接收到的字符
      

  4.   

    把每次收到的数据,用个全局CString类型,存下来,处理。
      

  5.   

    这句就是了:
    m_Com.SetRThreshold(1); //为1表示有一个字符引发一个事件    
      

  6.   

    这样可以搞定的! 
       VARIANT vResponse;    
        COleSafeArray safearray_inp;    
        LONG len,k;    
        BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.    
        CString strtemp; 
    int nEvent;
        nEvent = m_Com.GetCommEvent();
    switch(nEvent)
    {
    case 2: //事件值为2表示接收缓冲区内有字符

    vResponse=m_Com.GetInput(); //read
                    safearray_inp=vResponse; //VARIANT型变量转换为ColeSafeArray型变量
                    len=safearray_inp.GetOneDimSize(); //得到有效数据长度
    m_K=len;
    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存放  
                        recvBuf+=strtemp; //加入接收编辑框对应字符串

    }

         m_strReceive = recvBuf;