我想做一个监听串口的程序。但是又不想把串口的数据读走。各位给我提提建议。我该怎么做。。

解决方案 »

  1.   

    挺难的,你可以试试 ComSpy98
      

  2.   

    http://www.sysinternals.com/ntw2k/utilities.shtml
    有个Portmon v3.02,试试吧
      

  3.   

    我这里有一个串口类CSerialPort,它是通过起一个线程,在线程里面调用WaitCommEvent(...)函数。然后调用GetCommMask(..)函数判断是不是有数据,如果有数据,它就接收。你可以在这个类上面改一下,就可以了。如果你需要,留下email。
      

  4.   

    nanjianhui(nan) 
    谢谢。。
    这个我也有。我是不想把数据取走,但是还要能看到它。能告诉我该怎么改吗???
      

  5.   

    在SerialPort.cpp文件中的第340行是在检查EV_RXCHAR这个消息。如果有这个消息,表示有数据进入接收缓冲区了,然后它调用了ReceiveChar(...)函数。这个函数就已经将数据接收下来了,接收完成后,它有发送了一个消息,如下:
    ::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);
    我觉得你可以把ReceiveChar(...)函数改一下,让它不接收数据就可以了。
      

  6.   

    在ReceiveChar(...)函数中有下面这个代码,是用来接收数据的:
    bResult = ReadFile(port->m_hComm, &RXBuff, 1, &BytesRead,&port->m_ov);
    你把这一段代码按照你的想法改一下,就可以了。
      

  7.   

    nanjianhui(nan) 我的接收函数是这样的
    int CSerial::ReadData( void *buffer, int limit )
    { if( !m_bOpened || m_hIDComDev == NULL ) return( 0 ); BOOL bReadStatus;
    DWORD dwBytesRead, dwErrorFlags;
    COMSTAT ComStat; ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
    // if( !ComStat.cbInQue ) return( 0 ); dwBytesRead = (DWORD) ComStat.cbInQue;
    if( limit < (int) dwBytesRead ) dwBytesRead = (DWORD) limit; bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
    if( !bReadStatus ){
    if( GetLastError() == ERROR_IO_PENDING ){
    WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
    return( (int) dwBytesRead );
    }
    return( 0 );
    } return( (int) dwBytesRead );}
    我觉得和你的是一样的。但是调用ReadFile( m_hIDComDev, buffer, wBytesRead, &dwBytesRead, &m_OverlappedRead );这个函数就会把数据取走。我想把它读出来但是又不想将接收缓冲区的数据清掉。能帮我指点一下该怎么改啊。(我觉得单纯的改这个函数好像不行)
      

  8.   

    把com1和com2的读写互联,操作com1时在com2读。
      

  9.   

    to siphonelee(sifone):
        读是在读接收缓冲区,而写是在写发送缓冲区,不再同一个缓冲区的。
    关于楼主的这个问题,我觉得很难实现,不知道哪位高人有办法!!
        关注!!!!!!!!
      

  10.   

    有现成的这样的工具啊,你要自己写吗?那么你要自己写vxd,你可以在网上找到
    portman这样一个工具:
    copyright ?1999 Mark Russinovich 
    http://www.sysinternals.comPortmon is an application that lets you monitor serial and parallel activity on your local system, or any computer on the network that you can reach via TCP/IP. It is the most powerful tool available for tracking down port-related configuration problems and analyzing application port usage.Portmon works on Windows NT 4.0, Windows 2000, Windows 95 and Windows 98. Note: if you want to run Portmon on Windows 95 you must install the WinSock2 update, available for free download from Microsoft抯 Web site.
    你到google去search吧。
      

  11.   

    要是有权力操作端口,别人还能在不同进程中操作吗,你想看看,但不想留痕迹,可要是别的进程在控制端口时,你是否有权力去read 端口,我觉得从设计理论而言,应该不能这样子。
      

  12.   

    串口我没做过,不过做过Port的监听功能。代码就不帖了,方法就是定时去拼一下那个Port,看它是否正常。
      

  13.   

    take it easy,email me i will send you a example.
    [email protected]
      

  14.   

    参看 http://www.gjwtech.com/ 
     
    你可以下载一个,它串口调试器很好。*****************************************************
      学习,再学习。
      

  15.   

    watersome(不乖) 
    你可能没看明白我的意思。
    这个我也有。不过还是谢谢你。。
      

  16.   

    你的类正是我用的
    注意到有个readdatewating函数吗,它可以满足你的需要
      

  17.   

    接收下来再发给自己不行吗?缓冲区不同没关系把,发送成功后就会从发送缓冲-〉接受缓冲了没做过,瞎想的
    =fly by=
      

  18.   

    //监视串口事件线程函数
    DWORD FAR PASCAL CommWatchProc()
    {
      OVERLAPPED  os ;
      COMSTAT     ComStat;
      DWORD       dwErrorFlags,dwTemp;  memset( &os, 0, sizeof( OVERLAPPED ) ) ;
      os.hEvent = CreateEvent( NULL,TRUE,FALSE,NULL ) ;
      if (os.hEvent == NULL) return ( FALSE ) ;
      while (GetCommOpenFlag())
      {
         //只要接收队列中有字符,则取出
         ClearCommError(GetCommID(),&dwErrorFlags,&ComStat);
         dwTemp=ComStat.cbInQue;
     if (dwTemp>0)
     {
     ReadComm(dwTemp);
     }
     Sleep(50);
      }
      CloseHandle( os.hEvent ) ;
      return( TRUE ) ;
    }
    //读串口
    DWORD  ReadComm(DWORD dwLength)
    {
      COMSTAT  ComStat;
      DWORD    dwErrorFlags,dwError;
      BOOL     fReadStat;
      char     szTemp[MAX_COLS];  szTemp[0]='\0';
      fReadStat = ReadFile(idComm,szTemp,dwLength,&dwLength,&osRead);  if(!fReadStat)//读串口出错
      {
         if(GetLastError() == ERROR_IO_PENDING)//等待直到读完串口的数据
         {
            while( !GetOverlappedResult(idComm,&osRead,&dwLength,TRUE) )
            {
               dwError = GetLastError();
               if(dwError == ERROR_IO_INCOMPLETE)continue;
               else
               {
                  ClearCommError(idComm,&dwErrorFlags,&ComStat);
                  break;
               }
            }
         }//等待直到读完串口的数据
         else
         {
            ClearCommError(idComm,&dwErrorFlags,&ComStat);
            dwLength=0;
            return dwLength;
         }
      }//读串口出错
      szTemp[dwLength]='\0';
      
      DWORD i,j;
      for(i=0,j=nReceiveNum;i<dwLength;i++,j++)
      {
         szReceive[j]=szTemp[i];
         szReceive[j+1]='\0';
      }  
      nReceiveNum=nReceiveNum+dwLength;
      return dwLength;
     
    }
    这是我做项目过程中的一段代码,是监视串口的,要下班了,来不及整理,你自己看看吧!!!
      

  19.   

    你可以使用COMSTAT ComStat;
    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );ComStat.cbInQue中就是串口中有的数据长度
    此时数据并没有从其中读出
    如果你的程式发送读出的数据过短,可跳出,下次再读一次只到你读到正确的长度发送数据时如果你把 overlapped 参数设为NULL,则你会发现刻函数在执行完后才退出此时返回写入了多少个数据到串口&dwWrite是已发送的数据长,如果 overlapped 不为NULL 则返回的&dwWrite 一定为0你可以用上述方法来测试一下串口是否可以发送数据,发送了多少如果你要查发送的数据是否正确我想:你可以再用一台机器接收(或com1 到 com2) 查从COM1发送的数据和 COM2接收的是否正确就可以了
    还可参考
    http://www.csdn.net/develop/read_article.asp?id=9356