baud

Elixir Serial Port with Modbus RTU.

Installation and Usage

  1. Add baud to your list of dependencies in mix.exs:
  def deps do
    [{:baud, "~> 0.5.5"}]
  end
  1. Enumerate your serial ports.
  ["COM1", "ttyUSB0", "cu.usbserial-FTVFV143"] = Baud.Enum.list()
  1. Interact with your serial port.
  tty = case :os.type() do
    {:unix, :darwin} -> "cu.usbserial-FTYHQD9MA"
    {:unix, :linux} -> "ttyUSB0"
    {:win32, :nt} -> "COM5"
  end

  # try this with a loopback
  {:ok, pid} = Baud.start_link(device: tty)

  Baud.write pid, "01234\n56789\n98765\n43210"
  {:ok, "01234\n"} = Baud.readln pid
  {:ok, "56789\n"} = Baud.readln pid
  {:ok, "98765\n"} = Baud.readln pid
  {:to, "43210"} = Baud.readln pid

  Baud.write pid, "01234\r56789\r98765\r43210"
  {:ok, "01234\r"} = Baud.readch pid, 0x0d
  {:ok, "56789\r"} = Baud.readch pid, 0x0d
  {:ok, "98765\r"} = Baud.readch pid, 0x0d
  {:to, "43210"} = Baud.readch pid, 0x0d

  Baud.write pid, "01234\n56789\n98765\n43210"
  {:ok, "01234\n"} = Baud.readn pid, 6
  {:ok, "56789\n"} = Baud.readn pid, 6
  {:ok, "98765\n"} = Baud.readn pid, 6
  {:to, "43210"} = Baud.readn pid, 6

  Baud.write pid, "01234\n"
  Baud.write pid, "56789\n"
  Baud.write pid, "98765\n"
  Baud.write pid, "43210"
  :timer.sleep 100
  {:ok, "01234\n56789\n98765\n43210"} = Baud.readall pid
  1. Interact with your RTU devices.
  alias Modbus.Rtu.Master

  tty = case :os.type() do
    {:unix, :darwin} -> "cu.usbserial-FTVFV143"
    {:unix, :linux} -> "ttyUSB0"
    {:win32, :nt} -> "COM5"
  end

  # rs485 usb adapter to modport
  {:ok, pid} = Master.start_link(device: tty, speed: 57600)
  # force 0 to coil at slave 1 address 3000
  :ok = Master.exec pid, {:fc, 1, 3000, 0}
  # read 0 from coil at slave 1 address 3000
  {:ok, [0]} = Master.exec pid, {:rc, 1, 3000, 1}
  # force 10 to coils at slave 1 address 3000 to 3001
  :ok = Master.exec pid, {:fc, 1, 3000, [1, 0]}
  # read 10 from coils at slave 1 address 3000 to 3001
  {:ok, [1, 0]} = Master.exec pid, {:rc, 1, 3000, 2}
  # preset 55AA to holding register at slave 1 address 3300
  :ok = Master.exec pid, {:phr, 1, 3300, 0x55AA}
  # read 55AA from holding register at slave 1 address 3300 to 3301
  {:ok, [0x55AA]} = Master.exec pid, {:rhr, 1, 3300, 1}

Development

Windows

Install Visual C++ 2015 Build Tools by one of the following methods:

From the Windows run command launch cmd /K c:\Users\samuel\Documents\github\baud\setenv.bat adjusting your code location accordingly.

Ubuntu

Give yourself access to serial ports with sudo gpasswd -s samuel dialout. Follow the official Elixir installation instructions and install build-essential erlang-dev as well.

Roadmap

Future

0.5.4

0.5.3

0.5.2

0.5.1

0.5.0

0.4.3

0.4.2

0.4.1

0.4.0

0.3.0

0.2.0

0.1.0

Research