Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我在Windows COM端口上的串行读取限制为8192字节?_C_Windows_Serial Port_Usb - Fatal编程技术网

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

为什么我在Windows COM端口上的串行读取限制为8192字节?,c,windows,serial-port,usb,C,Windows,Serial Port,Usb,我正在尝试从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((

我正在尝试从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);

这在WriteFile之后立即发生。我反复调用这段代码,直到我得到所有数据——除了我只得到8192个字节。

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

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

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

参数 hFile 通信设备的手柄。CreateFile函数返回此句柄

排队 设备内部输入缓冲区的建议大小,以字节为单位

出列 设备内部输出缓冲区的建议大小,以字节为单位

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

获取或设置SerialPort输入缓冲区的大小。 C

财产价值 Int32 缓冲区大小,以字节为单位。默认值为4096;最大值为正整数,即2147483647


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

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

部分消息 多条消息 更糟糕的是,您可能会得到一条完整的消息,后面跟着一条被截断的消息

在Unix和Windows中处理此问题的标准方法是使用select。例如,请参见

生成的代码并不长,但您需要知道希望它做什么


编辑:在Windows上,选择“仅适用于套接字”。也许会有帮助?

数组的定义是什么:line_buf[]是试图读取刚写入COM端口的数组的代码吗?什么样的硬件能够真正响应数据?您的代码是否检查写入操作的结果以确保所有数据都已写入?丢失的数据是从写数据的开始还是结束?为什么是void*fd中的cast,它让我觉得代码正在做一些还没有发布的事情,而它不应该这样做。推荐一个。简单一点,我使用fd作为套接字或指针,它是一个长整数,需要强制转换,实际上只是一个警告,没有警告。那我就没什么问题了。至于数据和数组的性质,我给出命令FORM4;输出数据?;USB-to-GPIB适配器,适配器响应20100个ASCII字符的格式化S参数数据,实/虚对用逗号和CR分隔。仅呈现前8192个字节。如果可以,我会给你100张赞成票!我以前找不到任何关于缓冲区大小的信息,现在它有意义了-doh!顺便说一句:我在C/C++中工作,所以答案的第一部分已经足够了,但我可以看到这是所有编程环境的一个问题。我没有指定缓冲区大小,8192是默认值。确切地说,我知道经常选择和使用它。我将其用于Windows/Linux TCP套接字和Linux串行通信。在Windows串行通信中没有它,这就是为什么我必须首先重写代码的原因。
BOOL SetupComm(  
  HANDLE hFile,  
  DWORD  dwInQueue,  
  DWORD  dwOutQueue  
);
[System.ComponentModel.Browsable(true)]  
public int ReadBufferSize { get; set; }