rs232串口数据通讯,用api,不能发送,也不能接受!我已经用漆包线把com1的2,3引脚给连起来了。
打开,关闭口是正确的,发送不成功,接受的总是“烫烫烫烫”这写字符
代码如下:
void CCommDlg::OnOpenPort() 
{
char *pszFileName="COM1";

DCB dcb; hComm=CreateFile(pszFileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);

if(hComm==INVALID_HANDLE_VALUE)
{
AfxMessageBox("Open Error!");

}
else
{
GetCommState(hComm,&dcb); dcb.BaudRate=CBR_9600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;

if(!SetCommState(hComm,&dcb))
{
AfxMessageBox("Set Error!");
CloseHandle(hComm);
}
else
{
AfxMessageBox("Open Success!");
//CloseHandle(hComm);
}
}
}void CCommDlg::OnClosePort() 
{
CloseHandle(hComm);
}void CCommDlg::OnSendText() 
{
DWORD dwWriteLen;
UpdateData(TRUE);
if(WriteFile(hComm,m_szSendText,m_szSendText.GetLength(),&dwWriteLen,NULL)==TRUE)
{
AfxMessageBox("Written ok!");
AfxMessageBox(m_szSendText);
}

}void CCommDlg::OnGetText() 
{
COMSTAT cs;
DWORD dwError,nBytesRead;
char szBuf[8];

ClearCommError(hComm,&dwError,&cs); ReadFile(hComm,szBuf,cs.cbInQue,&nBytesRead,NULL); m_szGetText=szBuf;
UpdateData(FALSE);
}

解决方案 »

  1.   

    up
    我已经用漆包线把com1的2,3引脚给连起来了。用于自发自收的测试。
      

  2.   

    在发送数据后,查看dwWriteLen是否等于发送字符长度,要不你也可以用调试器看看到底是发送出错还是接受方面出错。调试器是一个软件,你可以下载来看看
      

  3.   

    if(WriteFile(hComm,m_szSendText,m_szSendText.GetLength(),&dwWriteLen,NULL)==TRUE)
    {
    AfxMessageBox("Written ok!");
    AfxMessageBox(m_szSendText);
    }
    你用的是异步方式打开串口,异步方式发送不是这么判断的啊。
      

  4.   

    ZComm::Write(BYTE *buf,int buflen)
    {
        BOOL fWriteStat;
    DWORD       dwErrorFlags;
    DWORD    dwError;
    COMSTAT     ComStat;
    char        szError[ 10 ] ;
        DWORD       ret; if (fCOMMOpened==0) return -2 ;//串口未打开
        
        ret=0;
    if (olap) 
    {  
       fWriteStat = WriteFile(idComDev,buf,buflen,&ret, &WRITE_OS ) ;
       if (!fWriteStat) 
       {
          if ((dwError=GetLastError()) == ERROR_IO_PENDING)
      {
        
         while (!GetOverlappedResult(idComDev,&WRITE_OS,&ret, TRUE ))
     {  
     dwError = GetLastError();
     if(dwError == ERROR_IO_INCOMPLETE)
     {
         OutputDebugString("write io pending");
     continue;
     }
     else
     {
        //an error occurred, try to recover
     wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
     OutputDebugString(szError);
     ClearCommError(idComDev, &dwErrorFlags, &ComStat ) ;
     if (dwErrorFlags > 0)
     {
      wsprintf( szError, "\n\r <CE-%u>",dwErrorFlags ) ;
    OutputDebugString(szError);
     }
        break;
      }
     }
      }
      else
      {  
     // some other error occurred
                 wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
     OutputDebugString(szError);
                ClearCommError(idComDev,&dwErrorFlags,&ComStat ) ;
     
     if (dwErrorFlags>0)
     {
        wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags) ;
       OutputDebugString(szError);
     }
          return ( FALSE );
      }
       }
       
    }
    else 
    {
      fWriteStat = WriteFile(idComDev, buf,(DWORD)buflen,&ret, NULL);
      if (!fWriteStat) 
      {
     if(GetLastError() == ERROR_IO_PENDING)
     {
       dwError = GetLastError();
     // an error occurred, try to recover
     wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
     OutputDebugString(szError);
     ClearCommError(idComDev, &dwErrorFlags, &ComStat ) ;
     if (dwErrorFlags >0)
     {
    wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
    OutputDebugString(szError);
     }
       }
       else
       {  
     // some other error occurred
                 ClearCommError(idComDev, &dwErrorFlags, &ComStat ) ;
     if (dwErrorFlags > 0)
       {
       wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
     OutputDebugString(szError);
     }
     return ( FALSE );
       }
       }
    }

    return (ret);
    }这是我的一个串口写入的函数,你自己看看如何判断串口是否写成功吧,还有就是检查一下你的串口是否正常
      

  5.   

    找CSerialPort下来看看
    我一直都使用这个类.挺好用的。
      

  6.   

    http://expert.csdn.net/Expert/TopicView1.asp?id=2670098
    我也遇到串口问题
      

  7.   

    真是搞笑,没听说过一个串口环起来的!!
    串行口啊,串行通信,也能全双工??
    你把COM1和COM2环起来测啊...
    2-3
    3-2
    5-5
    把COM1和COM2的2,3交叉,5直连
      

  8.   

    我试用了一下,在win98下没有问题,可以发送数据
    只是在win2k和winxp下没有成功。关注~~~~~~~~~~