Вопрос по python – Pyserial буфер заполняется быстрее, чем я могу прочитать

5

Я читаю данные из микроконтроллера через последовательный порт со скоростью 921600. Я читаю большой объем данных CSV ASCII, и, поскольку он поступает так быстро, буфер заполняется, а все остальные данные получают потерял, прежде чем я могу прочитать это. Я знаю, что мог вручную отредактировать исходный код pyserial для serialwin32, чтобы увеличить размер буфера, но мне было интересно, есть ли другой способ обойти это?

Я могу только оценить объем данных, которые я получу, но это где-то около 200 КБ данных.

Нет, к сожалению, я не контролирую скорость передачи данных. Все, что я могу сделать, это отправить байт передачи и получить данные. Nate
Можете ли вы замедлить скорость передачи? Jay Atkinson

Ваш Ответ

3   ответа
4

который доступен со страницы свойств com-порта в диспетчере устройств. Его можно найти, нажав кнопку «Дополнительно» в разделе «Настройки порта». Вкладка.

advanced settings for com port

More info:

http://support.microsoft.com/kb/131016 под заголовкомReceive Buffer

http://tldp.org/HOWTO/Serial-HOWTO-4.html под заголовкомInterrupts

Попробуйте сбить его на ступеньку или две.

Я тоже попробую. Однако это звучит так, как будто это только поможет с аппаратным буфером, так что, хотя я, вероятно, тоже перегружаю этот буфер, я знаю, что переполняю буфер pySerial, который является первой проблемой, которую я должен решить. Nate
Причина, по которой ваши настройки не похожи на изображение, предоставленное @jon, заключается в том, что эта страница Microsoft относится кwindows 95
На моем Windows 7 настройка выглядит так: Диспетчер устройств | Порты | COMn | Свойства | Настройки порта | Расширенный | Прием (байт). Это раскрывающийся список, и я уже на максимуме 4096. Кажется, мой буфер ограничен примерно 2К.
5

потоке, который работаетprior отправить команду в uC для отправки данных?

Это уберет часть задержки после команды записи и начала чтения. Естьдругие пользователи SO которые имели успех с этим методом, при условии, что они не имели переполнения буфера.

Если это не ясно, дайте мне знать, и я могу что-то скомпоновать, чтобы показать это.

EDIT

Подумайте об этом немного больше, если вы пытаетесь прочитать из буфера и записать его в файловую систему, даже автономный поток может вас не спасти. Чтобы минимизировать время обработки, вы можете рассмотреть чтение, скажем, 100 байтов за разserial.Read(size=100) и помещать эти данные в очередь для обработки всего после завершения передачи

Pseudo Code Example

def thread_main_loop(myserialobj, data_queue):
    data_queue.put_no_wait(myserialobj.Read(size=100))

def process_queue_when_done(data_queue):
    while(1):
        if len(data_queue) > 0:
            poped_data = data_queue.get_no_wait()
            # Process the data as needed
        else:
            break;
@Nate Это довольно быстро .... Проверьте мои изменения для дополнительных способов ускорить его.
Я попробую, хотя после небольшой математики я все еще не знаю, поможет ли это. в настоящее время буфер будет переполнен через 0,03 секунды. И в довершение всего, я вполне уверен, что в конце потокового уведомления тоже нет. Радости доморощенного оборудования. Nate
0

Если вы запускаете свой код на платформе Windows, вам просто нужно добавить строку в ваш код

ser.set_buffer_size(rx_size = 12800, tx_size = 12800)

Где 12800 - произвольное число, которое я выбрал. Вы можете сделать приемный (rx) и передающий (tx) буфер размером до 2147483647a.

Смотрите также:

https://docs.python.org/3/library/ctypes.html

https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readbuffersize(v=vs.110).aspx

Возможно, вы сможете настроить последовательный порт из DLL             // Настройка серийного номера

 mySerialPort.BaudRate = 9600;
 mySerialPort.PortName = comPort;
 mySerialPort.Parity = Parity.None;
 mySerialPort.StopBits = StopBits.One;
 mySerialPort.DataBits = 8;
 mySerialPort.Handshake = Handshake.None;
 mySerialPort.RtsEnable = true;
 mySerialPort.ReadBufferSize = 32768;

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

А затем откройте и используйте его в Python

Похожие вопросы