Ruby SerialPort не инициализируется - PullRequest
2 голосов
/ 15 февраля 2012

Я работаю с гемом Ruby 1.8.7 SerialPort для связи с AVR через конвертер FTDI232 USB-to-Serial.Кажется, у меня проблема с SerialPort, инициализирующим новый SerialPort.

Я обнаружил, что когда я открываю соединение с PuTTY в Windows или Minicom в Linux и отправляю команды таким образом, все работает так, как оно есть.должен.

Я также заметил, что после закрытия PuTTY / Minicom мой код работает нормально.Поэтому я уверен, что что-то не работает с тем, как гем SerialPort инициализирует последовательное соединение.

Кто-нибудь еще сталкивался с этой проблемой или есть идеи, как ее исправить?

РЕДАКТИРОВАТЬ: Вот пример кода.require 'rubygems' require 'serialport'

sp = SerialPort.new("COM5", 115200)
sp.print("A\r")
data = sp.readline("\r\n")
puts data
sp.close

Этот код должен открывать соединение и отправлять символ, указывающий тип данных, требуемых от моего AVR.Затем он ожидает передачи данных обратно и выводит их на экран.

Когда мое устройство подключено изначально, код просто зависает при чтении, но после остановки сценария открывает соединение с PuTTY, закрываетПри подключении PuTTY скрипт делает именно то, что должен.

Ответы [ 3 ]

0 голосов
/ 16 февраля 2012

Я почти уверен, что решил свою проблему.Добавление read_timeout, похоже, исправило это.

sp = SerialPort.new("COM5", 115200)
sp.read_timeout = 1500

Использование PuTTY / Minicom должно иметь некоторые настройки и оставить его после закрытия.

0 голосов
/ 16 февраля 2012

У меня возникла такая же проблема в Linux debian 3.1.0-1-amd64.

Эта проблема была связана с ошибкой, введенной в модуле ядра ftdi_sio (для поиска исправления проблемы с коррупцией в драйвере USB ftdi ftdi_sio.c от Google).

Я применил патч (см. https://lkml.org/lkml/2012/2/1/574), перестройка модуля ftdi_sio.ko и проблема теперь решена.

  1. Получить исходный код ядра linux-3.1.10.tar.bz2 (мое реальное ядро ​​- 3.1.0-1-amd64).

  2. Применить патч

  3. Модуль перекомпиляции (примеркак это сделать в http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html)

  4. Сделайте резервную копию исходного модуля в /lib/modules/3.1.0-1-amd64/kernel/drivers/usb/serial/ftdi_sio.ko и замените его новымone.

  5. Перезагрузка

Быстрый и грязный обходной путь может также вызвать изменение скорости передачи данных (нетребуется перекомпилировать модуль ядра):

sp = SerialPort.new("/dev/ttyUSB0")
sp.baud=300 #value which is not often used
sp.baud=9600

...

sp.

0 голосов
/ 15 февраля 2012

В Windows только один процесс может одновременно подключаться к последовательному порту.Я не уверен насчет Linux.

Убедитесь, что вы правильно устанавливаете скорость передачи в своем коде.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...