代码之家  ›  专栏  ›  技术社区  ›  Danny Holstein

为什么我在Windows COM端口上的串行读取限制为8192字节?

  •  1
  • Danny Holstein  · 技术社区  · 6 年前

    我正在尝试从Windows的COM端口读取20100字节。数据被截断为8192字节。给出了什么?当我使用teraterm时,没有截断。我的同步调用是:

    CreateFile(dev, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    

    和(非重叠只读代码段)

    DWORD dwEventMask, dwIncommingReadSize;
    int dwSize=0;
    char szBuf[10];
    if(!SetCommMask((void *) fd, EV_RXCHAR)) {THIS_RTN_ERROR}
    
    do  {
            if(ReadFile((void *) fd, szBuf, 1, &dwIncommingReadSize, NULL) != 0) {
                if(dwIncommingReadSize > 0) {
                    for (k=0; k<dwIncommingReadSize; k++) {
                      *(line_buf+dwSize+k) = szBuf[k];
                    }
                    dwSize += dwIncommingReadSize;
                }
            }
            else {THIS_RTN_ERROR;}
        } while(dwIncommingReadSize > 0);
    k = dwSize;
    return(k);
    

    这发生在写文件之后。我迭代地调用这个代码,直到得到所有的数据——只得到8192字节。

    2 回复  |  直到 6 年前
        1
  •  1
  •   kunif    6 年前

    您是否在SETUPCOMM函数中明确指定8192作为dwinqueue参数,或者设备驱动程序的默认值是8192?

    如何指定SETUPCOMM所需的缓冲区大小?

    SetupComm function

    初始化指定通信设备的通信参数。
    语法C++

    BOOL SetupComm(  
      HANDLE hFile,  
      DWORD  dwInQueue,  
      DWORD  dwOutQueue  
    );
    

    参数
    H锉
    通信设备的手柄。createfile函数返回这个句柄。

    DWin队列
    设备内部输入缓冲区的建议大小(字节)。

    DWOW队列
    设备内部输出缓冲区的建议大小(字节)。

    对于.NET serialport,默认值为4096,最多可以指定2147483647。 SerialPort.ReadBufferSize Property

    获取或设置serialport输入缓冲区的大小。
    C.*

    [System.ComponentModel.Browsable(true)]  
    public int ReadBufferSize { get; set; }  
    

    财产价值
    英特32
    缓冲区大小(字节)。默认值为4096;最大值为正整数或2147483647。

        2
  •  0
  •   Joseph Quinsey Taseen    6 年前

    这与其说是回答,不如说是评论。根据接受的答案,增加缓冲区的大小将解决99.9%的问题。

    但是串行接口(比如套接字)只是一个字节流。因此,人们总是要处理两个对立的问题:

    • 部分消息
    • 多条消息

    更糟糕的是,您可以得到一个完整的消息,然后是一个被截断的消息。

    在UNIX和Windows中,处理此问题的标准方法是使用 select . 例如,请参见, https://beej.us/guide/bgnet/ .

    生成的代码不长,但您需要知道您想要它做什么。


    编辑 在窗户上, 选择 仅适用于插座。也许吧 Batch-File: Receive Data from the Serial-Port and write it into txt-File 会有帮助吗?