A simple library for serial port communication with Clojure. Although serial communciation may be considered old tech, it's useful for a communicating with a plethora of devices including exciting new hardware such as the Monome and the Arduino. It's powerd by [PureJavaComm] (https://github.com/nyholku/purejavacomm) for serial communication
Add the following to your
Using the library
Just make sure you pull in the
serial.core namespace using something like:
Finding your port identifier
In order to connect to your serial device you need to know the path of the file it presents itself on.
serial.util provides a simple function to list these paths out:
=> (use 'serial.util) => (list-ports) /dev/tty.usbmodemfa141 /dev/cu.usbmodemfa141 /dev/tty.Bluetooth-PDA-Sync /dev/cu.Bluetooth-PDA-Sync /dev/tty.Bluetooth-Modem /dev/cu.Bluetooth-Modem
In this case, we have an Arduino connected to
Connecting with a port identifier
When you know the path to the serial port, connecting is just as simple as:
However, you'll want to bind the result so you can use it later:
(def port (open "/dev/tty.usbmodemfa141"))
If you wish to get raw access to the
InputStream this is possible with the function
listen. This allows you to specify a handler that will get called every time there is data available on the port and will pass your handler the
InputStream to allow you to directly
.read bytes from it.
When the handler is first registered, the bytes that have been buffered on the serial port are dropped by default. This can be changed by passing false to
listen! as an optional last argument.
Only one listener may be registered at a time. If you want to fork the incoming datastream to a series of streams, you might want to consider using lamina. You can then register a handler which simply enqueues the incoming serial data to a lamina channel which you may then fork and map according to your whim.
Finally, you may remove your listener by calling
unlisten! and passing it the port binding.
The simplest way to write bytes is by passing a byte array to
(write port my-byte-array)
This also works with any
(write port 20)
As well as any
(write port [0xf0 0x79 0xf7])
Closing the port
Simply use the
- Peter Schwarz
Forked from samaaron/serial-port, by
- Sam Aaron
- Jeff Rose
Distributed under the Eclipse Public License, the same as Clojure.