【问题标题】:Elixir serial port connectionElixir 串口连接
【发布时间】:2016-05-10 05:05:43
【问题描述】:

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

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 do end 块中)和混合项目主文件中,只需在函数中添加 IO.puts(data)

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

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

【问题讨论】:

  • 您是否正在尝试编写测试以使串行设备发送回数据?
  • 我想向设备发送命令,然后在设备上读取该命令的结果。我正在向 Cisco 交换机发送数据,因此需要在 Cisco cli 上模拟人机交互,因此我想了解不同命令的结果。 (在以前使用 pyserial 的经验中,有一些让这变得棘手的问题)

标签: serial-port elixir


【解决方案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

【讨论】:

  • 谢谢克里斯蒂安。我被 Genserver 分心了,我什至没想过只使用flush。现在可以到达某个地方,非常感谢。
猜你喜欢
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多