Zesky665
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
Trending in Questions
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
Hello,
I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
Hi everyone,
I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding.
I sta...
New
Documentation
While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
So my question is quite simple and i have found no conclusive answer on forum, google or AI.
Should we use :erlang.float for Integer to ...
New
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted”
Version...
New
Other Trending Topics
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hi there! We created Gust: A task orchestrator inspired by Airflow.
For those who have never heard about Aiflow, it’s a Python-based wor...
New
Hi everyone!
The first release candidate for the Expert language server project is now available!
We’ve published a press release detai...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #ai
- #blog-post
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #hex
- #security










Showing Posts 3 to 1- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
kpanic
Glad you made it work!
If
Nerves.UART.open/2is blocking, an small improvement could be also to use the “new”handle_continue/2callback. So that the OTP Application would not block when booting theinitof the GenServerAn 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 · GitHubSee also the official doc GenServer — Elixir v1.20.2
btw, nerves is really nice!
Happy hacking!
Zesky665
Thank you.
I managed to hack together an answer in the time between posting this and your answer.
Here it is , in case it’s relevant.
Edit #1: Removed redundant code.
kpanic
Hello, you should handle messages sent from
Process.send_after/2with the functionhandle_info/2Check GenServer — Elixir v1.20.2
Also don’t forget to use
Process.cancel_timer/1when you are done with the timer.