How to use UART Serial Port Using BoneScript Library

I am a newbie to BeagleBone Black(BBB) but have good knowledge about Arduino. I would like to know how to open a serial port in BBB using the 4 UARTs available in BBB using BoneScript library and use cloud9 ide to see the serial data on the console. Can anyone help me on this issue.

Nick:
I have some bonescript code that works with the UART, but I’m not using the built-in bonescript calls. It works fine with a GPS, though I don’t use it to transmit.

I took would like to see an example that uses the bonescript calls. Before ruing the code you need to:

beagle# npm install -g serialport

beagle# echo BB-UART4 > /sys/devices/bone_capemgr.*/slots

–Mark

#!/usr/bin/env node
// From: https://github.com/voodootikigod/node-serialport
// From: GitHub - jamesp/node-nmea: A JavaScript parser for the NMEA GPS protocol

var b = require(‘bonescript’);
var nmea = require(‘nmea’);

//console.log(b.serialOpen);

//var sp = b.serialOpen(’/dev/ttyO4’, {baudrate: 9600} );
// parser: b.serialParsers.readline("\n")});

var serialport = require(“serialport”);
var SerialPort = serialport.SerialPort; // localize object constructor

var sp = new SerialPort("/dev/ttyO4", {
parser: serialport.parsers.readline("\n")
});

sp.on(“data”, function (data) {
console.log("here: "+data);
console.log(nmea.parse(data));
});

Nick:
I have some bonescript code that works with the UART, but I’m not using the built-in bonescript calls. It works fine with a GPS, though I don’t use it to transmit.

I took would like to see an example that uses the bonescript calls.

I haven’t had a chance to try it out as I don’t have a device easy to wire-up until later today, but can you try out this live in-a-webpage example at: http://jsfiddle.net/jkridner/AjnJs/

Before ruing the code you need to:

beagle# npm install -g serialport

BoneScript simply uses this same library, so using BoneScript avoids needing to install it.

beagle# echo BB-UART4 > /sys/devices/bone_capemgr.*/slots

BoneScript loads this same overlay for you.

A basic listening example would be:

var b = require(‘bonescript’);
var port = ‘/dev/ttyO4’;
var options = {
baudrate: 115200
};

b.serialOpen(port, options, onSerial);

function onSerial(x) {
if (x.err) {
console.log('ERROR ’ + JSON.stringify(x));
}
if (x.event == ‘open’) {
console.log(‘OPENED’);
}
if (x.event == ‘data’) {
console.log(String(x.data));
}
}

To write, you’d do:

b.serialWrite(port, data);

Hopefully you’ll see some value in the simplicity.

Jason:
I just cut and pasted your code and it worked! Thanks…

–Mark

It almost works out of the box. I changed baudrate to 9600 for my GPS and data shows up. However I wanted one line of data at a time so I added:

var options = {
baudrate: 9600,
parser: b.serialParsers.readline("\n")
};

But serialParsers isn’t defined! I added the following line at the end of /usr/local/lib/node_modules/bonescript/serial.js

exports.serialParsers = m.module.parsers;

and it works!

–Mark

p.s. How do I do a pull request on bonescript?

This thread saved my sanity. Thank you so much.

Hello Mark and Jason,
I tried using your script in cloud9 as well as using node and I get the same error:

b.serialOpen(port, options, onSerial);

^
TypeError: Object # has no method ‘serialOpen’

What am I missing?

Thank you,

Amer

I tried to use this example to write to a device I have connected to serial port /dev/ttyO1. I know the device answers because I can use screen and get responses. My code to send out “/sh/s” is:

var b = require(‘bonescript’);

var cmd = ‘/sh/s’;

var port = ‘/dev/ttyO1’;

var options = {

baudrate: 9600

};

b.serialOpen(port, options, onSerial);

b.serialWrite(port, cmd);

function onSerial(x) {

if (x.err) {

console.log('ERROR ’ + JSON.stringify(x));

}

if (x.event == ‘open’) {

console.log(‘OPENED’);

}

if (x.event == ‘data’) {

console.log(String(x.data));

}

}

I get the following response:

debian@beaglebone:~/nodews$ node shedrd.js

/usr/local/lib/node_modules/bonescript/my.js:55

var slotRegex = new RegExp(’\d+(?=\s*:.,bs.’ + pin.key + ‘)’,

^

TypeError: Cannot read property ‘key’ of undefined

at Object.exports.load_dt (/usr/local/lib/node_modules/bonescript/my.js:55:67)

at Object.newFunction [as serialOpen] (/usr/local/lib/node_modules/bonescript/my.js:228:25)

at Object. (/home/debian/nodews/shedrd.js:8:3)

at Module._compile (module.js:456:26)

at Object.Module._extensions…js (module.js:474:10)

at Module.load (module.js:356:32)

at Function.Module._load (module.js:312:12)

at Function.Module.runMain (module.js:497:10)

at startup (node.js:119:16)

at node.js:902:3

debian@beaglebone:~/nodews$

Thanks for the help

Jonathan

While not the same, I thought your error looked a little like this one.

“The GPIO pins are only accessible by ‘root’.” (with sudo it works).

Hope it helps.

Is that /dev/tty oh one /dev/tty zero one

–Mark

Hi All,
I am a new bee in BBB too, but have some knowledge about the serial device and data-acquisition. I have read all the emails below, and understood the code. The problem is the command to link the UART4 to /dev/tty failed.

debian@beaglebone:/var/lib/cloud9$ echo BB-UART4 > /sys/devices/bone_capemgr9/slots
bash: /sys/devices/bone_capemgr9/slots: No such file or directory

Cannot find the bone_capemgr in the /sys/devices in this board. Please advice.

ls -l /sys/devices/
total 0
drwxr-xr-x 5 root root 0 Sep 28 17:22 armv7_cortex_a8
drwxr-xr-x 3 root root 0 Sep 28 17:22 breakpoint
drwxr-xr-x 22 root root 0 Sep 28 17:22 platform
drwxr-xr-x 3 root root 0 Sep 28 17:22 soc0
drwxr-xr-x 3 root root 0 Sep 28 17:22 software
drwxr-xr-x 6 root root 0 Sep 28 17:22 system
drwxr-xr-x 3 root root 0 Sep 28 17:22 tracepoint
drwxr-xr-x 12 root root 0 Sep 28 17:22 virtual

Lingling

Hi All,
I am a new bee in BBB too, but have some knowledge about the serial device and data-acquisition. I have read all the emails below, and understood the code. The problem is the command to link the UART4 to /dev/tty failed.

debian@beaglebone:/var/lib/cloud9$ echo BB-UART4 > /sys/devices/bone_capemgr9/slots
bash: /sys/devices/bone_capemgr9/slots: No such file or directory

Cannot find the bone_capemgr in the /sys/devices in this board. Please advice.

For newer images, capemgr is no longer supported as a kernel service. Instead, the ‘config-pin’ utility is used to enable pins to provide access to a UART.

Try:

config-pin p9.13 uart
config-pin p9.11 uart

It is still possible to use the bootloader (u-boot) based capemgr via /boot/uEnv.txt, but I don’t recommend it as it is error prone and far less flexible.

It is also possible to utilize the mainline device tree overlays, but that process is also error prone and less than intuitive.

Please report back on your success with config-pin.

Hi Jason,
Thanks for the message. I configured the pins, and confirmed it works using the screen command as below. Does that mean that the two pins are ready as the serial pins where I can transfer data with different baud-rates?