调用winapi32函数读取串口疑问?

peiyan_lin 2004-03-16 12:05:16
创建了一个工作线程用于监视串口

hCommWatchThread= CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全属性
         0,//初始化线程栈的大小,缺省为与主线程大小相同
         (LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局函数
         GetSafeHwnd(), //此处传入了主框架的句柄
         0, &dwThreadID );
  ASSERT(hCommWatchThread!=NULL);
//线程的全局函数
UINT CommWatchProc(HWND hSendWnd){
  DWORD dwEvtMask=0 ;
  SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?
  WaitCommEvent( hCom, &dwEvtMask, os );// 等待串口通信事件的发生 ,检测返回的dwEvtMask,知道发生了什么串口事件:
  if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)// 缓冲区中有数据到达
{
  COMSTAT ComStat ;
DWORD dwLength;
  ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;
  dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据?
  if (dwLength > 0)
{
BOOL fReadStat ;  
   fReadStat = ReadFile( hCom, lpBuffer,dwLength&dwBytesRead,&READ_OS( npTTYInfo ) );
if (!fReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,&READ_OS( npTTYInfo ), & dwBytesRead, TRUE ))
{
       dwError = GetLastError();
    if(dwError == ERROR_IO_INCOMPLETE) continue;//缓冲区数据没有读完,继续
       …… ……      
::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主线程,串口收到数据
}


我的问题是:一旦缓冲区中有数据到达,我调用readfile函数读取指定数量数据,在本例子中readfile立即返回,此时调用GetLastError函数获取是否为ERROR_IO_PENDING
状态,再调用GetOverlappedResult函数(最后一个参数为true)判断如果没有读完,就继续读,但是我如何得到已经读到的数据呢?还有,串口不是传输慢,线程运行快吗?程序运行的时候,缓冲区中有数据到达标志,立刻就进行了读取,这个时候,串口的数据还没有完全到达呢,问题不是出现了吗?再说了,我还想得到我指定数目的数据不就不完整了吗?

请指教!!
...全文
63 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LGD589 2004-03-16
  • 打赏
  • 举报
回复
http://www.gotdotnet.com/搜索SerialStream类,一个很好用的C#下的串口通讯类,可以直接用。
peiyan_lin 2004-03-16
  • 打赏
  • 举报
回复
up
peiyan_lin 2004-03-16
  • 打赏
  • 举报
回复
up

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧