我想做一个监听串口的程序。但是又不想把串口的数据读走。各位给我提提建议。我该怎么做。。
解决方案 »
- button怎样响应tab中子类的消息
- 还是打包问题,又出现了新问题
- 问一个我一直不懂的问题?
- 系统托盘自动弹出的tip是怎么样做出来的??
- Delphi的DCOM中用IAppServer如何在VC中调用
- ****在线等待,关于编辑框显示的问题*****???????????????????
- 关于CStatic的问题!
- 在Classwizard中怎么没有WM_DRAWITEM消息,如何向里面添加呀?
- 菜鸟提问:怎样使菜单项在刚开始的时候是灰色不可用??急急急!!!!
- CSDN分配的用户密码如何改啊?
- 关于一个维护线程句柄表的问题
- 如何使winzard生成的标准的状态栏最左端的窗格也具有内凹的风格?
有个Portmon v3.02,试试吧
谢谢。。
这个我也有。我是不想把数据取走,但是还要能看到它。能告诉我该怎么改吗???
::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);
我觉得你可以把ReceiveChar(...)函数改一下,让它不接收数据就可以了。
bResult = ReadFile(port->m_hComm, &RXBuff, 1, &BytesRead,&port->m_ov);
你把这一段代码按照你的想法改一下,就可以了。
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 );这个函数就会把数据取走。我想把它读出来但是又不想将接收缓冲区的数据清掉。能帮我指点一下该怎么改啊。(我觉得单纯的改这个函数好像不行)
读是在读接收缓冲区,而写是在写发送缓冲区,不再同一个缓冲区的。
关于楼主的这个问题,我觉得很难实现,不知道哪位高人有办法!!
关注!!!!!!!!
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吧。
[email protected]
你可以下载一个,它串口调试器很好。*****************************************************
学习,再学习。
你可能没看明白我的意思。
这个我也有。不过还是谢谢你。。
注意到有个readdatewating函数吗,它可以满足你的需要
=fly by=
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;
}
这是我做项目过程中的一段代码,是监视串口的,要下班了,来不及整理,你自己看看吧!!!
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