Robots in the browser. Just like node-serialport but for browser apps.
Nodebots are awesome but HTML5 apps have access to a lot of APIs that make sense for robotics like the GamepadAPI, WebRTC Video and Data, Web Speech API, etc. Also you get a nice GUI and its easier to run. I have also made a fork of Johnny-Five to work with Browserify as well by modifying it's dependancy Firmata to use browser-serialport.
You will not be able to add this to your normal website.
This library only works in a Chrome Packaged App as this is the only way to get access to the serial ports API in the browser.
If you want help making your first Chrome App, read the "Create Your First App" tutorial.
There is currently no Firefox extension support but that might come soon if possible.
- Parsers not implemented
- Inconsistent error messages
- Chrome has a slightly different options set:
- dataBits: 7, 8
- stopBits: 1, 2
- parity: 'none', 'even', 'mark', 'odd', 'space'
- flowControl: 'RTSCTS'
npm install browser-serialport
Opening a serial port:
var SerialPort = require("browser-serialport").SerialPort
var serialPort = new SerialPort("/dev/tty-usbserial1", {
baudrate: 57600
});
When opening a serial port, you can specify (in this order).
- Path to Serial Port - required.
- Options - optional and described below.
The options object allows you to pass named options to the serial port during initialization. The valid attributes for the options object are the following:
- baudrate: Baud Rate, defaults to 9600. Should be one of: 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1800, 1200, 600, 300, 200, 150, 134, 110, 75, or 50. Custom rates as allowed by hardware is supported.
- databits: Data Bits, defaults to 8. Must be one of: 8, 7,
6, or5. - stopbits: Stop Bits, defaults to 1. Must be one of: 1 or 2.
- parity: Parity, defaults to 'none'. Must be one of: 'none', 'even', 'mark', 'odd', 'space'
- buffersize: Size of read buffer, defaults to 255. Must be an integer value.
- parser: The parser engine to use with read data, defaults to rawPacket strategy which just emits the raw buffer as a "data" event. Can be any function that accepts EventEmitter as first parameter and the raw buffer as the second parameter.
Note, we have added support for either all lowercase OR camelcase of the options (thanks @jagautier), use whichever style you prefer.
You MUST wait for the open event to be emitted before reading/writing to the serial port. The open happens asynchronously so installing 'data' listeners and writing before the open event might result in... nothing at all.
Assuming you are connected to a serial console, you would for example:
serialPort.on("open", function () {
console.log('open');
serialPort.on('data', function(data) {
console.log('data received: ' + data);
});
serialPort.write("ls\n", function(err, results) {
console.log('err ' + err);
console.log('results ' + results);
});
});
You can also call the open function, in this case instanciate the serialport with an additional flag.
var SerialPort = require("browser-serialport").SerialPort
var serialPort = new SerialPort("/dev/tty-usbserial1", {
baudrate: 57600
}, false); // this is the openImmediately flag [default is true]
serialPort.open(function (error) {
if ( error ) {
console.log('failed to open: '+error);
} else {
console.log('open');
serialPort.on('data', function(data) {
console.log('data received: ' + data);
});
serialPort.write("ls\n", function(err, results) {
console.log('err ' + err);
console.log('results ' + results);
});
}
});
You can also list the ports along with some metadata as well.
var serialPort = require("browser-serialport");
serialPort.list(function (err, ports) {
ports.forEach(function(port) {
console.log(port.comName);
console.log(port.pnpId);
console.log(port.manufacturer);
});
});
Browser-serialport doesn't as of 2.0.0 support parsers.
You can get updates of new data from the Serial Port as follows:
serialPort.on("data", function (data) {
sys.puts("here: "+data);
});
You can write to the serial port by sending a string or buffer to the write method as follows:
serialPort.write("OMG IT WORKS\r");
Enjoy and do cool things with this code.