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:
- begin - 0x12
- end - 0x13
- value separator - 0x10
- 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
SerialFlow.h@4:ebf658b28c5f, 2012-10-21 (annotated)
- 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?
User | Revision | Line number | New 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 | #ifndef MBED_SERIALFLOW_H |
Decimus | 1:5f80d8d44549 | 7 | #define MBED_SERIALFLOW_H |
Decimus | 3:7cbfd422c98e | 8 | |
Decimus | 3:7cbfd422c98e | 9 | // optional use of MODSERIAL |
Decimus | 4:ebf658b28c5f | 10 | #define USE_MODSERIAL |
Decimus | 3:7cbfd422c98e | 11 | |
Decimus | 1:5f80d8d44549 | 12 | #include "mbed.h" |
Decimus | 1:5f80d8d44549 | 13 | |
Decimus | 3:7cbfd422c98e | 14 | #ifdef USE_MODSERIAL |
Decimus | 3:7cbfd422c98e | 15 | #include "MODSERIAL.h" |
Decimus | 3:7cbfd422c98e | 16 | #endif |
Decimus | 3:7cbfd422c98e | 17 | |
Decimus | 3:7cbfd422c98e | 18 | #define MAX_PACKET_SIZE 10 |
Decimus | 3:7cbfd422c98e | 19 | #define RX_BUFFER_SIZE 32 |
Decimus | 3:7cbfd422c98e | 20 | #define TX_BUFFER_SIZE 32 |
Decimus | 1:5f80d8d44549 | 21 | |
Decimus | 1:5f80d8d44549 | 22 | class SerialFlow { |
Decimus | 1:5f80d8d44549 | 23 | |
Decimus | 1:5f80d8d44549 | 24 | public: |
Decimus | 1:5f80d8d44549 | 25 | /** Data format */ |
Decimus | 1:5f80d8d44549 | 26 | enum DataFormat { |
Decimus | 1:5f80d8d44549 | 27 | SIMPLE /**< Simple one byte (default) */ |
Decimus | 3:7cbfd422c98e | 28 | , COMPLEX /**< Packet of many short values */ |
Decimus | 1:5f80d8d44549 | 29 | }; |
Decimus | 1:5f80d8d44549 | 30 | |
Decimus | 1:5f80d8d44549 | 31 | SerialFlow(PinName tx, PinName rx); |
Decimus | 1:5f80d8d44549 | 32 | |
Decimus | 3:7cbfd422c98e | 33 | /** Set portal baud rate |
Decimus | 2:7868220b4fdf | 34 | * |
Decimus | 2:7868220b4fdf | 35 | * @param baud_rate Port baud rate. |
Decimus | 2:7868220b4fdf | 36 | */ |
Decimus | 2:7868220b4fdf | 37 | void baud(int baud_rate); |
Decimus | 2:7868220b4fdf | 38 | |
Decimus | 1:5f80d8d44549 | 39 | /** Set data packet format |
Decimus | 1:5f80d8d44549 | 40 | * |
Decimus | 1:5f80d8d44549 | 41 | * @param p_format Format type constant. |
Decimus | 1:5f80d8d44549 | 42 | * @param v_length Length of value in bytes. |
Decimus | 1:5f80d8d44549 | 43 | * @param p_size Number of values. |
Decimus | 1:5f80d8d44549 | 44 | */ |
Decimus | 1:5f80d8d44549 | 45 | void setPacketFormat(DataFormat p_format, char v_length, char p_size); |
Decimus | 1:5f80d8d44549 | 46 | |
Decimus | 1:5f80d8d44549 | 47 | /** Set value to data packet |
Decimus | 1:5f80d8d44549 | 48 | * |
Decimus | 1:5f80d8d44549 | 49 | * @param value Value. |
Decimus | 1:5f80d8d44549 | 50 | */ |
Decimus | 1:5f80d8d44549 | 51 | void setPacketValue(short value); |
Decimus | 1:5f80d8d44549 | 52 | |
Decimus | 1:5f80d8d44549 | 53 | /** Send packet to serial port |
Decimus | 1:5f80d8d44549 | 54 | */ |
Decimus | 3:7cbfd422c98e | 55 | bool sendPacket(); |
Decimus | 1:5f80d8d44549 | 56 | |
Decimus | 1:5f80d8d44549 | 57 | /** Receive packet from serial port |
Decimus | 1:5f80d8d44549 | 58 | */ |
Decimus | 1:5f80d8d44549 | 59 | bool receivePacket(); |
Decimus | 1:5f80d8d44549 | 60 | |
Decimus | 1:5f80d8d44549 | 61 | /** Get received packet |
Decimus | 1:5f80d8d44549 | 62 | * @param idx Index of value from packet. |
Decimus | 1:5f80d8d44549 | 63 | */ |
Decimus | 1:5f80d8d44549 | 64 | short getPacket( char idx ); |
Decimus | 1:5f80d8d44549 | 65 | |
Decimus | 1:5f80d8d44549 | 66 | protected: |
Decimus | 3:7cbfd422c98e | 67 | #ifdef USE_MODSERIAL |
Decimus | 3:7cbfd422c98e | 68 | MODSERIAL _serial; |
Decimus | 3:7cbfd422c98e | 69 | #else |
Decimus | 1:5f80d8d44549 | 70 | Serial _serial; |
Decimus | 3:7cbfd422c98e | 71 | #endif |
Decimus | 3:7cbfd422c98e | 72 | |
Decimus | 1:5f80d8d44549 | 73 | char _p_format; |
Decimus | 1:5f80d8d44549 | 74 | char _p_size; |
Decimus | 1:5f80d8d44549 | 75 | char _v_length; |
Decimus | 1:5f80d8d44549 | 76 | |
Decimus | 1:5f80d8d44549 | 77 | short _vs[MAX_PACKET_SIZE]; |
Decimus | 1:5f80d8d44549 | 78 | char _vs_idx; |
Decimus | 1:5f80d8d44549 | 79 | |
Decimus | 1:5f80d8d44549 | 80 | short _vr[MAX_PACKET_SIZE]; |
Decimus | 1:5f80d8d44549 | 81 | char _vr_val[2]; |
Decimus | 1:5f80d8d44549 | 82 | char _vr_idx; |
Decimus | 1:5f80d8d44549 | 83 | char _cr_idx; |
Decimus | 1:5f80d8d44549 | 84 | bool _escape; |
Decimus | 1:5f80d8d44549 | 85 | bool _collecting; |
Decimus | 1:5f80d8d44549 | 86 | }; |
Decimus | 1:5f80d8d44549 | 87 | |
Decimus | 1:5f80d8d44549 | 88 | #endif |