[AN] Anup Narkhede

Programmer, Hobbyist, Jack of many trades, Master of some


I was looking for a way to send interrupts from Arduino to my macbook, without performing polling on a port. Here is a simple attempt to make it work. em-serialport is eventmachine compatible asynchronous library based on ruby-serialport.

The operation is simple. Whenever data is is available over serial port, on_data callback gets invoked. Similarly send_data writes the data on serial port.


gem install em-serialport


If you are on Mac, you need to set up a virtual USB serial port by installing a driver from http://www.ftdichip.com/Drivers/VCP.htm. Identify your serial port device. For ex: /dev/tty.usbserial-xxxxxxxx

EM.run do
  serial = EventMachine.open_serial('/dev/tty.usbserial-xxxxxxxx', 9600, 8, 1, 0)
  serial.send_data "foo"

  serial.on_data do |data|
    # you got data. Eat it.

Serial Monitor

The gem comes with a simple command line Serial Monitor. Launch it as:

bundle exec serial-monitor /dev/tty.usbserial-xxxxxxxx

Here is a working example, tested with an https://github.com/railsbob/arduino-examples/tree/master/echo_server. It simply reads and writes data to serial port from command line.

Serial monitor initialized. Enter data followed by a newline character.
Ctrl-C to stop
received: hello
A very long sentence
received: A v
received: ery long
received:  sentence