From ae2a092fab79cae89036638c18b71b84b88bae28 Mon Sep 17 00:00:00 2001 From: Nick Leeman Date: Sat, 1 May 2021 20:19:13 +0200 Subject: [PATCH] updated protocol to use better ascii chars --- library.json | 2 +- src/Packet.h | 2 +- src/SerialConnection.h | 53 ++++++++++------------------------ src/SimpleSerialProtocol.h | 59 ++++++++++++++++++++------------------ 4 files changed, 48 insertions(+), 68 deletions(-) diff --git a/library.json b/library.json index ddbd790..874487d 100644 --- a/library.json +++ b/library.json @@ -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": diff --git a/src/Packet.h b/src/Packet.h index a8e8a06..acc72c9 100644 --- a/src/Packet.h +++ b/src/Packet.h @@ -21,6 +21,6 @@ struct Packet { char * id; - char * command; + char * type; char * data; }; diff --git a/src/SerialConnection.h b/src/SerialConnection.h index 95c405a..487f728 100644 --- a/src/SerialConnection.h +++ b/src/SerialConnection.h @@ -18,15 +18,13 @@ * */ +#include + 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; }; \ No newline at end of file diff --git a/src/SimpleSerialProtocol.h b/src/SimpleSerialProtocol.h index 7122ed6..c49ece6 100644 --- a/src/SimpleSerialProtocol.h +++ b/src/SimpleSerialProtocol.h @@ -18,6 +18,8 @@ * */ +#include + #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; }; \ No newline at end of file