Compare commits

...

2 Commits

Author SHA1 Message Date
929f4042e0 updated readme 2021-05-01 20:24:28 +02:00
ae2a092fab updated protocol to use better ascii chars 2021-05-01 20:19:13 +02:00
6 changed files with 57 additions and 84 deletions

View File

@@ -38,25 +38,21 @@ SimpleSerialProtocol has a very simple API so it should be very easy to implemen
The protocol works as following, each packet has 3 seperate stages.
### ID
This could be the device or service you want to reach.
ID of packet (device)
### Command
This is the command you want to send to the device or service.
### Type
Type of packet (action)
### Data
This is the data you want to send to the device or service.
Data of packet (data)
Of course you could change the use of any of these values to fit your needs.
A complete packet would look like this:
```
<ID_HERE:COMMAND_HERE:DATA_HERE>
ID - TYPE - DATA
```
As you can see the packet starts and ends with ``< - >`` characters and the stages are seperated with `` : `` characters.
`This means you can't use any of these characters as data in the packets!!`
Include SSP and define a new device.
```c++
#include <SimpleSerialProtocol.h>
@@ -80,7 +76,7 @@ Now create a method (with a packet parameter) which will be called when a packet
void onPacket(Packet packet) {
Serial.println("Received Packet!");
Serial.println(packet.id);
Serial.println(packet.command);
Serial.println(packet.type);
Serial.println(packet.data);
Serial.println("----------------");
}
@@ -92,7 +88,7 @@ void loop() {
```
To send packets you can use the ``sendPacket`` method.
```c++
deviceOne.sendPacket("IDPacket", "Commandhere", "testtest");
deviceOne.sendPacket("IDPacket", "Typehere", "testtest");
```
## Contributing
Pull requests are welcome! For major changes, please open an issue first to discuss what you would like to change.

View File

@@ -8,12 +8,12 @@ SimpleSerialProtocol deviceOne;
void onPacket(Packet packet) {
Serial.println("Received Packet!");
Serial.println(packet.id);
Serial.println(packet.command);
Serial.println(packet.type);
Serial.println(packet.data);
Serial.println("----------------");
// To send a packet
deviceOne.sendPacket("IDPacket", "Commandhere", "testtest");
deviceOne.sendPacket("IDPacket", "TypeHere", "testtest");
}
void setup() {
@@ -25,8 +25,5 @@ void loop() {
// Call receive packets function (looping) to handle incoming serial packets.
// If a complete packet has been received it will call the callback function (onPacket).
deviceOne.receivePackets(onPacket);
// Small delay to not over overwork CPU.
delay(1);
}

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);
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() {
@@ -109,14 +94,6 @@ 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;
};