record adc values and send them to another uprocessor
Dependencies: BufferedSerial SDFileSystem mbed
Fork of SDFileSystem_HelloWorld by
serial_transfer.h@4:0e2980186bed, 2016-06-16 (annotated)
- Committer:
- patmcna
- Date:
- Thu Jun 16 21:17:30 2016 +0000
- Revision:
- 4:0e2980186bed
Organized into header files to keep main clean
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
patmcna | 4:0e2980186bed | 1 | #include "mbed.h" |
patmcna | 4:0e2980186bed | 2 | |
patmcna | 4:0e2980186bed | 3 | |
patmcna | 4:0e2980186bed | 4 | |
patmcna | 4:0e2980186bed | 5 | |
patmcna | 4:0e2980186bed | 6 | |
patmcna | 4:0e2980186bed | 7 | |
patmcna | 4:0e2980186bed | 8 | /************************************************************************ |
patmcna | 4:0e2980186bed | 9 | * Copy tx line buffer to large tx buffer for tx interrupt routine * |
patmcna | 4:0e2980186bed | 10 | ************************************************************************/ |
patmcna | 4:0e2980186bed | 11 | void send_line() |
patmcna | 4:0e2980186bed | 12 | { |
patmcna | 4:0e2980186bed | 13 | int i = 0; |
patmcna | 4:0e2980186bed | 14 | char temp_char; |
patmcna | 4:0e2980186bed | 15 | bool empty; |
patmcna | 4:0e2980186bed | 16 | |
patmcna | 4:0e2980186bed | 17 | __disable_irq(); //NVIC_DisableIRQ(UART1_IRQn);// Start Critical Section - don't interrupt while changing global buffer variables |
patmcna | 4:0e2980186bed | 18 | |
patmcna | 4:0e2980186bed | 19 | empty = (tx_in == tx_out); |
patmcna | 4:0e2980186bed | 20 | |
patmcna | 4:0e2980186bed | 21 | while ((i==0) || (tx_line[i-1] != '\n')) |
patmcna | 4:0e2980186bed | 22 | { |
patmcna | 4:0e2980186bed | 23 | |
patmcna | 4:0e2980186bed | 24 | if (((tx_in + 1) % buffer_size) == tx_out) // Wait if buffer full |
patmcna | 4:0e2980186bed | 25 | { |
patmcna | 4:0e2980186bed | 26 | __enable_irq(); //NVIC_EnableIRQ(UART1_IRQn);// End Critical Section - need to let interrupt routine empty buffer by sending |
patmcna | 4:0e2980186bed | 27 | while (((tx_in + 1) % buffer_size) == tx_out) |
patmcna | 4:0e2980186bed | 28 | { |
patmcna | 4:0e2980186bed | 29 | } |
patmcna | 4:0e2980186bed | 30 | |
patmcna | 4:0e2980186bed | 31 | __disable_irq(); //NVIC_DisableIRQ(UART1_IRQn); // Start Critical Section - don't interrupt while changing global buffer variables |
patmcna | 4:0e2980186bed | 32 | } |
patmcna | 4:0e2980186bed | 33 | |
patmcna | 4:0e2980186bed | 34 | tx_buffer[tx_in] = tx_line[i]; |
patmcna | 4:0e2980186bed | 35 | // if (tx_buffer[tx_in] == '\r'){pc.printf("returnline");} |
patmcna | 4:0e2980186bed | 36 | i++; |
patmcna | 4:0e2980186bed | 37 | tx_in = (tx_in + 1) % buffer_size; |
patmcna | 4:0e2980186bed | 38 | } |
patmcna | 4:0e2980186bed | 39 | |
patmcna | 4:0e2980186bed | 40 | if (uart1.writeable() && (empty)) |
patmcna | 4:0e2980186bed | 41 | { |
patmcna | 4:0e2980186bed | 42 | temp_char = tx_buffer[tx_out]; |
patmcna | 4:0e2980186bed | 43 | tx_out = (tx_out + 1) % buffer_size; |
patmcna | 4:0e2980186bed | 44 | |
patmcna | 4:0e2980186bed | 45 | |
patmcna | 4:0e2980186bed | 46 | uart1.putc(temp_char); // Send first character to start tx interrupts, if stopped |
patmcna | 4:0e2980186bed | 47 | |
patmcna | 4:0e2980186bed | 48 | // pc.printf("send command. Value: %c\r\n", temp_char); |
patmcna | 4:0e2980186bed | 49 | } |
patmcna | 4:0e2980186bed | 50 | |
patmcna | 4:0e2980186bed | 51 | __enable_irq(); //NVIC_EnableIRQ(UART1_IRQn); // End Critical Section |
patmcna | 4:0e2980186bed | 52 | return; |
patmcna | 4:0e2980186bed | 53 | } |
patmcna | 4:0e2980186bed | 54 | |
patmcna | 4:0e2980186bed | 55 | |
patmcna | 4:0e2980186bed | 56 | |
patmcna | 4:0e2980186bed | 57 | /************************************************************************ |
patmcna | 4:0e2980186bed | 58 | * Read a line from the large rx buffer from rx interrupt routine * |
patmcna | 4:0e2980186bed | 59 | ************************************************************************/ |
patmcna | 4:0e2980186bed | 60 | void read_line() |
patmcna | 4:0e2980186bed | 61 | { |
patmcna | 4:0e2980186bed | 62 | int i = 0; |
patmcna | 4:0e2980186bed | 63 | |
patmcna | 4:0e2980186bed | 64 | __disable_irq(); //NVIC_DisableIRQ(UART1_IRQn); // Start Critical Section - don't interrupt while changing global buffer variables |
patmcna | 4:0e2980186bed | 65 | while ((i==0) || (rx_line[i-1] != '\r')) // Loop reading rx buffer characters until end of line character |
patmcna | 4:0e2980186bed | 66 | { |
patmcna | 4:0e2980186bed | 67 | if (rx_in == rx_out) // Wait if buffer empty |
patmcna | 4:0e2980186bed | 68 | { |
patmcna | 4:0e2980186bed | 69 | __enable_irq(); //NVIC_EnableIRQ(UART1_IRQn); // End Critical Section - need to allow rx interrupt to get new characters for buffer |
patmcna | 4:0e2980186bed | 70 | |
patmcna | 4:0e2980186bed | 71 | while (rx_in == rx_out) |
patmcna | 4:0e2980186bed | 72 | { |
patmcna | 4:0e2980186bed | 73 | } |
patmcna | 4:0e2980186bed | 74 | __disable_irq(); //NVIC_DisableIRQ(UART1_IRQn); // Start Critical Section - don't interrupt while changing global buffer variables |
patmcna | 4:0e2980186bed | 75 | } |
patmcna | 4:0e2980186bed | 76 | |
patmcna | 4:0e2980186bed | 77 | rx_line[i] = rx_buffer[rx_out]; |
patmcna | 4:0e2980186bed | 78 | |
patmcna | 4:0e2980186bed | 79 | i++; |
patmcna | 4:0e2980186bed | 80 | rx_out = (rx_out + 1) % buffer_size; |
patmcna | 4:0e2980186bed | 81 | } |
patmcna | 4:0e2980186bed | 82 | |
patmcna | 4:0e2980186bed | 83 | __enable_irq(); //NVIC_EnableIRQ(UART1_IRQn); // End Critical Section |
patmcna | 4:0e2980186bed | 84 | |
patmcna | 4:0e2980186bed | 85 | strcat(squibCLT_array3,rx_line); |
patmcna | 4:0e2980186bed | 86 | |
patmcna | 4:0e2980186bed | 87 | rx_line[i-1] = 0; |
patmcna | 4:0e2980186bed | 88 | |
patmcna | 4:0e2980186bed | 89 | return; |
patmcna | 4:0e2980186bed | 90 | } |
patmcna | 4:0e2980186bed | 91 | |
patmcna | 4:0e2980186bed | 92 | |
patmcna | 4:0e2980186bed | 93 | |
patmcna | 4:0e2980186bed | 94 | /************************************************************************ |
patmcna | 4:0e2980186bed | 95 | * Interupt Routine to read in data from serial port * |
patmcna | 4:0e2980186bed | 96 | ************************************************************************/ |
patmcna | 4:0e2980186bed | 97 | void Rx_interrupt() |
patmcna | 4:0e2980186bed | 98 | { |
patmcna | 4:0e2980186bed | 99 | |
patmcna | 4:0e2980186bed | 100 | while ((uart2.readable()) && (((rx_in + 1) % buffer_size) != rx_out)) // Loop just in case more than one character is in UART's receive FIFO buffer |
patmcna | 4:0e2980186bed | 101 | // Stop if buffer full |
patmcna | 4:0e2980186bed | 102 | { |
patmcna | 4:0e2980186bed | 103 | rx_buffer[rx_in] = uart2.getc(); |
patmcna | 4:0e2980186bed | 104 | // pc.putc(rx_buffer[rx_in]); // Uncomment to Echo to USB serial to watch data flow |
patmcna | 4:0e2980186bed | 105 | rx_in = (rx_in + 1) % buffer_size; |
patmcna | 4:0e2980186bed | 106 | |
patmcna | 4:0e2980186bed | 107 | } |
patmcna | 4:0e2980186bed | 108 | |
patmcna | 4:0e2980186bed | 109 | rxInterruptCount++; |
patmcna | 4:0e2980186bed | 110 | return; |
patmcna | 4:0e2980186bed | 111 | } |
patmcna | 4:0e2980186bed | 112 | |
patmcna | 4:0e2980186bed | 113 | |
patmcna | 4:0e2980186bed | 114 | |
patmcna | 4:0e2980186bed | 115 | /************************************************************************ |
patmcna | 4:0e2980186bed | 116 | * Interupt Routine to write out data to serial port * |
patmcna | 4:0e2980186bed | 117 | ************************************************************************/ |
patmcna | 4:0e2980186bed | 118 | void Tx_interrupt() |
patmcna | 4:0e2980186bed | 119 | { |
patmcna | 4:0e2980186bed | 120 | while ((uart1.writeable()) && (tx_in != tx_out)) // Loop to fill more than one character in UART's transmit FIFO buffer // Stop if buffer empty |
patmcna | 4:0e2980186bed | 121 | { |
patmcna | 4:0e2980186bed | 122 | |
patmcna | 4:0e2980186bed | 123 | uart1.putc(tx_buffer[tx_out]); |
patmcna | 4:0e2980186bed | 124 | tx_out = (tx_out + 1) % buffer_size; |
patmcna | 4:0e2980186bed | 125 | } |
patmcna | 4:0e2980186bed | 126 | |
patmcna | 4:0e2980186bed | 127 | return; |
patmcna | 4:0e2980186bed | 128 | } |
patmcna | 4:0e2980186bed | 129 | |
patmcna | 4:0e2980186bed | 130 | |
patmcna | 4:0e2980186bed | 131 | |
patmcna | 4:0e2980186bed | 132 | |
patmcna | 4:0e2980186bed | 133 | /************************************************************************ |
patmcna | 4:0e2980186bed | 134 | * copies sd card array to serial buffer and sends it over buffer |
patmcna | 4:0e2980186bed | 135 | * |
patmcna | 4:0e2980186bed | 136 | ************************************************************************/ |
patmcna | 4:0e2980186bed | 137 | void sendSdCardDataOverSerial() |
patmcna | 4:0e2980186bed | 138 | { |
patmcna | 4:0e2980186bed | 139 | Timer timer; |
patmcna | 4:0e2980186bed | 140 | int begin, end; |
patmcna | 4:0e2980186bed | 141 | |
patmcna | 4:0e2980186bed | 142 | pc.printf("Sending over serial..."); |
patmcna | 4:0e2980186bed | 143 | |
patmcna | 4:0e2980186bed | 144 | timer.start(); |
patmcna | 4:0e2980186bed | 145 | begin = timer.read_us(); |
patmcna | 4:0e2980186bed | 146 | |
patmcna | 4:0e2980186bed | 147 | for (int i = 0; i < arrayCount; i++) |
patmcna | 4:0e2980186bed | 148 | { |
patmcna | 4:0e2980186bed | 149 | sprintf(tx_line, "%.6f\r\n]", squibCLT_array2[i]); |
patmcna | 4:0e2980186bed | 150 | send_line(); |
patmcna | 4:0e2980186bed | 151 | } |
patmcna | 4:0e2980186bed | 152 | |
patmcna | 4:0e2980186bed | 153 | end = timer.read_us(); |
patmcna | 4:0e2980186bed | 154 | |
patmcna | 4:0e2980186bed | 155 | pc.printf("Done.\r\n"); |
patmcna | 4:0e2980186bed | 156 | |
patmcna | 4:0e2980186bed | 157 | pc.printf("Transmit took %d microseconds to complete.\r\n", end - begin); |
patmcna | 4:0e2980186bed | 158 | } |
patmcna | 4:0e2980186bed | 159 | |
patmcna | 4:0e2980186bed | 160 | |
patmcna | 4:0e2980186bed | 161 | |
patmcna | 4:0e2980186bed | 162 | /************************************************************************ |
patmcna | 4:0e2980186bed | 163 | * handles receiving data and storing it back into local memory |
patmcna | 4:0e2980186bed | 164 | * |
patmcna | 4:0e2980186bed | 165 | ************************************************************************/ |
patmcna | 4:0e2980186bed | 166 | void receiveSdCardDataOverSerial() |
patmcna | 4:0e2980186bed | 167 | { |
patmcna | 4:0e2980186bed | 168 | Timer timer; |
patmcna | 4:0e2980186bed | 169 | int begin, end; |
patmcna | 4:0e2980186bed | 170 | |
patmcna | 4:0e2980186bed | 171 | pc.printf("Receiving over serial..."); |
patmcna | 4:0e2980186bed | 172 | |
patmcna | 4:0e2980186bed | 173 | timer.start(); |
patmcna | 4:0e2980186bed | 174 | begin = timer.read_us(); |
patmcna | 4:0e2980186bed | 175 | |
patmcna | 4:0e2980186bed | 176 | for (int i = 0; i < arrayCount; i++) |
patmcna | 4:0e2980186bed | 177 | { |
patmcna | 4:0e2980186bed | 178 | // for some reason you have to use this function to read in everything being sent instead of relying on the interrupt service exclusively |
patmcna | 4:0e2980186bed | 179 | read_line(); |
patmcna | 4:0e2980186bed | 180 | //sprintf(squib_test, "%s", rx_line); |
patmcna | 4:0e2980186bed | 181 | } |
patmcna | 4:0e2980186bed | 182 | end = timer.read_us(); |
patmcna | 4:0e2980186bed | 183 | |
patmcna | 4:0e2980186bed | 184 | pc.printf("Done.\r\n"); |
patmcna | 4:0e2980186bed | 185 | |
patmcna | 4:0e2980186bed | 186 | pc.printf("Receive took %d microseconds to complete.\r\n", end - begin); |
patmcna | 4:0e2980186bed | 187 | } |
patmcna | 4:0e2980186bed | 188 |