从串行端口读取数据时出现I / O挂起错误

时间:2014-07-06 18:10:30

标签: c io serial-port

我有一个C程序试图从Windows中的COM端口读取数据。 我能够在com端口上写入数据,但无法读取它。 这是我的阅读功能?如果有人可以看一看并指出我正确的方向。 我在main方法

中启动一个单独的线程

------主要方法功能代码------

if(!SetCommMask(hSerial,eventFlags)){
    printf("Error in setting the event maskwith error: %d \n",GetLastError());}
_beginthread(*readDataFromPort,0,NULL);

-----读取数据函数代码------

void readDataFromPort(void*)
{
    DWORD dwReadResult;
    bool waitOnRead = FALSE;
    bool abContinue = TRUE;

    memset(&ovRead,0,sizeof(ovRead));
    ovRead.hEvent = CreateEvent(0,TRUE,0,0);
    if(ovRead.hEvent == NULL){
        fprintf(stderr,"Error creating overlapped event for reading");
    }
    //Reading data from port
    while (true){
            //Changed the overlap to NULL
            if(WaitCommEvent(hSerial,&eventFlags,NULL)){
                if(GetCommMask(hSerial,&dwMask)){
                    ResetEvent(ovRead.hEvent);              
                if(dwMask == EV_RXCHAR){
                    printf("character arrived");
                }
            }
            memset(tmp,0,sizeof(tmp));

            if(!ReadFile(hSerial, tmp, sizeof(tmp), NULL, &ovRead)){
                if(GetLastError()!=ERROR_IO_PENDING){
                    printf("error io pending: Error is %d\n",GetLastError());
                    break;
                }else{
                    waitOnRead=TRUE;    
                }
            }
            if(waitOnRead){
                dwReadResult = WaitForSingleObject(ovRead.hEvent,10000);
                switch(dwReadResult){
                case WAIT_OBJECT_0:
                    if(!GetOverlappedResult(hSerial,&ovRead,&dwBytesRead,TRUE)){
                        printf("Damn error again :-(");
                    }else{  
                        if(dwBytesRead>0){
                            ++Rx;
                            printf("Tx - %d: Rx - %d\n",Tx,Rx);
                            printf("%s",tmp);
                        }                                               
                    }
                }                           
            }
            waitOnRead=FALSE;
        }   
        if(strlen(tmp)>0 && inLoop){
            writeDataToPort(*tmp);
        }
    }
    CloseHandle(ovRead.hEvent); 
    _endthread();
}

> Blockquote

1 个答案:

答案 0 :(得分:0)

_beginthread(* readDataFromPort,0,NULL);

无论SetComMask结果如何,此片段都会启动该线程,但如果您正在阅读,则必须有效。 查看MSDN线程端口读/写哪个有效(VC5编译直接开箱即用)上面代码看起来非常相似,但它是否相同?。