c - 串口,WriteFile影响ReadFile

标签 c serial-port

串口代码有问题。

我只是这样做:

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

ClearCommError()(在 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 
        } 
}

最佳答案

是电缆。未正确屏蔽且太长。

关于c - 串口,WriteFile影响ReadFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16118096/

相关文章:

c++ - 如何使用 boost::asio 即时更改串行端口速度(或如何确定硬件缓冲区是否为空)?

c# - 处理 --> Arduino --> Unity 通过端口通信

c++ - 重新连接设备后 boost::asio::serial_port 读取

c++ - OpenCV 错误:断言失败 ((unsigned)i0 < (unsigned)size.p[0]) in cv::Mat::at

c - K&R 练习 1-9。 Putchar 和 getchar

c - 在命令行参数中查找字符串?

c - Linux 唤醒阻塞串口读取

c++ - 在 Windows 中使用 VMIN 和 VTIME

c - OpenCL本地工作本地内存

c - 为什么 execlp 不允许我使用管道?