Elixir串口连接

时间:2016-02-01 16:44:42

标签: serial-port elixir

我正在探索使用Elixir连接到串行设备。我发现的唯一图书馆是this one。我仍然试图绕着Genservers,在开始编写程序/应用程序之前,我想在iex中做一些简单的实验,但我不知道如何开始。
我已经开始了一个新的混合项目,将elixir_serial包作为依赖项添加,并使用sudo iex -S mix启动iex。 (我在ubuntu上,目前如果我不使用sudo,我在尝试连接时会收到有关读/写权限的错误,但这是一个单独的问题)。 我似乎能够连接好了:

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自述文件中建议的代码:

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

在iex中(包含在defmodule MySerial do end block中)和混合项目主文件中,只需在函数中插入IO.puts(data)

我显然在这里遗漏了一些东西,串口连接是否需要iex pid才能将数据发回?我不知道是否需要设置GenServer应用程序来读取数据,或者我是否可以使用elixir_serial api从串口读回数据。

正如我所说,我在GenServer周围,我理解了一般性,但我想知道在开始构建应用程序之前如何开始使用这个包来测试发送和接收数据在它周围。

1 个答案:

答案 0 :(得分: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

基本上,库接收来自其C对应方的调用,然后向启动Serial链接的进程发送消息。

  

发送(pid,{:elixir_serial,self(),data})

请参阅https://github.com/bitgamma/elixir_serial/blob/master/lib/serial.ex#L129