我使用了网络上的Wushaojian先生的CnComm1.3基类,发现单独发送或者单独接受都没有问题,但是一个函数里面既向串口发信息,同时又接受串口传过来的信息,就不能够接受任何信息,请抽空帮我看看出错的原因,谢谢!
 
我的采取了两种方式调用都不行,不知道什么原因:
第一种方案:
  m_Com1.Open(1, "9600, 8, n, 1");
  
  OnPaySendData();//1.拼m_SendStr字符串  m_Com1.Write(m_SendStr); //2.对方机器成功接受了m_SendStr字符串
//3.断点,对方机器向我的机器发信息
  cnComm::InnerLock lock(&m_Com1);//线程保护
   vector<char>& vec_str = m_Com1.GetInput();//我未得到任何信息,获得缓冲区????
   m_RecvStr = "";//清空界面  
   strncpy(m_RecvStr.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
   m_RecvStr.ReleaseBuffer();//拷贝倒CString
 
   vec_str.clear();//清空缓冲区
   m_RecvStr += "\n\r";
 m_Com1.Close();
 
采取上面的方法,我未获取任何信息,但是如果我采用
1.开启我的com1
 m_Com1.Open(1, "9600, 8, n, 1");//默认9600
 
2.对方机器向我发信息。
3.我在对话框上单独起一个按钮
 CString m_Com1Recv,m_Com2Recv;
 cnComm::InnerLock lock(&m_Com1);//线程保护
 vector<char>& vec_str = m_Com1.GetInput();//获得缓冲区
 
 m_Com1Recv = "";//清空界面 
strncpy(m_Com1Recv.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
 m_Com1Recv.ReleaseBuffer();//拷贝倒CString
 
 vec_str.clear();//清空缓冲区
 m_Com1Recv += "\n\r";
 
这里GetInput能够获取信息。   
第二种方案:
1.先拼接字符串,向对方发信息
2.对方接受,并我的机器返回信息
3.启动自动接受对方机器发过来信息,并循环接受对方的机器发过来的信息,知道自动接受确认成功。  m_Com1.Open(1, "9600, 8, n, 1");
  
  if (m_ntran_type==1) //1 交易 2退交易 3 签到
  {
   OnPaySendData();
  }  
  m_Com1.Write(m_SendStr);
  //m_Com1.Close();
  //OnButton2() ;
  //ASSERT(m_Com1.IsOpen());
  //等待30秒
 
  cnComm::InnerLock lock(&m_Com1);//线程保护
//并循环接受对方的机器发过来的信息,知道自动接受确认成功。
  while (!m_flag)
  {
 
   char buf[1024];
   memset(buf,0,1024);
 
   vector<char>& vec_str = m_Com1.GetInput();//获得缓冲区
   m_RecvStr = "";//清空界面  
   strncpy(m_RecvStr.GetBuffer(vec_str.size()), vec_str.begin(), vec_str.size());
   m_RecvStr.ReleaseBuffer();//拷贝倒CString
 
   vec_str.clear();//清空缓冲区
   m_RecvStr += "\n\r";
  }//自动接受也失败。
LRESULT CTEST0::OnComRecv(WPARAM wParam, LPARAM lParam)
{
 if(wParam == 2)//端口号
 {
  char buf[1024];
  m_RecvStr += m_Com1.ReadString(buf, 1024);
  m_RecvStr += "\n\r";
  m_flag=true;
 }
 return 0;
}请抽空帮我看看程序,谢谢

解决方案 »

  1.   

    m_Com1.GetInput();//我未得到任何信息,获得缓冲区???? 这个GetInput应该不是读取数据的函数,试试看m_Com1.Read
      

  2.   


    m_hReadEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    m_hEventArray[0] = m_hShutdownEvent;
    m_hEventArray[1] = m_hReadEvent;
    m_hEventArray[2] = m_hWriteEvent;
    ... ...另起一个线程用事件触发来做接收,要用个死循环
    .. ...
    for (;;) 

      bResult = WaitCommEvent(port->m_hComm, &Event, &port->m_ov);
      if (!bResult)
      {
        switch (dwError = GetLastError()) 
        { 
    case ERROR_IO_PENDING: 
    {
    break;
    }
    case 87:
    {
    break;
    }
    default:
    {
    port->ProcessErrorMessage("WaitCommEvent()");
    break;
    }
        }
      }
      else
      {
    bResult = ClearCommError(port->m_hComm, &dwError, &comstat);
    if (comstat.cbInQue == 0)
    continue;
      }
      Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);
      switch (Event)
      {
        case 0://by hShutdownEvent
          //结束自己;
          AfxEndThread(100);
          break;
        case 1:// read event
    GetCommMask(port->m_hComm, &CommEvent);
    if(CommEvent & EV_CTS)//根据CommEvent其他状态做其他判断处理
                 ... ... if(CommEvent & EV_RXCHAR)//读一个char;
              ReceiveChar(port, comstat);//读一个char;自己累加
            break;
        case 2: // write event
    WriteChar(port);
    break;
      }
    }//end forever loop
    ... ...
    发送就准备好数据,
    SetEvent(m_hWriteEvent);
    即可