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
我正在探索使用 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