FSST - Hardwarenahe Programmierung

Lösung SerialEvent

#include "mbed.h"

// ---------------- Serial RS232 Event Class  --------------------------
const uint8_t STRMAX = 20;  
const char EOT = '.';
const char CRLF = '\n';

class SerialEvent {
        Serial _pc;
        void _risingISR();
        char _str[STRMAX]; 
        volatile bool _strOkFlag;
        int _index;


    public:
        SerialEvent(PinName tx, PinName rx) : _pc(tx, rx) { // create the Serial on the pin specified to SwEvent
            _pc.attach(callback(this, &SerialEvent::pc_recv));        // attach DataReceive-function of this SerialEvent instance 
            _strOkFlag = false;
            _index=0;

        }
        void pc_recv();
        void getString(char st[]);
        int checkFlag();                                    // must in do-condition (while(true)-loop) continuously interrogated
};

// ---------------- Serial Event Class Methodes --------------------------
void SerialEvent::getString(char st[]) {
    for( int i=0; i <= _index; i++)
        st[i] = _str[i];
    _index=0;
}

void SerialEvent::pc_recv() {
    char c;
    while(_pc.readable()){
        c = _pc.getc();
        if((c != CRLF) && (_index < STRMAX)) {
            _str[_index++] = c;
        }
    }
    if(( c == EOT)) {           // end: . string not empty
        if(_index >= 1) {
            _strOkFlag = true;
            _str[--_index] = 0; 
        }
    }
}

int SerialEvent::checkFlag() {
    if( _strOkFlag ) {
        _strOkFlag = false; 
        return 1;
    }
    return 0;
}

SerialEvent se(USBTX, USBRX);
char str[STRMAX];

int main() {
    printf("Hello\n");
    while(1) {
        if(se.checkFlag()) {
            se.getString(str);
            printf("String: %s\n", str);
        }
}

All wikipages