Published on

Leer datos de una bascula por puerto serial

Authors

Necesito leer los datos de un dispositivo desde el puerto serial y ponerlos en una API

En la actualización de las aplicaciones me encontré con este nuevo reto

Decidí utilizar NodeJS y las dependencias:

El hardware que estoy utilizando es el siguiente:

Modelo de la bascula
Serial a usb

Es un proyecto relativamente pequeño en código pero no por eso menos importante

const express = require("express");
const cors = require('cors')
const app = express();
const SerialPort = require('serialport')
const Delimiter = require('@serialport/parser-delimiter');
const port = new SerialPort('/dev/ttyUSB0', {
baudRate: 2400
})
let bascula = []
app.use(cors())

La parte extraña es la constante port, le estoy pasando la interface del dispositivo y la frecuencia con la que trabaja (cada dispositivo tiene su propia configuración por lo que es necesario leer los manuales)

const parser = port.pipe(new Delimiter({ delimiter: '\n' }))
parser.on('data', function (data) {
// La conexión con el puerto siempre está abierta por lo que solo guardo los valores que cambian
data.toString() !== bascula[bascula.length - 1]? bascula.push(data.toString()): null
console.log(bascula[bascula.length - 1])
})

Al inicio declaré un arreglo, la idea es guardar en el los cambios de los valores, pero solo si es diferente al anterior para no tener valores repetidos infinitos.

app.get("/API/v1/bascula", (req, res) => {
res.status(200).json({ bascula: bascula[bascula.length - 1] })
//limpio el arreglo para mejorar el rendimiento
bascula.length=0
})

La ruta donde se van a consultar es /API/v1/bascula donde aparecerán los datos del json con el último valor almacenado

const PORT = process.env.PORT || 3000;
app.listen(PORT, (err) => {
if (err) throw err;
console.log("server corriendo en el puerto", PORT);
});

Los clásicos parametros para iniciar el server y el resultado es el siguiente

Resultado de la api

Te dejo el repositorio por si gustas ver a detalle el código y la API funcionado.

Saludos.