Just a small test for frames and serial (RS232) communication, with ideas from http://eli.thegreenplace.net/2009/08/20/frames-and-protocols-for-the-serial-port-in-python/

Dependencies:   mbed

Committer:
janwesterkamp
Date:
Wed May 02 06:01:00 2012 +0000
Revision:
0:566fc5f530fe

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
janwesterkamp 0:566fc5f530fe 1 #include "mbed.h"
janwesterkamp 0:566fc5f530fe 2 #include "parser.h"
janwesterkamp 0:566fc5f530fe 3 #include "string"
janwesterkamp 0:566fc5f530fe 4 #include "list"
janwesterkamp 0:566fc5f530fe 5
janwesterkamp 0:566fc5f530fe 6 Serial pc(USBTX, USBRX); // initialize RS232 via USB
janwesterkamp 0:566fc5f530fe 7
janwesterkamp 0:566fc5f530fe 8 DigitalOut prg_activity_led(LED1); // some LED to show activity
janwesterkamp 0:566fc5f530fe 9 DigitalOut rx_activity_led(LED2);
janwesterkamp 0:566fc5f530fe 10 DigitalOut tx_activity_led(LED3);
janwesterkamp 0:566fc5f530fe 11 DigitalOut message_led(LED4);
janwesterkamp 0:566fc5f530fe 12
janwesterkamp 0:566fc5f530fe 13 // we need some storage for the messages we want to send and receive
janwesterkamp 0:566fc5f530fe 14 string singleSendMessageBuffer;
janwesterkamp 0:566fc5f530fe 15 string singleReceiveMessageBuffer;
janwesterkamp 0:566fc5f530fe 16 // and a buffer for those messages, until they are processed
janwesterkamp 0:566fc5f530fe 17 list<string> sendMessagesBuffer;
janwesterkamp 0:566fc5f530fe 18 list<string> receiveMessagesBuffer;
janwesterkamp 0:566fc5f530fe 19
janwesterkamp 0:566fc5f530fe 20
janwesterkamp 0:566fc5f530fe 21 // Interupt Routine to read in data from serial port
janwesterkamp 0:566fc5f530fe 22 void Rx_interrupt() {
janwesterkamp 0:566fc5f530fe 23 rx_activity_led=!rx_activity_led;
janwesterkamp 0:566fc5f530fe 24 // Loop just in case more than one character is in UART's receive FIFO buffer
janwesterkamp 0:566fc5f530fe 25 while (pc.readable()) {
janwesterkamp 0:566fc5f530fe 26 char c = pc.getc();
janwesterkamp 0:566fc5f530fe 27 unwrap_protocol(&c, &singleReceiveMessageBuffer, &receiveMessagesBuffer);
janwesterkamp 0:566fc5f530fe 28 // pc.putc(c); // echo
janwesterkamp 0:566fc5f530fe 29 }
janwesterkamp 0:566fc5f530fe 30 return;
janwesterkamp 0:566fc5f530fe 31 }
janwesterkamp 0:566fc5f530fe 32
janwesterkamp 0:566fc5f530fe 33
janwesterkamp 0:566fc5f530fe 34 // Interupt Routine to write out data to serial port
janwesterkamp 0:566fc5f530fe 35 void Tx_interrupt() {
janwesterkamp 0:566fc5f530fe 36 char c;
janwesterkamp 0:566fc5f530fe 37 int finished = WRAP_SEND;
janwesterkamp 0:566fc5f530fe 38 int messageAvailable = !sendMessagesBuffer.empty();
janwesterkamp 0:566fc5f530fe 39
janwesterkamp 0:566fc5f530fe 40 tx_activity_led=!tx_activity_led;
janwesterkamp 0:566fc5f530fe 41
janwesterkamp 0:566fc5f530fe 42 // Loop to fill more than one character in UART's transmit FIFO buffer
janwesterkamp 0:566fc5f530fe 43 while ( pc.writeable() && messageAvailable && (finished == WRAP_SEND)) {
janwesterkamp 0:566fc5f530fe 44 finished = wrap_protocol( &c, &singleSendMessageBuffer, &sendMessagesBuffer );
janwesterkamp 0:566fc5f530fe 45 if (finished != WRAP_ABORT)
janwesterkamp 0:566fc5f530fe 46 pc.putc(c);
janwesterkamp 0:566fc5f530fe 47 }
janwesterkamp 0:566fc5f530fe 48
janwesterkamp 0:566fc5f530fe 49 //tx_activity_led=0;
janwesterkamp 0:566fc5f530fe 50 return;
janwesterkamp 0:566fc5f530fe 51 }
janwesterkamp 0:566fc5f530fe 52
janwesterkamp 0:566fc5f530fe 53
janwesterkamp 0:566fc5f530fe 54 int main() {
janwesterkamp 0:566fc5f530fe 55
janwesterkamp 0:566fc5f530fe 56 string sendString;
janwesterkamp 0:566fc5f530fe 57
janwesterkamp 0:566fc5f530fe 58 pc.baud(115200); // other high speed: 921600
janwesterkamp 0:566fc5f530fe 59
janwesterkamp 0:566fc5f530fe 60 // Setup a serial interrupt function to receive data
janwesterkamp 0:566fc5f530fe 61 pc.attach(&Rx_interrupt, Serial::RxIrq);
janwesterkamp 0:566fc5f530fe 62 // Setup a serial interrupt function to transmit data
janwesterkamp 0:566fc5f530fe 63 pc.attach(&Tx_interrupt, Serial::TxIrq);
janwesterkamp 0:566fc5f530fe 64 // enable interrupt
janwesterkamp 0:566fc5f530fe 65 NVIC_EnableIRQ(UART1_IRQn);
janwesterkamp 0:566fc5f530fe 66
janwesterkamp 0:566fc5f530fe 67 set_time(0); // needed to initialize rtc
janwesterkamp 0:566fc5f530fe 68
janwesterkamp 0:566fc5f530fe 69 while (1) {
janwesterkamp 0:566fc5f530fe 70 prg_activity_led = !prg_activity_led; // toggle LED
janwesterkamp 0:566fc5f530fe 71 time_t seconds = time(NULL); // get current time
janwesterkamp 0:566fc5f530fe 72
janwesterkamp 0:566fc5f530fe 73 //printf("Time as a string = %s\r\n", ctime(&seconds));
janwesterkamp 0:566fc5f530fe 74
janwesterkamp 0:566fc5f530fe 75 if (!receiveMessagesBuffer.empty()) {
janwesterkamp 0:566fc5f530fe 76 //pc.printf("\r\nMessage: %s\r\n", receiveMessagesBuffer.front().c_str());
janwesterkamp 0:566fc5f530fe 77
janwesterkamp 0:566fc5f530fe 78 sendString = "Message '";
janwesterkamp 0:566fc5f530fe 79 sendString += receiveMessagesBuffer.front().c_str();
janwesterkamp 0:566fc5f530fe 80 sendString += "' received at ";
janwesterkamp 0:566fc5f530fe 81 sendString += ctime(&seconds);
janwesterkamp 0:566fc5f530fe 82 sendString += "\r";
janwesterkamp 0:566fc5f530fe 83
janwesterkamp 0:566fc5f530fe 84 sendMessagesBuffer.push_back(sendString);
janwesterkamp 0:566fc5f530fe 85 receiveMessagesBuffer.pop_front();
janwesterkamp 0:566fc5f530fe 86
janwesterkamp 0:566fc5f530fe 87 } else {
janwesterkamp 0:566fc5f530fe 88 //sendString = "Hallo Welt!\r\n";
janwesterkamp 0:566fc5f530fe 89 sendString = ctime(&seconds);
janwesterkamp 0:566fc5f530fe 90 sendString += "\r";
janwesterkamp 0:566fc5f530fe 91 sendMessagesBuffer.push_back(sendString);
janwesterkamp 0:566fc5f530fe 92 }
janwesterkamp 0:566fc5f530fe 93
janwesterkamp 0:566fc5f530fe 94
janwesterkamp 0:566fc5f530fe 95 // trigger sending interrupt
janwesterkamp 0:566fc5f530fe 96 char c;
janwesterkamp 0:566fc5f530fe 97 int finished = wrap_protocol( &c, &singleSendMessageBuffer, &sendMessagesBuffer );
janwesterkamp 0:566fc5f530fe 98 if (finished != WRAP_ABORT)
janwesterkamp 0:566fc5f530fe 99 pc.putc(c);
janwesterkamp 0:566fc5f530fe 100
janwesterkamp 0:566fc5f530fe 101 wait(1); // wait and don't flood the RS232
janwesterkamp 0:566fc5f530fe 102 }
janwesterkamp 0:566fc5f530fe 103 }