首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ReadFile + Eof

ReadFile + Eof
EN

Stack Overflow用户
提问于 2014-04-15 11:36:20
回答 1查看 2.2K关注 0票数 0

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

DCB结构有一个名为EofChar的字段,但是函数继续读取,直到它填充了缓冲区。如果我只发送3个字节和一个13,它将继续等待其他两个字节。是否可以使ReadFile读取的字节比nNumberOfBytesToRead提供的和指定的字节少?

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

代码:

代码语言:javascript
复制
// 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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-15 16:01:26

不,这不太可能起作用。Windows本身不会对您指定的DCB.EofChar执行任何操作。或者说,DCB中的任何其他特殊字符。它直接将它传递给设备驱动程序,底层的ioctl是炭化。完全由驱动程序来实现。

大多数编写串口驱动程序(USB仿真器)的硬件供应商都使用WDK中包含的示例驱动程序代码。这对SERIAL_CHARS.EofChar没有任何作用。因此,不可避免的结果是,没有人实施它。我个人从来没有遇到过,反正是故意的。

因此,它预计不会有任何影响。

您通常可以期望DCB.EvtChar工作,它为WaitCommEvent()的EV_RXFLAG选项提供了动力。换句话说,如果您将其设置为行结束符,那么它可以给您一个信号,表示ReadFile()将至少返回一条完整的行。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23082515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档