ReadFile + Eof Char

ReadFile + Eof Char

本文关键字:Char Eof ReadFile      更新时间:2023-10-16

我正在使用串行com端口通信与WinApi同步。我想用13(CR)拆分消息。如何使用ReadFile函数,使其在读取13时返回?


DCB结构有一个名为EofChar的字段,但函数会继续读取,直到它填满缓冲区。如果我只发送3个带有13的字节,它将继续等待另外2个字节。是否真的可以使ReadFile读取的字节数少于nNumberOfBytesToRead提供和指定的缓冲区的字节数?

  • 传入dec字节:12 12 13 15 18 19 ...
  • 所需dec字节:12 12 13(但长度未知)


代码:

// 2. reading:
DWORD bytesRead;
char* buffer = new char[5];
ReadFile(handle, buffer, 5, &bytesRead, NULL);
// bytesRead should be 3 in the example above
// 1. connecting:
HANDLE handle = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
DCB dcb;
COMSTAT stat;
if (GetCommState(handle, &dcb))
{
    dcb.BaudRate          = 57600;      // baud rate
    dcb.ByteSize          = 7;          // number of bits/byte, 4-8 
    dcb.Parity            = EVENPARITY; // 0-4=no,odd,even,mark,space 
    dcb.StopBits          = ONESTOPBIT; // 0,1,2 = 1, 1.5, 2  V2.12 0 -> ONESTOPBIT
    dcb.fBinary           = TRUE;       // binary mode, no EOF check 
    dcb.fParity           = TRUE;       // enable parity checking 
    dcb.fOutxCtsFlow      = FALSE;      // CTS output flow control 
    dcb.fOutxDsrFlow      = FALSE;      // DSR output flow control 
    dcb.fDtrControl       = 0;          //DTR_CONTROL_DISABLE; // DTR flow control type
    dcb.fRtsControl       = 0;          //RTS_CONTROL_DISABLE; // RTS flow control 
    dcb.fDsrSensitivity   = FALSE;      // DSR sensitivity 
    dcb.fTXContinueOnXoff = FALSE;      // XOFF continues Tx 
    dcb.fOutX             = FALSE;      // XON/XOFF out flow control 
    dcb.fInX              = FALSE;      // XON/XOFF in flow control 
    dcb.fErrorChar        = FALSE;      // enable error replacement V2.12 TRUE -> FALSE
    dcb.fAbortOnError     = TRUE;       // abort reads/writes on error 
    dcb.XonChar           = 0x00;       // Tx and Rx XON character 0x01
    dcb.XoffChar          = 0x00;       // Tx and Rx XOFF character 0x02
    dcb.ErrorChar         = 0x1f;       // error replacement character  
    dcb.EofChar           = 0x0d;       // end of input character 0x00
    dcb.EvtChar           = 0x00;       // received event character 0x0d
    if (SetCommState(handle, &dcb))
    {
        EscapeCommFunction(handle, SETRTS);
        EscapeCommFunction(handle, SETDTR);
        EscapeCommFunction(handle, CLRRTS);
        EscapeCommFunction(handle, CLRDTR);
        PurgeComm(handle, PURGE_TXCLEAR | PURGE_RXCLEAR);
        return true;
    }
}

不,这不太可能奏效。Windows本身对DCB没有任何作用。指定的EofChar。或者DCB中的任何其他特殊字符。它直接将其传递给设备驱动程序,底层ioctl是ioctl_SERIAL_SET_CHARS。完全由驾驶员来执行。

大多数编写串行端口驱动程序的硬件供应商(现在大多数是USB模拟器)都使用WDK中包含的示例驱动程序代码。它对SERIAL_CHARS没有任何作用。EofChar。所以不可避免的结果是没有人执行它。我个人从来没有遇到过,不管怎样,在知情的情况下。

因此,预计不会产生任何影响。

你通常可以期待DCB。EvtChar工作,它为WaitCommEvent()的EV_RXFLAG选项供电。换句话说,如果您将其设置为行终止符,则它可以向您发出信号,表明ReadFile()将至少返回一整行。

但你明确表示你不想这样做。每个人都通过简单地缓冲ReadFile()返回的额外数据来解决这个问题。或者一次读取一个字节,这是可以的,因为串行端口无论如何都很慢。