SerialFlow allows to send and receive packaged arrays of integer values via serial port.

SerialFlow allows to send and receive packaged arrays of integer(short only) values via serial port.

Packet format:

  1. begin - 0x12
  2. end - 0x13
  3. value separator - 0x10
  4. escape - 0x7D

Simple packet example:
0x12,0x1,0x0,0x10,0x7D,0x12,0x0,0x13
corresponds to: [1,18]

Now handles only short int values. Example:

#include "mbed.h"
#include "SerialFlow.h"
SerialFlow pc(USBTX, USBRX);
AnalogIn gyro_x(p17); // data from gyro x axis
AnalogIn gyro_y(p18); // data from gyro y axis

int main(){
    // two short values
    pc.setPacketFormat(SerialFlow::COMPLEX_1, 2, 2);
    while(1){
        pc.setPacketValue((short)(gyro_x*1023.0));
        pc.setPacketValue((short)(gyro_y*1023.0));
        pc.sendPacket();
        wait(0.01);
    }
}

On the PC side you can use this program to catch data flows: http://www.poprobot.ru/files/sfmonitor_0.9.zip

Committer:
Decimus
Date:
Sun Oct 21 17:40:25 2012 +0000
Revision:
4:ebf658b28c5f
Parent:
3:7cbfd422c98e
USE_MODSERIAL flag is on by default

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Decimus 1:5f80d8d44549 1 /* mbed Serial Flow Library
Decimus 1:5f80d8d44549 2 * Copyright (c) 2012 Oleg Evsegneev
Decimus 3:7cbfd422c98e 3 * Released under the MIT License: http://mbed.org/license/mit
Decimus 1:5f80d8d44549 4 */
Decimus 1:5f80d8d44549 5
Decimus 1:5f80d8d44549 6 #include "SerialFlow.h"
Decimus 1:5f80d8d44549 7 #include "mbed.h"
Decimus 1:5f80d8d44549 8
Decimus 3:7cbfd422c98e 9 #ifdef USE_MODSERIAL
Decimus 3:7cbfd422c98e 10 SerialFlow::SerialFlow(PinName tx, PinName rx): _serial(tx, rx, TX_BUFFER_SIZE, RX_BUFFER_SIZE) {
Decimus 3:7cbfd422c98e 11 #else
Decimus 1:5f80d8d44549 12 SerialFlow::SerialFlow(PinName tx, PinName rx): _serial(tx, rx) {
Decimus 3:7cbfd422c98e 13 #endif
Decimus 1:5f80d8d44549 14 _escape = 0;
Decimus 1:5f80d8d44549 15 _collecting = 0;
Decimus 1:5f80d8d44549 16 }
Decimus 1:5f80d8d44549 17
Decimus 2:7868220b4fdf 18 void SerialFlow::baud(int baud_rate) {
Decimus 2:7868220b4fdf 19 _serial.baud(baud_rate);
Decimus 2:7868220b4fdf 20 }
Decimus 2:7868220b4fdf 21
Decimus 1:5f80d8d44549 22 void SerialFlow::setPacketFormat(DataFormat p_format, char v_length, char p_size) {
Decimus 1:5f80d8d44549 23 _p_format = p_format;
Decimus 3:7cbfd422c98e 24 _v_length = v_length;
Decimus 1:5f80d8d44549 25 _p_size = p_size;
Decimus 1:5f80d8d44549 26 _vs_idx = 0;
Decimus 1:5f80d8d44549 27 _vr_idx = 0;
Decimus 1:5f80d8d44549 28 }
Decimus 1:5f80d8d44549 29
Decimus 1:5f80d8d44549 30 void SerialFlow::setPacketValue(short value) {
Decimus 1:5f80d8d44549 31 if( _vs_idx < _p_size ){
Decimus 1:5f80d8d44549 32 _vs[_vs_idx++] = value;
Decimus 1:5f80d8d44549 33 }
Decimus 1:5f80d8d44549 34 }
Decimus 1:5f80d8d44549 35
Decimus 3:7cbfd422c98e 36 bool SerialFlow::sendPacket() {
Decimus 1:5f80d8d44549 37 char v;
Decimus 3:7cbfd422c98e 38 if( !_serial.writeable() ){
Decimus 3:7cbfd422c98e 39 _vs_idx = 0;
Decimus 3:7cbfd422c98e 40 return 0;
Decimus 3:7cbfd422c98e 41 }
Decimus 3:7cbfd422c98e 42
Decimus 1:5f80d8d44549 43 _serial.putc( 0x12 );
Decimus 3:7cbfd422c98e 44 for( char i=0; i<_vs_idx; i++ ){
Decimus 1:5f80d8d44549 45 // low byte
Decimus 1:5f80d8d44549 46 v = _vs[i] & 0xFF;
Decimus 1:5f80d8d44549 47 if( v==0x12 || v==0x13 || v==0x7D || v==0x10 )
Decimus 1:5f80d8d44549 48 _serial.putc( 0x7D );
Decimus 1:5f80d8d44549 49 _serial.putc( v );
Decimus 1:5f80d8d44549 50
Decimus 1:5f80d8d44549 51 // high byte
Decimus 1:5f80d8d44549 52 v = (_vs[i]>>8) & 0xFF;
Decimus 1:5f80d8d44549 53 if( v==0x12 || v==0x13 || v==0x7D || v==0x10 )
Decimus 1:5f80d8d44549 54 _serial.putc( 0x7D );
Decimus 1:5f80d8d44549 55 _serial.putc( v );
Decimus 1:5f80d8d44549 56
Decimus 1:5f80d8d44549 57 // separate values
Decimus 3:7cbfd422c98e 58 if( i<_vs_idx-1 )
Decimus 1:5f80d8d44549 59 _serial.putc(0x10);
Decimus 1:5f80d8d44549 60 }
Decimus 1:5f80d8d44549 61
Decimus 1:5f80d8d44549 62 _serial.putc( 0x13 );
Decimus 1:5f80d8d44549 63 _vs_idx = 0;
Decimus 3:7cbfd422c98e 64 return 1;
Decimus 1:5f80d8d44549 65 }
Decimus 1:5f80d8d44549 66
Decimus 1:5f80d8d44549 67 bool SerialFlow::receivePacket() {
Decimus 1:5f80d8d44549 68 char c;
Decimus 1:5f80d8d44549 69 while( _serial.readable() ){
Decimus 1:5f80d8d44549 70 c = _serial.getc();
Decimus 1:5f80d8d44549 71 if( _collecting )
Decimus 1:5f80d8d44549 72 if( _escape ){
Decimus 1:5f80d8d44549 73 _vr_val[_cr_idx++] = c;
Decimus 1:5f80d8d44549 74 _escape = 0;
Decimus 1:5f80d8d44549 75 }
Decimus 1:5f80d8d44549 76 // escape
Decimus 1:5f80d8d44549 77 else if( c == 0x7D ){
Decimus 1:5f80d8d44549 78 _escape = 1;
Decimus 1:5f80d8d44549 79 }
Decimus 1:5f80d8d44549 80 // value separator
Decimus 1:5f80d8d44549 81 else if( c == 0x10 ){
Decimus 1:5f80d8d44549 82 _vr[_vr_idx++] = _vr_val[0] | (_vr_val[1] << 8);
Decimus 1:5f80d8d44549 83 _cr_idx = 0;
Decimus 1:5f80d8d44549 84 }
Decimus 1:5f80d8d44549 85 // end
Decimus 1:5f80d8d44549 86 else if( c == 0x13 ){
Decimus 1:5f80d8d44549 87 _vr[_vr_idx++] = _vr_val[0] | (_vr_val[1] << 8);
Decimus 1:5f80d8d44549 88 _collecting = 0;
Decimus 1:5f80d8d44549 89 return 1;
Decimus 1:5f80d8d44549 90 }
Decimus 1:5f80d8d44549 91 else{
Decimus 1:5f80d8d44549 92 _vr_val[_cr_idx++] = c;
Decimus 1:5f80d8d44549 93 }
Decimus 1:5f80d8d44549 94 // begin
Decimus 1:5f80d8d44549 95 else if( c == 0x12 ){
Decimus 1:5f80d8d44549 96 _collecting = 1;
Decimus 1:5f80d8d44549 97 _cr_idx = 0;
Decimus 1:5f80d8d44549 98 _vr_idx = 0;
Decimus 1:5f80d8d44549 99 }
Decimus 1:5f80d8d44549 100 }
Decimus 1:5f80d8d44549 101 return 0;
Decimus 1:5f80d8d44549 102 }
Decimus 1:5f80d8d44549 103
Decimus 1:5f80d8d44549 104 short SerialFlow::getPacket( char idx ) {
Decimus 1:5f80d8d44549 105 return _vr[idx];
Decimus 1:5f80d8d44549 106 }