Zesky665
'Process.send_after' doesn't work
Hi,
I’m trying to create a nerves app that will read from a sensor at 10s intervals. I’ve written code for reading from the device and it works. The problem is that when using the ‘Process.send_after’ function in order to read repeatedly, nothing happens.
Here’s my code:
defmodule HelloNerves do
use GenServer
# Client
def start_link(options\\[]) do
GenServer.start_link __MODULE__, [], options
end
def find_device(pid) do
GenServer.call(pid, {:find})
end
def start_reading(pid) do
GenServer.call(pid, {:start})
end
def read_output(pid_1, pid_2) do
GenServer.call(pid_1, {:read, pid_2})
end
# Server
def init(_) do
{:ok, []}
end
def handle_call({:find}, _from, state) do
devices = Nerves.UART.enumerate
case Map.has_key?(devices, "ttyUSB0") do
true -> {:reply, :ok, state}
false -> {:reply, :not_found, state}
end
end
def handle_call({:start}, _from, state) do
{:ok, pid} = Nerves.UART.start_link
response = Nerves.UART.open(pid, "ttyUSB0", speed: 9600, active: false)
read_data_interval(pid)
case response == :ok do
true -> {:reply, {:ok, pid}, state}
false -> {:reply, :not_ok, state}
end
end
def handle_call({:read, pid}, _from, state) do
{:ok, output} = Nerves.UART.read(pid, 5000)
IO.inspect(output, label: "The sensor data: ")
read_data_interval(pid)
case Kernel.is_bitstring(output) do
true -> {:reply, :ok, state}
false -> {:reply, :not_ok, state}
end
end
defp read_data_interval(pid) do
Process.send_after(self(), {:read, pid}, 5000)
end
end
Any idea as to what my problem is?
Thank you
Marked As Solved
kpanic
Hello, you should handle messages sent from Process.send_after/2 with the function handle_info/2
Check GenServer — Elixir v1.20.2
Also don’t forget to use Process.cancel_timer/1 when you are done with the timer.
Also Liked
kpanic
Glad you made it work!
If Nerves.UART.open/2 is blocking, an small improvement could be also to use the “new” handle_continue/2 callback. So that the OTP Application would not block when booting the init of the GenServer
An example (with nerves) is nerves_morse/fw/lib/nerves_morse/worker.ex at master · kpanic/nerves_morse · GitHub and nerves_morse/fw/lib/nerves_morse/worker.ex at master · kpanic/nerves_morse · GitHub
See also the official doc GenServer — Elixir v1.20.2
btw, nerves is really nice! ![]()
Happy hacking!
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








