|
1 | 1 | 'use strict'; |
2 | 2 |
|
3 | | -// Copyright 2011 Chris Williams <chris@iterativedesigns.com> |
| 3 | +/** |
| 4 | + * The default Parsers are [Transform streams](https://nodejs.org/api/stream.html#stream_class_stream_transform) that will parse data in a variety of ways and can be used to process incoming data. |
4 | 5 |
|
5 | | -function isEqual(arr1, arr2) { |
6 | | - var isArray = Array.isArray; |
7 | | - if (!isArray(arr1) || !isArray(arr2) || arr1.length !== arr2.length) { |
8 | | - return false; |
9 | | - } |
10 | | - var l = arr1.length; |
11 | | - for (var i = 0; i < l; i += 1) { |
12 | | - if (arr1[i] !== arr2[i]) { |
13 | | - return false; |
14 | | - } |
15 | | - } |
16 | | - return true; |
17 | | -} |
| 6 | + To use any of the parsers you need to create them and then pipe the serialport to the parser. Be sure not to write to the parser but to the SerialPort object. |
| 7 | + * @name module:serialport.parsers |
| 8 | + * @type {object} |
| 9 | + * @property {Class} [ByteLength] is a transform stream that emits data each time a byte sequence is received. |
| 10 | + * @property {Class} [Delimiter] is a transform stream that emits data as a buffer after a specific number of bytes are received. |
| 11 | + * @property {Class} [ReadLine] is a transform stream that emits data after a newline delimiter is received. |
| 12 | + * @example |
| 13 | +```js |
| 14 | +var SerialPort = require('serialport'); |
| 15 | +var ReadLine = SerialPort.parsers.ReadLine; |
| 16 | +var port = new SerialPort('/dev/tty-usbserial1'); |
| 17 | +var parser = new ReadLine(); |
| 18 | +port.pipe(parser); |
| 19 | +parser.on('data', console.log); |
| 20 | +port.write('ROBOT PLEASE RESPOND\n'); |
18 | 21 |
|
19 | | -module.exports = { |
20 | | - raw: function(emitter, buffer) { |
21 | | - emitter.emit('data', buffer); |
22 | | - }, |
| 22 | +// creating the parser and piping can be shortened to |
| 23 | +var parser = port.pipe(new ReadLine()); |
| 24 | +``` |
| 25 | +
|
| 26 | +To use the byte length parser, you must provide the length of the number of bytes: |
| 27 | +```js |
| 28 | +var SerialPort = require('serialport'); |
| 29 | +var ByteLength = SerialPort.parsers.ByteLength |
| 30 | +var port = new SerialPort('/dev/tty-usbserial1'); |
| 31 | +var parser = port.pipe(new ByteLength({length: 8})); |
| 32 | +parser.on('data', console.log); |
| 33 | +``` |
23 | 34 |
|
24 | | - // encoding: ascii utf8 utf16le ucs2 base64 binary hex |
25 | | - // More: http://nodejs.org/api/buffer.html#buffer_buffer |
26 | | - readline: function(delimiter, encoding) { |
27 | | - if (typeof delimiter === 'undefined' || delimiter === null) { delimiter = '\r' } |
28 | | - if (typeof encoding === 'undefined' || encoding === null) { encoding = 'utf8' } |
29 | | - // Delimiter buffer saved in closure |
30 | | - var data = ''; |
31 | | - return function(emitter, buffer) { |
32 | | - // Collect data |
33 | | - data += buffer.toString(encoding); |
34 | | - // Split collected data by delimiter |
35 | | - var parts = data.split(delimiter); |
36 | | - data = parts.pop(); |
37 | | - parts.forEach(function(part) { |
38 | | - emitter.emit('data', part); |
39 | | - }); |
40 | | - }; |
41 | | - }, |
| 35 | +To use the Delimiter parser you must specify, you must provide a delimiter as a string, buffer, or an array of bytes: |
| 36 | +```js |
| 37 | +var SerialPort = require('serialport'); |
| 38 | +var Delimiter = SerialPort.parsers.Delimiter; |
| 39 | +var port = new SerialPort('/dev/tty-usbserial1'); |
| 40 | +var parser = port.pipe(new Delimiter({delimiter: new Buffer('EOL')})); |
| 41 | +parser.on('data', console.log); |
| 42 | +``` |
42 | 43 |
|
43 | | - // Emit a data event every `length` bytes |
44 | | - byteLength: function(length) { |
45 | | - var data = new Buffer(0); |
46 | | - return function(emitter, buffer) { |
47 | | - data = Buffer.concat([data, buffer]); |
48 | | - while (data.length >= length) { |
49 | | - var out = data.slice(0, length); |
50 | | - data = data.slice(length); |
51 | | - emitter.emit('data', out); |
52 | | - } |
53 | | - }; |
54 | | - }, |
| 44 | +To use the ReadLine parser, you may provide a delimiter (defaults to '\n') |
| 45 | +```js |
| 46 | +var SerialPort = require('serialport'); |
| 47 | +var ReadLine = SerialPort.parsers.ReadLine; |
| 48 | +var port = new SerialPort('/dev/tty-usbserial1'); |
| 49 | +var parser = port.pipe(ReadLine({delimiter: '\r\n'})); |
| 50 | +parser.on('data', console.log); |
| 51 | +``` |
| 52 | + */ |
55 | 53 |
|
56 | | - // Emit a data event each time a byte sequence (delimiter is an array of byte) is found |
57 | | - // Sample usage : byteDelimiter([10, 13]) |
58 | | - byteDelimiter: function(delimiter) { |
59 | | - if (!Array.isArray(delimiter)) { |
60 | | - delimiter = [ delimiter ]; |
61 | | - } |
62 | | - var buf = []; |
63 | | - return function(emitter, buffer) { |
64 | | - for (var i = 0; i < buffer.length; i++) { |
65 | | - buf[buf.length] = buffer[i]; |
66 | | - if (isEqual(delimiter, buf.slice(-delimiter.length))) { |
67 | | - emitter.emit('data', buf); |
68 | | - buf = []; |
69 | | - } |
70 | | - } |
71 | | - }; |
72 | | - } |
| 54 | +module.exports = { |
| 55 | + ReadLine: require('./parser-read-line'), |
| 56 | + Delimiter: require('./parser-delimiter'), |
| 57 | + ByteLength: require('./parser-byte-length') |
73 | 58 | }; |
0 commit comments