This application provides the ability for serial over TCP or Websockets on a Raspberry PI. Basically makes the PI act as a serial over network adapter. Note - CTS and RTS are not supported
This repo is complimentary to the PI2c repo allowing you to control the i2c, spi, pwm, and gpio over a simple rest service.
You will need to apply the overlay pi3-disable-bt or pi3-miniuart-bt in order to use the UART of the PI3 A/B+ and Zero W. The UART by default on most linux distributions is used to control the BT module. There is plenty of documentation online to do this.
A rest server will be running on default port 82 to configure baudrate. The default baudrate is 9600. It will need to be set every startup.
- POST /api/v1/setBaudRate/:baudRate
- Set a new baudRate
- valid optoins are [110, 300, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 57600, or 115200]
- successful [status 200] response application/json {"success": true, "baudRate": number}
- failed [status 400] response application/json {"success": false, "error": string}.
- GET /api/v1/baudRate
- Get the current baudrate
- successful [status 200] response application/json {"success": true, "baudRate": number}
- failed [status 400] response application/json {"success": false, "error": string}
If you are using this directly on your PI you will need to use physical pins 8 and 10 for TX and RX respectivly.
Function | PI2c Hat | Pi Header |
---|---|---|
UART | ||
UART_TX | 12 | 8 |
UART_RX | 14 | 10 |
- Install and run globally
npm install -g pi2c-serial
REST_PORT=82 pi2c-serial
- Install and run in repo
npm install
REST_PORT=82 node src/server.js
- Wire your device to the PI2c using the info above
- Configure the Serial baudrate with via the Rest api
# Command line example set serial baudrate
curl --request POST http://${REST_SERVER}:82/api/v1/setBaudrate/115200
- Using your desired platform connect to Websocket port 1337 for or TCP port 47070. Traffic over serial will be routed to these sockets.
# Python TCP write serial example
import socket
class SerialSocket:
def __init__(self, sock=None):
if sock is None:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
else:
self.sock = sock
def connect(self, host, port):
self.sock.connect((host, port))
def write(self, msg):
totalsent = 0
MSGLEN = len(msg)
while totalsent < MSGLEN:
sent = self.sock.send(msg[totalsent:])
if sent == 0:
raise RuntimeError("socket connection broken")
totalsent = totalsent + sent
def read(self, num):
chunks = []
bytes_recd = 0
MSGLEN = num
while bytes_recd < MSGLEN:
chunk = self.sock.recv(min(MSGLEN - bytes_recd, 2048))
if chunk == b'':
raise RuntimeError("socket connection broken")
chunks.append(chunk)
bytes_recd = bytes_recd + len(chunk)
return b''.join(chunks)
serial = SerialSocket()
serial.connect('GO-XXXXXXX', 47070)
serial.write(bytearray("hello\n", "utf-8"))