2

我的串口代码有问题。

我只是做:

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

以及与发送金额相同的ClearCommError() (inside recv())退货 。comstat.cbInQue

所以,如果sizeof (sendbuff)是 100,我得到 100 comstat.cbInQue

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 
        } 
}
4

1 回答 1

1

那是电缆。没有正确屏蔽和太长。

于 2013-04-20T09:05:13.510 回答