Elixir 串口连接

Elixir serial port connection

我正在探索使用 Elixir 连接到串行设备。我找到的唯一图书馆是 this one。我仍在努力研究 Genservers,在我开始写 program/application 之前,我只想在 iex 中做一些简单的实验,但我不知道如何开始。
我已经启动了一个新的混合项目,添加了 elixir_serial 包作为依赖项并使用 sudo iex -S mix 启动了 iex。 (我在 ubuntu,目前如果我不使用 sudo,我会在尝试连接时收到有关 read/write 权限的错误,但这是另一个问题 afaik)。 我似乎可以连接 ok:

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 结束块中)和混合项目主文件中,只是在函数中插入 IO.puts(data)

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

正如我所说的,我正在研究 GenServer,我理解一般性,但我想知道如何开始使用这个包来测试发送和接收数据,然后再开始围绕它构建应用程序.

以下是 elixir_serial 中 Serial.start_link 的文档:

Starts a serial port. The process invoking this function will receive messages in the form of {: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 link.

的进程发送消息

send(pid, {:elixir_serial, self(), data})

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