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-12
- Revision:
- 3:dd947d95765a
- Parent:
- 1:a28d64ee7a79
File content as of revision 3:dd947d95765a:
#include "SerialMultiByte.h"
SerialMultiByte::SerialMultiByte(PinName tx, PinName rx) :
RawSerial(tx, rx),
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;
data = new uint8_t[bufferSize];
thread.start(callback(this, &SerialMultiByte::receiveLoop));
// ticker.attach(callback(this, &SerialMultiByte::receiveLoop),1.0/200.0);
attach(callback(this, &SerialMultiByte::receiveByte));
}
void SerialMultiByte::receiveLoop()
{
while(true) {
if(buffer.size() > bufferSize) {
if(buffer[0] == header[0] && buffer[1] == header[1]) {
checkData();
buffer.erase(buffer.begin(), buffer.begin() + (bufferSize - 1));
} else {
buffer.erase(buffer.begin());
}
}
}
}
void SerialMultiByte::receiveByte()
{
buffer.push_back(getc());
}
void SerialMultiByte::checkData()
{
uint8_t checksum = 0x00;
for(int i = 2; i < bufferSize - 1; i++) {
checksum += buffer[i];
}
if(checksum == buffer[bufferSize - 1]) {
myled = !myled;
for(int i = 2; i < bufferSize - 1; i++) {
data[i-2] = buffer[i];
}
}
}
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);
}