![](/media/cache/profiles/aa03f7d585b4ae5554378b5843a73d11.jpg.50x50_q85.png)
Experiment of serial command protocol
Dependencies: RingBuffer SerialInterfaceProtocol duinotech_16x2_LCD mbed
You can edit this area
Diff: CommandPacket.cpp
- Revision:
- 3:0c4aa3cec685
- Parent:
- 2:54932809c7b2
--- a/CommandPacket.cpp Thu Jun 09 12:28:31 2016 +0000 +++ b/CommandPacket.cpp Thu Jun 16 03:52:01 2016 +0000 @@ -47,7 +47,7 @@ bool CommandPacket::verify() { - return checksum == generate_checksum(payload, length); + return checksum == generate_checksum(); } CommandPacket::CommandPacket() @@ -67,24 +67,6 @@ const char *CommandPacket::getErrorString() const { return errorString[errno]; -} - -char *CommandPacket::getErrorCode() const -{ - // clear error code - memset(errorCode, 0x0, sizeof(errorCode)); - - // push into buffer - snprintf(errorCode, sizeof(errorCode), "%c%02x%02x%02x%02x%c", - sflag, - 0xe0 | (errno & 0x0f), - 0x1, - command, - 0x0, - eflag - ); - - return errorCode; } int CommandPacket::serialize(uint8_t *output) @@ -104,12 +86,34 @@ command, length, (char *) buffer, - generate_checksum(payload, length), + generate_checksum(), eflag ); return length; } - + +uint8_t CommandPacket::generate_checksum() +{ + // checksum is defined by the sum of all characters between sflag and checksum field + uint8_t s = 0; + + // include command + s += command; + + // include length + s += length; + + // include payload + for (int i = 0; i < length; i++) + { + s += payload[i]; + } + + // calculate two's complement of the remainder + s = 0xff - s + 1; + + return s; +}