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/
main.cpp@0:566fc5f530fe, 2012-05-02 (annotated)
- Committer:
- janwesterkamp
- Date:
- Wed May 02 06:01:00 2012 +0000
- Revision:
- 0:566fc5f530fe
Who changed what in which revision?
User | Revision | Line number | New 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 | } |