串口,WriteFile会影响ReadFile

时间:2013-04-20 07:59:33

标签: c serial-port

我遇到串口代码问题。

我只是这样做:

opencomm(); 
send(); 
closecomm(); 

并且ClearCommError() (inside recv())会返回 comstat.cbInQue发送的金额相同。

所以,如果sizeof (sendbuff)为100, 我在comstat.cbInQue获得100分。

ReadFile读取一个字节后,comstat.cbInQue递减(当然在后续ClearCommError()之后)。

读取的值不是写入的值。 没有设备连接到端口。

最奇怪的是这段代码曾经工作,但现在已经不行了。

WORD sendbuff[128];
static HANDLE hComm; 

static void opencomm (void) 
{ 
    static COMMTIMEOUTS timeouts = {0,0,0,0,0}; 

    static DCB dcb = { 
        sizeof (DCB),   //   DCBlength 
        115200, // * BaudRate 
        1,      //   fBinary 
        0,      // * fParity 
        0,      //   fOutxCtsFlow 
        0,      //   fOutxDsrFlow 
        0,      //   fDtrControl 
        0,      //   fDsrSensitivity 
        1,      //   fTXContinueOnXoff 
        0,      //   fOutX 
        0,      //   fInX 
        0,      //   fErrorChar 
        0,      //   fNull 
        0,      //   fRtsControl 
        0,      //   fAbortOnError 
        0,      //   fDummy2 
        0,      //   wReserved 
        8*k,    //   XonLim 
        2*k,    //   XoffLim 
        8,      // * ByteSize 
        0,      // * Parity 
        0,      // * StopBits 
        0,      //   XonChar 
        1,      //   XoffChar 
        0,      //   ErrorChar 
        0,      //   EofChar 
        0,      //   EvtChar 
        0       //   wReserved1 
    }; 

        hComm = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); 
        if (hComm != INVALID_HANDLE_VALUE) { 
            SetupComm(hComm, 16*k, 16*k); 
            SetCommState(hComm, &dcb); 
            SetCommTimeouts(hComm, &timeouts); 
        } 
} 

static void closecomm (void) 
{ 
        CloseHandle(hComm); 
} 

static BYTE recv (void) 
{ 
    BYTE text; 
    DWORD temp; 

    COMSTAT comstat; 

        while (1) { 
            ClearCommError(hComm, &temp, &comstat); 
            if (comstat.cbInQue != 0) break; 

            Sleep(1); 
        } 

        ReadFile(hComm, &text, 1, &temp, NULL); 

        return text; 
} 

static void send (void) 
{ 
    DWORD temp; 

        // send to other comp 
        WriteFile(hComm, sendbuff, sizeof (sendbuff), &temp, NULL); 

        // check other comp done 
        if (recv() != 0xAA) { 
            Beep(1000, 100); 
            quit(); // comm error 
        } 
}

1 个答案:

答案 0 :(得分:1)

是电缆。没有适当的屏蔽和太长时间。