Skip to content

yesbotics/simple-serial-protocol-node

Repository files navigation

Simple Serial Protocol for Node.js written in Typescript

Easy and robust General Purpose Library for the communication between Node.js applications and Arduino devices. Powered by the usage of resource-efficient and microcontroller-friendly Primitive Dataypes. This package covers the Node.js implementation of Simple Serial Protocol.

NPM registry

This package is distributed as simple-serial-protocol-node npm package.

Requirements

  • Node.js >= 12.0.0

Install

npm install --save @yesbotics/simple-serial-protocol-node

Usage example (echo-example written in TypeScript)

This example sends values of each supported datatype and listen for them sent back. This example can be found as npm application in the simple-serial-protocol-node/examples/echo-example folder. It corresponds with the Arduino sketch at Simple Serial Protocol for Arduino.

/// don't remove this line!
import {
    Baudrate,
    SimpleSerialProtocol,
    WriteCommandConfig,
    ReadCommandConfig
} from '@yesbotics/simple-serial-protocol-node';

export class EchoExampleApp {

    public run(portname: string, baudrate: Baudrate): void {

        // create instance
        const arduino: SimpleSerialProtocol = new SimpleSerialProtocol(portname, baudrate);

        // define command id and callback function
        const readConfig: ReadCommandConfig = new ReadCommandConfig(
            's',
            (
                byteValue: number,
                booleanValue: boolean,
                int8Value: number,
                uint8Value: number,
                int16Value: number,
                uint16Value: number,
                int32Value: number,
                uint32Value: number,
                int64Value: bigint,
                uint64Value: bigint,
                floatValue: number,
                charValue: string,
                stringValue1: string,
                stringValue2: string,
                stringValue3: string,
            ) => {
                console.log('Received several values from Arduino:');
                console.log('byteValue', byteValue);
                console.log('booleanValue', booleanValue);
                console.log('int8Value', int8Value);
                console.log('uint8Value', uint8Value);
                console.log('int16Value', int16Value);
                console.log('uint16Value', uint16Value);
                console.log('int32Value', int32Value);
                console.log('uint32Value', uint32Value);
                console.log('int64Value', int64Value);
                console.log('uint64Value', uint64Value);
                console.log('floatValue', floatValue);
                console.log('charValue', charValue);
                console.log('stringValue1', stringValue1);
                console.log('stringValue2', stringValue2);
                console.log('stringValue3', stringValue3);

                //gracefully close the connection
                arduino.dispose().catch((err) => {
                    console.error('Could not dispose. reason:', err);
                });
            }
        );

        // define expected dataytpes
        readConfig
            .addByteParam()
            .addBooleanParam()
            .addInt8Param()
            .addUInt8Param()
            .addInt16Param()
            .addUInt16Param()
            .addInt32Param()
            .addUInt32Param()
            .addInt64Param()
            .addUInt64Param()
            .addFloatParam()
            .addCharParam()
            .addStringParam()
            .addStringParam()
            .addStringParam();

        // register command with prepared config
        arduino.registerCommand(readConfig);

        // establish connection to arduino and wait 2 seconds
        // give arduino time to start after getting connected (and resetted too)
        arduino.init(2000)
            .catch((err) => {
                console.error('Could not init connection. reason:', err);
            })
            .then(() => {
                console.log('Arduino connected.');
                console.log('Send several values to Arduino');

                const command: WriteCommandConfig = new WriteCommandConfig('r');
                command
                    .addByteValue(0xff)
                    .addBooleanValue(true)
                    .addInt8Value(-128)
                    .addUInt8Value(255)
                    .addInt16Value(-32768)
                    .addUInt16Value(65523)
                    .addInt32Value(-2147483648)
                    .addUInt32Value(4294967295)

                    // For BigInt Support add `esnext` to your tsconfig lib section
                    .addInt64Value(BigInt(-2147483648000999))
                    .addUInt64Value(BigInt(7294967295000999))

                    .addFloatValue(-1.23456789101112)
                    .addCharValue('J')

                    .addStringValue("text1: Hey, I'm text one!")
                    .addStringValue("text2: And I am his brother text two!")
                    .addStringValue("text3: Nice!");

                arduino.writeCommand(command);
            });
    }
}

// entry point

const MY_PORTNAME: string = 'undefinedPortname'; // change this to your serial port name
const MY_BAUDRATE: Baudrate = 9600; // change this to your partner device's baudrate

const usedPortname: string = (MY_PORTNAME !== 'undefinedPortname' ? MY_PORTNAME : null) || process.argv[2];
const usedBaudrate: Baudrate = parseInt(process.argv[3]) || MY_BAUDRATE || 9600;

console.log('running echo example');
console.log('use portname:', usedPortname);
console.log('use baudrate:', usedBaudrate);

const echoExampleApp = new EchoExampleApp();
echoExampleApp.run(usedPortname, usedBaudrate);

Links

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published