updated protocol to use better ascii chars

This commit is contained in:
Nick Leeman 2021-05-01 20:19:13 +02:00
parent 0f26c86e0c
commit ae2a092fab
4 changed files with 48 additions and 68 deletions

View File

@ -1,6 +1,6 @@
{
"name": "SimpleSerialProtocol",
"version": "1.7.0",
"version": "1.8.0",
"description": "Easy-to-use serial protocol system for arduino type devices.",
"keywords": "Serial, Connectivity, USB, Simple",
"repository":

View File

@ -21,6 +21,6 @@
struct Packet
{
char * id;
char * command;
char * type;
char * data;
};

View File

@ -18,15 +18,13 @@
*
*/
#include <Arduino.h>
class SerialConnection
{
private:
int serialBufferSize = 512;
char serialBuffer[512];
char serialData[512] = {0};
const char packetStartMarker = '<';
const char packetEndMarker = '>';
int serialBufferSize = 265;
char serialBuffer[265];
// Receiving a new packet
boolean newSerialData = false;
@ -41,34 +39,21 @@ class SerialConnection
Stream *serialRefrence;
public:
void init(int serialIndex, unsigned long serialBaud);
void send(char * data);
const char packetStartMarker = 180;
const char packetMidMarker = 196;
const char packetEndMarker = 195;
void init(HardwareSerial &serialHandle, unsigned long serialBaud);
void send(char* data);
char* handle();
char* getPacketMarker(int type);
int getBufferSize();
};
void SerialConnection::init(int serialIndex, unsigned long serialBaud) {
if (serialIndex == 0) {
Serial.begin(serialBaud);
serialRefrence = &Serial;
}
else if (serialIndex == 1) {
Serial1.begin(serialBaud);
serialRefrence = &Serial1;
}
else if (serialIndex == 2) {
Serial2.begin(serialBaud);
serialRefrence = &Serial2;
}
else if (serialIndex == 3) {
Serial3.begin(serialBaud);
serialRefrence = &Serial3;
}
void SerialConnection::init(HardwareSerial &serialHandle, unsigned long serialBaud) {
// serialBuffer[serialBufferSize] = {0};
serialRefrence = &serialHandle;
serialHandle.begin(serialBaud);
};
char* SerialConnection::handle() {
@ -105,18 +90,10 @@ char* SerialConnection::handle() {
return NULL;
};
void SerialConnection::send(char * data) {
void SerialConnection::send(char* data) {
serialRefrence->println(data);
};
char* SerialConnection::getPacketMarker(int type) {
if (type == 0) {
return "<";
} else {
return ">";
}
};
int SerialConnection::getBufferSize() {
return (int)serialBufferSize;
};

View File

@ -18,6 +18,8 @@
*
*/
#include <Arduino.h>
#include "Packet.h"
#include "SerialConnection.h"
@ -26,23 +28,13 @@ class SimpleSerialProtocol
private:
SerialConnection serialConnection;
public:
bool init(int deviceIndex, unsigned long baud);
bool init(HardwareSerial &serialHandle, unsigned long baud);
bool receivePackets(void (*callback)(Packet));
bool sendPacket(char* ID, char* command, char* data);
};
bool SimpleSerialProtocol::init(int deviceIndex, unsigned long baud) {
// Check if device index is in range
if (deviceIndex < 0 || deviceIndex > 4) {
return false;
}
// Init serial connection
serialConnection.init(deviceIndex, baud);
// Serial Connection Delay
delay(5);
bool SimpleSerialProtocol::init(HardwareSerial &serialHandle, unsigned long baud) {
serialConnection.init(serialHandle, baud);
return true;
};
@ -52,30 +44,32 @@ bool SimpleSerialProtocol::receivePackets(void (*callback)(Packet)) {
// Check if received a complete buffer
if (receivedBuffer != NULL) {
int bufferSize = serialConnection.getBufferSize();
// Buffer pointer
char* strtokIndex;
char id[bufferSize / 2];
char command[bufferSize / 2];
char data[bufferSize / 2];
// Marker
char marker[1] = "";
marker[0] = serialConnection.packetMidMarker;
// Get ID
strtokIndex = strtok(receivedBuffer, ":");
strtokIndex = strtok(receivedBuffer, marker);
char id[strlen(strtokIndex)];
strcpy(id, strtokIndex);
// Get Command
strtokIndex = strtok(NULL, ":");
strcpy(command, strtokIndex);
// Get Type
strtokIndex = strtok(NULL, marker);
char type[strlen(strtokIndex)];
strcpy(type, strtokIndex);
// Get Data
strtokIndex = strtok(NULL, ":");
strtokIndex = strtok(NULL, marker);
char data[strlen(strtokIndex)];
strcpy(data, strtokIndex);
// Pack received data into packet
Packet packet;
packet.id = id;
packet.command = command;
packet.type = type;
packet.data = data;
// Call pointer callback function
@ -89,14 +83,23 @@ bool SimpleSerialProtocol::receivePackets(void (*callback)(Packet)) {
return false;
};
bool SimpleSerialProtocol::sendPacket(char* ID, char* command, char* data) {
bool SimpleSerialProtocol::sendPacket(char* id, char* type, char* data) {
// Create new packet buffer
char serialPacketBuffer[serialConnection.getBufferSize()];
// Pack data in buffer
sprintf(serialPacketBuffer, "%s%s:%s:%s%s", serialConnection.getPacketMarker(0), ID, command, data, serialConnection.getPacketMarker(1));
sprintf(serialPacketBuffer, "%c%s%c%s%c%s%c",
serialConnection.packetStartMarker,
id,
serialConnection.packetMidMarker,
type,
serialConnection.packetMidMarker,
data,
serialConnection.packetEndMarker
);
// Send buffer to serial device
serialConnection.send(serialPacketBuffer);
return true;
};