app4

Dependencies:   mbed-rtos mbed CRC16

Fork of S5info_APP2 by Éric Bisson

uart.h

Committer:
ericbisson
Date:
2017-03-07
Revision:
25:d0c348c3c85d
Parent:
10:8b066285c2e0

File content as of revision 25:d0c348c3c85d:

#include <vector>
#include "mbed.h"
#include "CRC16.h"
using std::vector;

#define RETURN_EMPTYVECTOR(x) return vector<x>();
const char PREAMBULE =  0b01010101;
const char START =      0b01111110;
const char END =        0b01111110;
const char FLAGS =      0x00;
const char MAX_LENGTH = 80;
CRC16 mycrc16;

vector<char> uart_read(Serial& COM)
{
    vector<char> result;

    while (COM.readable())
    {
        result.push_back(COM.getc());
        wait_ms(1); // 9600 bits/secondes, donc ~0.1ms par bit
    }
    if (result.size() > 7)
    {
        // Validations de base
        if (result[0] != PREAMBULE || 
            result[1] != START ||
            result[2] != result.size() - 7 ||
            result.back() != END)
        {
            RETURN_EMPTYVECTOR(char);
        }
        
        // Calcul du CRC
        unsigned short currentCRC = result[result.size()-2] + result[result.size()-3]<<8;
        
        vector<char> charge_utile(&result[4], &result[result.size()-4]);
        
        if (currentCRC != mycrc16.calculateCRC16(&charge_utile[0], charge_utile.size()))
        {
            RETURN_EMPTYVECTOR(char);
        }
        
        return charge_utile;
    }
    RETURN_EMPTYVECTOR(char);
}