2016-02-01 3 views
3

Я изучаю подключение к серийному устройству с Elixir. Единственная библиотека, которую я нашел, - this one. Я все еще пытаюсь обернуть голову вокруг Genservers, и прежде чем я начну писать программу/приложение, я хочу просто сделать несколько простых экспериментов в iex, но я не знаю, с чего начать.
Я начал новый проект микширования, добавил пакет elixir_serial в качестве зависимости и запустил iex с sudo iex -S mix. (Я нахожусь на ubuntu, и в настоящее время, если я не использую sudo, я получаю сообщение об ошибках чтения/записи при попытке подключения, но это отдельный вопрос afaik). я, кажется, чтобы иметь возможность подключить нормально:Подключение последовательного порта Elixir

iex(3)> {:ok, serial} = Serial.start_link 
{:ok, #PID<0.124.0>} 
iex(4)> Serial.open(serial, "/dev/ttyUSB0") 
:ok 
iex(5)> Serial.set_speed(serial, 9600) 
:ok 
iex(6)> Serial.connect(serial) 
:ok 
iex(7)> Serial.send_data(serial, <<0x01, 0x02, 0x03>>) 
:ok 

Но я не знаю, как получить данные обратно. Я попытался положить в коде предложил в elixir_serial README:

def handle_info({:elixir_serial, serial, data}, state) do 
# do something with the data 
end 

как в IEX (завернутые в defmodule MySerial сделать конечный блок) и в главном файле проекта микс, просто торчит в IO.puts(data) в функции ,

Мне явно не хватает чего-то здесь, требуется ли для последовательного соединения программа iex pid для отправки данных обратно? Я не понимаю, нужно ли мне настроить приложение GenServer для чтения данных, или если я могу использовать api elixir_serial api для чтения данных из последовательного порта.

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

+0

Вы пытаетесь написать тест, чтобы действовать, как если последовательное устройство отправляется обратно данные? –

+0

Я хотел бы отправить команду на устройство, а затем прочитать результат этой команды на устройстве. Я отправляю данные на коммутатор Cisco и поэтому должен по существу подражать человеческому взаимодействию в Cisco cli, поэтому я хочу получить представление о результатах различных команд. (в предыдущем опыте с pyserial были определенные gotchas, которые сделали это сложным) – bordeltabernacle

ответ

1

Вот документы в elixir_serial для Serial.start_link:

начинает последовательный порт. Процесс, вызывающий эту функцию, получит сообщений в форме {:elixir_serial, pid, data}.

Для обработки ответа вам не нужен GenServer. Просто добавьте получить блок в коде с таким родом формат:

receive do 
    {:elixir_serial, serial_pid, data} -> 
    IO.puts "Received data" 
    Serial.send_data(serial_pid, "ACK: Received Message") 
end 

По существу, библиотека получает вызов от своей С коллеги, а затем посылает сообщение процесса, который начал Serial ссылки.

посыла (ИДП, {: elixir_serial, самостоятельно(), данные})

См https://github.com/bitgamma/elixir_serial/blob/master/lib/serial.ex#L129

+0

Спасибо Кристиан. Я отвлекался на Genserver, я даже не думал просто использовать флеш. Добраться куда-то сейчас, очень ценим. – bordeltabernacle

Смежные вопросы