Запись данных в виртуальный последовательный порт: Не работает при переходе от хоста к гостю

Вопрос или проблема

Настройка VM
Мой хост-компьютер использует MacOS. Моя гостьевая VM использует Ubuntu Server 20.04. Я использую VirtualBox в качестве инструмента для VM.

Я использовал следующую команду socat для создания двух виртуальных последовательных портов:

socat -d -d -T -1  pty,raw,link=/tmp/ttyV0 pty,raw,link=/tmp/ttyV1

Это настройки последовательного порта моей VM

Настройки последовательного порта VirtualBox Guest OS

Вот в чем проблема
У меня есть два скрипта на Python,

  • Скрипт1: записывает целое число в последовательный порт каждую секунду, которое увеличивается
  • Скрипт2: постоянно читает из последовательного порта

Когда Скрипт1 работает на гостевой машине, а Скрипт2 работает на хост-машине, я вижу в выводе терминала увеличивающиеся целые числа, которые отправляются. Сначала он напечатает все в буфере, пока не догонит, а затем будет выводить целые числа в реальном времени по мере их отправки Скриптом1.

Когда Скрипт1 работает на хост-машине, а Скрипт2 работает на гостевой машине, я вижу только то, что Скрипт1 написал в последовательный порт до момента запуска Скрипта2. Как только он прочитает все из буфера, он больше не продолжает выводить целые числа в консоль в реальном времени, пока они отправляются Скриптом1. Если я завершаю Скрипт2 и запускаю его снова, он тогда печатает то, что было отправлено в этот интервал, и останавливается. Он не печатает в реальном времени.

Я также запускал Скрипт1 и Скрипт2 на самой хост-машине, и все работает гладко. Это заставляет меня думать, что это проблема с VirtualBox или с тем, как работает последовательный порт.

Есть идеи, почему он не может читать в реальном времени с гостевой машины?

Ответ или решение

Проблема с Чтением Данных через Виртуальный Серийный Порт: Обзор и Решение

1. Вводные Данные

Ваша ситуация с настройкой виртуальной машины в VirtualBox, где хост-система работает на MacOS, а гость — на Ubuntu Server 20.04, представляет собой интересный случай для изучения работы с виртуальными серийными портами. Используя команду socat для создания пары виртуальных портов, вы столкнулись с проблемой: когда скрипт, выполняющий запись на хосте, не позволяет другому скрипту, запущенному на гостевой машине, получать данные в режиме реального времени. Это может быть связано с несколькими аспектами, такими как параметры конфигурации VirtualBox, поведение socat или поведение операционной системы.

2. Анализ Проблемы

Согласно вашему описанию, при выполнении скрипта на хосте и чтении на гостевой машине данные не отправляются в режиме реального времени, что указывает на потенциальные проблемы с синхронизацией. Рассмотрим несколько возможных причин данной проблемы:

  • Настройки VirtualBox: Важно убедиться, что параметры виртуальных портов в VirtualBox правильно настроены для обеспечения двусторонней связи. Проверьте параметры порта на предмет активации режима «Только для ввода» или «Только для вывода». Убедитесь, что порты подключены правильно и выбран правильный интерфейс.

  • Поведение socat: При использовании socat для создания виртуальных серийных портов следует понимать, как он обрабатывает буферы. Socat может задерживать данные, что затрудняет их немедленное чтение на стороне приемника.

  • Черезход indeed управление потоками: Важно помнить, что Python и операционные системы обрабатывают потоки данных асинхронно, что может стать причиной потери данных или неправильно синхронизированного потока при передаче через виртуальный порт.

3. Рекомендации по Решению Проблемы

  • Проверьте настройки виртуального порта в VirtualBox. Убедитесь, что вы используете правильные параметры и выбраны порты, соответствующие вашим ожиданиям. Проверьте, что для порта задана опция "Host Pipe" или "Raw File" в зависимости от ваших нужд, а также правильные права доступа на эти ресурсы.

  • Оптимизируйте скрипты: Возможно, стоит внести изменения в структуру ваших Python-скриптов. Используйте библиотеку pySerial, которая более эффективно обрабатывает потоки данных. Убедитесь, что вы используете метод setTimeout или подобный, чтобы обеспечить постоянное чтение из потока данных без задержек.

  • Логгирование и отладка: Добавьте логирование в оба скрипта, чтобы понять, когда данные теряются. Это поможет в выявлении проблем на уровне передачи и приема данных.

  • Увеличьте буфер: Попробуйте увеличить размер буфера при использовании socat, чтобы избежать переполнения при массовой записи.

4. Заключение

Ваша проблема с передачей данных между хостом и гостем через виртуальные серийные порты в VirtualBox может быть решена путем внимательного анализа конфигурации виртуальных портов, настройки скриптов на Python и применения эффективного управления потоками. Рекомендуем вам последовательно проверять каждую из предложенных рекомендаций, что позволит вам выявить и устранить причины потери данных в режиме реального времени.

Оцените материал
Добавить комментарий

Капча загружается...