Вопрос или проблема
Настройка 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 и применения эффективного управления потоками. Рекомендуем вам последовательно проверять каждую из предложенных рекомендаций, что позволит вам выявить и устранить причины потери данных в режиме реального времени.