Почему мое последовательное чтение на COM-порте Windows ограничено 8192 байтами? - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь прочитать 20100 байт из моего COM-порта в Windows. Данные усекаются до 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 байта.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Это больше комментарий, чем ответ.Согласно принятому ответу, увеличение размера буфера исправит вашу проблему в 99,9% случаев.

Но последовательный интерфейс (например, сокет) - это просто поток байтов.Таким образом, всегда нужно иметь дело с двумя противоположными проблемами:

  • частичные сообщения
  • несколько сообщений

Хуже, вы можете получить полное сообщение, а затемусеченное сообщение.

Стандартный способ справиться с этим, как в Unix, так и в Windows, заключается в использовании select.См., Например, https://beej.us/guide/bgnet/.

Полученный код не длинный, но вам необходимо знать, что вы хотите от него сделать.


Редактировать :В Windows select работает только с сокетами.Может быть Batch-File: получить данные из последовательного порта и записать их в txt-файл поможет?

0 голосов
/ 23 января 2019

Вы явно указали 8192 в качестве параметра dwInQueue в функции SetupComm, или значение по умолчанию для драйвера устройства 8192?

Как насчет указания размера буфера, требуемого для SetupComm?

Функция SetupComm

Инициализирует параметры связи для указанного устройства связи.
Синтаксис C ++

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

Параметры
hFile
Дескриптор устройства связи.Функция CreateFile возвращает этот дескриптор.

dwInQueue
Рекомендуемый размер внутреннего входного буфера устройства, в байтах.

dwOutQueue
Рекомендуемый размер внутреннего выходного буфера устройства,в байтах.

Для .NET SerialPort значением по умолчанию является 4096, можно указать до 2147483647. Свойство SerialPort.ReadBufferSize

Получает или задает размер входного буфера SerialPort.
C #

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

СвойствоЗначение
Int32
Размер буфера в байтах.Значение по умолчанию 4096;максимальное значение равно положительному целому числу или 2147483647.

...