RPC over Serial with read line interrupt tested on LPC1768 and mac minicom terminal. Baudrate 115200
Dependencies: mbed-rpc-stmfork mbed-src
Fork of rpc_over_serial by
Diff: main.cpp
- Revision:
- 3:4ed0d32d3b38
- Parent:
- 2:94d791a36afe
diff -r 94d791a36afe -r 4ed0d32d3b38 main.cpp --- a/main.cpp Fri Aug 01 21:54:31 2014 +0000 +++ b/main.cpp Mon Aug 04 16:51:10 2014 +0000 @@ -1,7 +1,13 @@ #include "mbed.h" #include "mbed_rpc.h" +#include "stmbed.h" -Serial pc(USBTX, USBRX); +//Serial pc(USBTX, USBRX); +//Serial pc(p29, p30); // stm32f103b +Serial pc(SERIAL_TX, SERIAL_RX); // stm32f103b PA_2 PA_3 +DigitalOut ld1(PA_5); +DigitalOut myled(LED1); + void Tx_interrupt(); void Rx_interrupt(); void send_line(); @@ -24,11 +30,25 @@ char rx_line[80]; - +void blink(){ + myled = 1; // LED is ON + wait(0.5); // 200 ms + myled = 0; // LED is OFF + wait(1.0); // 1 sec + } + int main() { - + ld1=0; + blink(); + blink(); + blink(); + char buf[256], outbuf[256]; - pc.baud(115200); + //pc.baud(115200); + pc.baud(9600); // nucleo F103RB + + // receive commands, and send back the responses + pc.printf(" ************** Serial RPC example starting ************************* \r\n"); // setup the classes that can be created dynamically // RPC::add_rpc_class<RpcAnalogIn>(); @@ -40,14 +60,14 @@ RPC::add_rpc_class<RpcTimer>(); RPC::add_rpc_class<RpcSPI>(); RPC::add_rpc_class<RpcSerial>(); + // receive commands, and send back the responses + pc.printf(" ************** 1 \r\n"); - // receive commands, and send back the responses - pc.printf(" ************** Serial RPC example starting ************************* \r\n"); // Setup a serial interrupt function to receive data pc.attach(&Rx_interrupt, Serial::RxIrq); // Setup a serial interrupt function to transmit data //pc.attach(&Tx_interrupt, Serial::TxIrq); - + pc.printf(" ************** 2 \r\n"); while(1) { // Read a line from the large rx buffer from rx interrupt routine @@ -80,17 +100,17 @@ bool empty; i = 0; // Start Critical Section - don't interrupt while changing global buffer variables - NVIC_DisableIRQ(UART1_IRQn); + NVIC_DisableIRQ(USART2_IRQn); empty = (tx_in == tx_out); while ((i==0) || (tx_line[i-1] != '\n')) { // Wait if buffer full if (((tx_in + 1) % buffer_size) == tx_out) { // End Critical Section - need to let interrupt routine empty buffer by sending - NVIC_EnableIRQ(UART1_IRQn); + NVIC_EnableIRQ(USART2_IRQn); while (((tx_in + 1) % buffer_size) == tx_out) { } // Start Critical Section - don't interrupt while changing global buffer variables - NVIC_DisableIRQ(UART1_IRQn); + NVIC_DisableIRQ(USART2_IRQn); } tx_buffer[tx_in] = tx_line[i]; i++; @@ -103,7 +123,7 @@ pc.putc(temp_char); } // End Critical Section - NVIC_EnableIRQ(UART1_IRQn); + NVIC_EnableIRQ(USART2_IRQn); return; } @@ -113,24 +133,24 @@ int i; i = 0; // Start Critical Section - don't interrupt while changing global buffer variables - NVIC_DisableIRQ(UART1_IRQn); + NVIC_DisableIRQ(USART2_IRQn); // stm32: USART2_IRQn lpc nxp: UART1_IRQn // Loop reading rx buffer characters until end of line character while ((i==0) || (rx_line[i-1] != '\r')) { // Wait if buffer empty if (rx_in == rx_out) { // End Critical Section - need to allow rx interrupt to get new characters for buffer - NVIC_EnableIRQ(UART1_IRQn); + NVIC_EnableIRQ(USART2_IRQn); while (rx_in == rx_out) { } // Start Critical Section - don't interrupt while changing global buffer variables - NVIC_DisableIRQ(UART1_IRQn); + NVIC_DisableIRQ(USART2_IRQn); } rx_line[i] = rx_buffer[rx_out]; i++; rx_out = (rx_out + 1) % buffer_size; } // End Critical Section - NVIC_EnableIRQ(UART1_IRQn); + NVIC_EnableIRQ(USART2_IRQn); rx_line[i-1] = 0; return; }