Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Nucleo_NHK_2018_syudo_wheel a_team_R1370 Nucleo_NHK_2018_syudo_wheel 2018NHK_gaku_ver2 ... more
SerialMultiByte.cpp
- Committer:
- tanabe2000
- Date:
- 2018-09-13
- Revision:
- 4:31dbd7ea393b
- Parent:
- 2:a14ba6b3f198
- Child:
- 5:4109001829fe
- Child:
- 6:7f87c3ff29ef
File content as of revision 4:31dbd7ea393b:
#include "SerialMultiByte.h"
SerialMultiByte::SerialMultiByte(PinName tx, PinName rx) :
RawSerial(tx, rx),
debug(USBTX,USBRX, 115200),
myled(LED1)
{
header[0] = DEFAULT_FIRST_HEADER;
header[1] = DEFAULT_SECOND_HEADER;
}
void SerialMultiByte::setHeaders(uint8_t firstHeader, uint8_t secondHeader)
{
header[0] = firstHeader;
header[1] = secondHeader;
}
void SerialMultiByte::setHeaders(uint8_t headers[])
{
header[0] = headers[0];
header[1] = headers[1];
}
void SerialMultiByte::startReceive(uint16_t dataSize)
{
bufferSize = dataSize + 3;
bufferPoint = 0;
receivedBytes = 0;
buffer = new uint8_t[bufferSize];
data = new uint8_t[dataSize];
attach(callback(this, &SerialMultiByte::receiveByte));
}
void SerialMultiByte::receiveByte()
{
buffer[bufferPoint % bufferSize] = getc();
if(bufferPoint != 0xff) {
++bufferPoint;
} else {
bufferPoint = 0;
}
++receivedBytes;
if(receivedBytes >= bufferSize) checkData();
}
void SerialMultiByte::checkData()
{
for(int i = 0; i < bufferSize; i++) {
if(buffer[i % bufferSize] == header[0] && buffer[(i + 1) % bufferSize] == header[1]) {
uint8_t checksum = 0x00;
for(int j = 0; j < bufferSize - 3; j++) {
checksum += buffer[(i + 2 + j)% bufferSize];
}
if(checksum == buffer[(i + bufferSize - 1)% bufferSize]) {
myled = !myled;
for(int j = 0; j < bufferSize - 3; j++) {
data[j] = buffer[(i + 2 + j) % bufferSize];
}
receivedBytes = 0;
return;
}
}
}
}
void SerialMultiByte::getData(uint8_t data_[])
{
for(int i = 0; i < bufferSize - 3; i++) {
data_[i] = data[i];
}
}
void SerialMultiByte::sendData(uint8_t data_[], uint16_t length)
{
uint8_t checksum = 0x00;
for(int i = 0; i < length; i++) {
checksum += data_[i];
}
putc(header[0]);
putc(header[1]);
for(int i = 0; i < length; i++) {
putc(data_[i]);
}
putc(checksum);
}