我用的API写的串口读写,在读串口的时候用线程实时读取,
然后用虚拟串口工具设置两个串口COM1 COM2,用程序打开COM1,用串口调试工具打开COM2,2者进行串口通信,
发现在程序读数据的时候,每次都要先写一次,这是为什么????

解决方案 »

  1.   


    HWND hwnd = (HWND)pParam;
    while(true)
    {
    OVERLAPPED os;
    memset(&os,0,sizeof(OVERLAPPED));
    os.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
    DWORD dwMask,dwTrans,dwError=0;
    if(!WaitCommEvent(m_hComm,&dwMask,&os))
    {
    if(ERROR_IO_PENDING==GetLastError())
    GetOverlappedResult(m_hComm,&os,&dwTrans,true);
    }
    WaitForSingleObject(os.hEvent,INFINITE);
    if (dwMask==EV_RXCHAR)
    {
    ::SendMessage(hwnd,WM_COMM_RXCHAR,0,0);
    }

    }这是我的读线程
      

  2.   

    hello 
    详细在这里:
    http://topic.csdn.net/u/20120604/15/4ae6674d-2ec8-4213-8a99-39fc227a4c51.html#r_achor
      

  3.   


    //打开串口
    void OpenComm()
    {
    if(bIfopen)
    AfxMessageBox("串口已经打开!");
    else
    {
    hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);          //创建串口,异步方式
    if (hCom == INVALID_HANDLE_VALUE)
    AfxMessageBox("打开串口失败!");
    else
    {
    bIfopen = TRUE;
    SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY ); //设置串口事件
    SetupComm( hCom, 4096,4096);                            //设置读写缓冲区大小
    PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR );

    COMMTIMEOUTS comTimeOut;                        //设置超时
    comTimeOut.ReadIntervalTimeout = 100; //两字符之间最大的延时
    comTimeOut.ReadTotalTimeoutMultiplier = 50; //读取每字符间的超时
    comTimeOut.ReadTotalTimeoutConstant = 1000; //一次读取串口数据的固定超时
    comTimeOut.WriteTotalTimeoutMultiplier = 50; //写入每字符间的超时
    comTimeOut.WriteTotalTimeoutConstant = 1000; //一次写入串口数据的固定超时
    SetCommTimeouts(hCom,&comTimeOut);

    DCB dcb;
    GetCommState(hCom, &dcb );                               //串口设置
    dcb.BaudRate = 9600;
    dcb.ByteSize = 8; 
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.fBinary = TRUE;
    dcb.fParity = FALSE;
    SetCommState( hCom, &dcb );
    }
    }
    }
      

  4.   


    //读取数据
    int ReadComm(int inum, BYTE* bdata )
    {
    DWORD dwRes;
    DWORD dwDataRead; Read_OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    if ( NULL == Read_OS.hEvent) 
    return -1; if (ReadFile(hCom, bdata, inum, NULL, &Read_OS)) 
    return 0; //成功读出
    else
    {
    dwRes = WaitForSingleObject(Read_OS.hEvent, 5000); //设置5秒超时
    switch(dwRes)
    {
    case WAIT_OBJECT_0:
    if (!GetOverlappedResult(hCom, &Read_OS, &dwDataRead, TRUE)) 
    {
    //操作失败,可用GetLastError()获取失败信息
    return 1;
    }
    else
    {
    //成功
    return 0;
    }
    break;
    case WAIT_TIMEOUT:
    //超时
    return 2;
    break;
    default:
    return 3;
    break;
    }
    } CloseHandle(Read_OS.hEvent);
    return 0;
    }
      

  5.   


    //以事件驱动的读线程
    DWORD TheardEvent(LPVOID pParam)
    {
    BOOL bCommState = TRUE;
    DWORD deEvtMask, dwRes, dwLength;
    DWORD dwErrors;
    COMSTAT ComStat;
    int i;
    CString str;
    BOOL bifwan = FALSE;
    BYTE bmydata[25]; OS.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
    while (bCommState) 
    {
    WaitCommEvent(hCom, &deEvtMask, &OS);
    dwRes = WaitForSingleObject(OS.hEvent, INFINITE);
    if(WAIT_OBJECT_0 == dwRes)
    {
    if(EV_RXCHAR == deEvtMask)
    {
    ClearCommError(hCom, &dwErrors, &ComStat);
    dwLength = ComStat.cbInQue; if (dwLength > 0)
    {
    ReadComm(dwLength, bmydata);
    } memcpy(&Buffer[igbal], bmydata, dwLength);
    igbal += dwLength; for (i=0; i<(int)dwLength; i++) 
    {
    if(0x16 == bmydata[i])
    bifwan = TRUE;
    } if(bifwan)
    {
    ::PostMessage(HWND(mainhandle), WM_DEBUG, 0, 0);
    bifwan = FALSE;
    } }
    }
    }
    return 0;
    }
      

  6.   

    呵呵,好吧,同情一下lz,为什么你当时不用两个串口工具互相通讯试试呢?赞一下,lz的串口编程调试方法很好--用虚拟串口和串口调试软件。