Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
soft_uart.cpp@5:46a732673cc5, 2022-03-26 (annotated)
- Committer:
- Giamarchi
- Date:
- Sat Mar 26 09:26:26 2022 +0000
- Revision:
- 5:46a732673cc5
Programme de dialogue entre un PC et un Smartphone en Bluetooth
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| Giamarchi | 5:46a732673cc5 | 1 | // UART.C | 
| Giamarchi | 5:46a732673cc5 | 2 | // | 
| Giamarchi | 5:46a732673cc5 | 3 | // Generic software uart written in C, requiring a timer set to 3 times | 
| Giamarchi | 5:46a732673cc5 | 4 | // the baud rate, and two software read/write pins for the receive and | 
| Giamarchi | 5:46a732673cc5 | 5 | // transmit functions. | 
| Giamarchi | 5:46a732673cc5 | 6 | // | 
| Giamarchi | 5:46a732673cc5 | 7 | // * Received characters are buffered | 
| Giamarchi | 5:46a732673cc5 | 8 | // * putchar(), getchar(), kbhit() and flush_input_buffer() are available | 
| Giamarchi | 5:46a732673cc5 | 9 | // * There is a facility for background processing while waiting for input | 
| Giamarchi | 5:46a732673cc5 | 10 | // | 
| Giamarchi | 5:46a732673cc5 | 11 | // Colin Gittins, Software Engineer, Halliburton Energy Services | 
| Giamarchi | 5:46a732673cc5 | 12 | // | 
| Giamarchi | 5:46a732673cc5 | 13 | // The baud rate can be configured by changing the BAUD_RATE macro as | 
| Giamarchi | 5:46a732673cc5 | 14 | // follows: | 
| Giamarchi | 5:46a732673cc5 | 15 | // | 
| Giamarchi | 5:46a732673cc5 | 16 | // #define BAUD_RATE 19200.0 | 
| Giamarchi | 5:46a732673cc5 | 17 | // | 
| Giamarchi | 5:46a732673cc5 | 18 | // The function init_uart() must be called before any comms can take place | 
| Giamarchi | 5:46a732673cc5 | 19 | // | 
| Giamarchi | 5:46a732673cc5 | 20 | // Interface routines required: | 
| Giamarchi | 5:46a732673cc5 | 21 | // 1. get_rx_pin_status() | 
| Giamarchi | 5:46a732673cc5 | 22 | // Returns 0 or 1 dependent on whether the receive pin is high or low. | 
| Giamarchi | 5:46a732673cc5 | 23 | // 2. set_tx_pin_high() | 
| Giamarchi | 5:46a732673cc5 | 24 | // Sets the transmit pin to the high state. | 
| Giamarchi | 5:46a732673cc5 | 25 | // 3. set_tx_pin_low() | 
| Giamarchi | 5:46a732673cc5 | 26 | // Sets the transmit pin to the low state. | 
| Giamarchi | 5:46a732673cc5 | 27 | // 4. idle() | 
| Giamarchi | 5:46a732673cc5 | 28 | // Background functions to execute while waiting for input. | 
| Giamarchi | 5:46a732673cc5 | 29 | // 5. timer_set( BAUD_RATE ) | 
| Giamarchi | 5:46a732673cc5 | 30 | // Sets the timer to 3 times the baud rate. | 
| Giamarchi | 5:46a732673cc5 | 31 | // 6. set_timer_interrupt( timer_isr ) | 
| Giamarchi | 5:46a732673cc5 | 32 | // Enables the timer interrupt. | 
| Giamarchi | 5:46a732673cc5 | 33 | // | 
| Giamarchi | 5:46a732673cc5 | 34 | // Functions provided: | 
| Giamarchi | 5:46a732673cc5 | 35 | // 1. void flush_input_buffer( void ) | 
| Giamarchi | 5:46a732673cc5 | 36 | // Clears the contents of the input buffer. | 
| Giamarchi | 5:46a732673cc5 | 37 | // 2. char kbhit( void ) | 
| Giamarchi | 5:46a732673cc5 | 38 | // Tests whether an input character has been received. | 
| Giamarchi | 5:46a732673cc5 | 39 | // 3. char getchar( void ) | 
| Giamarchi | 5:46a732673cc5 | 40 | // Reads a character from the input buffer, waiting if necessary. | 
| Giamarchi | 5:46a732673cc5 | 41 | // 4. void turn_rx_on( void ) | 
| Giamarchi | 5:46a732673cc5 | 42 | // Turns on the receive function. | 
| Giamarchi | 5:46a732673cc5 | 43 | // 5. void turn_rx_off( void ) | 
| Giamarchi | 5:46a732673cc5 | 44 | // Turns off the receive function. | 
| Giamarchi | 5:46a732673cc5 | 45 | // 6. void putchar( char ) | 
| Giamarchi | 5:46a732673cc5 | 46 | // Writes a character to the serial port. | 
| Giamarchi | 5:46a732673cc5 | 47 | #include "mbed.h" | 
| Giamarchi | 5:46a732673cc5 | 48 | #include <stdio.h> | 
| Giamarchi | 5:46a732673cc5 | 49 | |
| Giamarchi | 5:46a732673cc5 | 50 | #define BAUD_RATE 9600 | 
| Giamarchi | 5:46a732673cc5 | 51 | #define IN_BUF_SIZE 256 | 
| Giamarchi | 5:46a732673cc5 | 52 | |
| Giamarchi | 5:46a732673cc5 | 53 | #define TRUE 1 | 
| Giamarchi | 5:46a732673cc5 | 54 | #define FALSE 0 | 
| Giamarchi | 5:46a732673cc5 | 55 | |
| Giamarchi | 5:46a732673cc5 | 56 | static unsigned char inbuf[IN_BUF_SIZE]; | 
| Giamarchi | 5:46a732673cc5 | 57 | static unsigned char qin = 0; | 
| Giamarchi | 5:46a732673cc5 | 58 | static unsigned char qout = 0; | 
| Giamarchi | 5:46a732673cc5 | 59 | |
| Giamarchi | 5:46a732673cc5 | 60 | static char flag_rx_waiting_for_stop_bit; | 
| Giamarchi | 5:46a732673cc5 | 61 | static char flag_rx_off; | 
| Giamarchi | 5:46a732673cc5 | 62 | static char rx_mask; | 
| Giamarchi | 5:46a732673cc5 | 63 | static char flag_rx_ready; | 
| Giamarchi | 5:46a732673cc5 | 64 | static char flag_tx_ready; | 
| Giamarchi | 5:46a732673cc5 | 65 | static char timer_rx_ctr; | 
| Giamarchi | 5:46a732673cc5 | 66 | static char timer_tx_ctr; | 
| Giamarchi | 5:46a732673cc5 | 67 | static char bits_left_in_rx; | 
| Giamarchi | 5:46a732673cc5 | 68 | static char bits_left_in_tx; | 
| Giamarchi | 5:46a732673cc5 | 69 | static char rx_num_of_bits; | 
| Giamarchi | 5:46a732673cc5 | 70 | static char tx_num_of_bits; | 
| Giamarchi | 5:46a732673cc5 | 71 | static int internal_rx_buffer; | 
| Giamarchi | 5:46a732673cc5 | 72 | static int internal_tx_buffer; | 
| Giamarchi | 5:46a732673cc5 | 73 | static int user_tx_buffer; | 
| Giamarchi | 5:46a732673cc5 | 74 | |
| Giamarchi | 5:46a732673cc5 | 75 | DigitalOut TX(PA_6); | 
| Giamarchi | 5:46a732673cc5 | 76 | DigitalIn RX(PA_7); | 
| Giamarchi | 5:46a732673cc5 | 77 | Ticker ticker; | 
| Giamarchi | 5:46a732673cc5 | 78 | |
| Giamarchi | 5:46a732673cc5 | 79 | //Background functions to execute while waiting for input. | 
| Giamarchi | 5:46a732673cc5 | 80 | void idle(){ | 
| Giamarchi | 5:46a732673cc5 | 81 | wait_us(0.2); | 
| Giamarchi | 5:46a732673cc5 | 82 | } | 
| Giamarchi | 5:46a732673cc5 | 83 | |
| Giamarchi | 5:46a732673cc5 | 84 | //Sets the transmit pin to the high state. | 
| Giamarchi | 5:46a732673cc5 | 85 | void set_tx_pin_high() { | 
| Giamarchi | 5:46a732673cc5 | 86 | TX = 1; | 
| Giamarchi | 5:46a732673cc5 | 87 | } | 
| Giamarchi | 5:46a732673cc5 | 88 | |
| Giamarchi | 5:46a732673cc5 | 89 | //Sets the transmit pin to the low state. | 
| Giamarchi | 5:46a732673cc5 | 90 | void set_tx_pin_low() { | 
| Giamarchi | 5:46a732673cc5 | 91 | TX = 0; | 
| Giamarchi | 5:46a732673cc5 | 92 | } | 
| Giamarchi | 5:46a732673cc5 | 93 | |
| Giamarchi | 5:46a732673cc5 | 94 | //Returns 0 or 1 dependent on whether the receive pin is high or low | 
| Giamarchi | 5:46a732673cc5 | 95 | int get_rx_pin_status() { | 
| Giamarchi | 5:46a732673cc5 | 96 | return RX.read(); | 
| Giamarchi | 5:46a732673cc5 | 97 | } | 
| Giamarchi | 5:46a732673cc5 | 98 | |
| Giamarchi | 5:46a732673cc5 | 99 | void timer_isr(void) | 
| Giamarchi | 5:46a732673cc5 | 100 | { | 
| Giamarchi | 5:46a732673cc5 | 101 | char mask, start_bit, flag_in; | 
| Giamarchi | 5:46a732673cc5 | 102 | |
| Giamarchi | 5:46a732673cc5 | 103 | // Transmitter Section | 
| Giamarchi | 5:46a732673cc5 | 104 | if ( flag_tx_ready ) | 
| Giamarchi | 5:46a732673cc5 | 105 | { | 
| Giamarchi | 5:46a732673cc5 | 106 | |
| Giamarchi | 5:46a732673cc5 | 107 | if ( --timer_tx_ctr<=0 ) | 
| Giamarchi | 5:46a732673cc5 | 108 | { | 
| Giamarchi | 5:46a732673cc5 | 109 | mask = internal_tx_buffer&1; | 
| Giamarchi | 5:46a732673cc5 | 110 | internal_tx_buffer >>= 1; | 
| Giamarchi | 5:46a732673cc5 | 111 | if ( mask ) | 
| Giamarchi | 5:46a732673cc5 | 112 | { | 
| Giamarchi | 5:46a732673cc5 | 113 | set_tx_pin_high(); | 
| Giamarchi | 5:46a732673cc5 | 114 | } | 
| Giamarchi | 5:46a732673cc5 | 115 | else | 
| Giamarchi | 5:46a732673cc5 | 116 | { | 
| Giamarchi | 5:46a732673cc5 | 117 | set_tx_pin_low(); | 
| Giamarchi | 5:46a732673cc5 | 118 | } | 
| Giamarchi | 5:46a732673cc5 | 119 | timer_tx_ctr = 3; | 
| Giamarchi | 5:46a732673cc5 | 120 | if ( --bits_left_in_tx<=0 ) | 
| Giamarchi | 5:46a732673cc5 | 121 | { | 
| Giamarchi | 5:46a732673cc5 | 122 | flag_tx_ready = FALSE; | 
| Giamarchi | 5:46a732673cc5 | 123 | } | 
| Giamarchi | 5:46a732673cc5 | 124 | } | 
| Giamarchi | 5:46a732673cc5 | 125 | } | 
| Giamarchi | 5:46a732673cc5 | 126 | // Receiver Section | 
| Giamarchi | 5:46a732673cc5 | 127 | if ( flag_rx_off==FALSE ) | 
| Giamarchi | 5:46a732673cc5 | 128 | { | 
| Giamarchi | 5:46a732673cc5 | 129 | if ( flag_rx_waiting_for_stop_bit ) | 
| Giamarchi | 5:46a732673cc5 | 130 | { | 
| Giamarchi | 5:46a732673cc5 | 131 | if ( --timer_rx_ctr<=0 ) | 
| Giamarchi | 5:46a732673cc5 | 132 | { | 
| Giamarchi | 5:46a732673cc5 | 133 | flag_rx_waiting_for_stop_bit = FALSE; | 
| Giamarchi | 5:46a732673cc5 | 134 | flag_rx_ready = FALSE; | 
| Giamarchi | 5:46a732673cc5 | 135 | internal_rx_buffer &= 0xFF; | 
| Giamarchi | 5:46a732673cc5 | 136 | if ( internal_rx_buffer!=0xC2 ) | 
| Giamarchi | 5:46a732673cc5 | 137 | { | 
| Giamarchi | 5:46a732673cc5 | 138 | inbuf[qin] = internal_rx_buffer; | 
| Giamarchi | 5:46a732673cc5 | 139 | if ( ++qin>=IN_BUF_SIZE ) | 
| Giamarchi | 5:46a732673cc5 | 140 | { | 
| Giamarchi | 5:46a732673cc5 | 141 | qin = 0; | 
| Giamarchi | 5:46a732673cc5 | 142 | } | 
| Giamarchi | 5:46a732673cc5 | 143 | } | 
| Giamarchi | 5:46a732673cc5 | 144 | } | 
| Giamarchi | 5:46a732673cc5 | 145 | } | 
| Giamarchi | 5:46a732673cc5 | 146 | else // rx_test_busy | 
| Giamarchi | 5:46a732673cc5 | 147 | { | 
| Giamarchi | 5:46a732673cc5 | 148 | if ( flag_rx_ready==FALSE ) | 
| Giamarchi | 5:46a732673cc5 | 149 | { | 
| Giamarchi | 5:46a732673cc5 | 150 | start_bit = get_rx_pin_status(); | 
| Giamarchi | 5:46a732673cc5 | 151 | // Test for Start Bit | 
| Giamarchi | 5:46a732673cc5 | 152 | if ( start_bit==0 ) | 
| Giamarchi | 5:46a732673cc5 | 153 | { | 
| Giamarchi | 5:46a732673cc5 | 154 | flag_rx_ready = TRUE; | 
| Giamarchi | 5:46a732673cc5 | 155 | internal_rx_buffer = 0; | 
| Giamarchi | 5:46a732673cc5 | 156 | timer_rx_ctr = 4; | 
| Giamarchi | 5:46a732673cc5 | 157 | bits_left_in_rx = rx_num_of_bits; | 
| Giamarchi | 5:46a732673cc5 | 158 | rx_mask = 1; | 
| Giamarchi | 5:46a732673cc5 | 159 | } | 
| Giamarchi | 5:46a732673cc5 | 160 | } | 
| Giamarchi | 5:46a732673cc5 | 161 | else // rx_busy | 
| Giamarchi | 5:46a732673cc5 | 162 | { | 
| Giamarchi | 5:46a732673cc5 | 163 | if ( --timer_rx_ctr<=0 ) | 
| Giamarchi | 5:46a732673cc5 | 164 | { // rcv | 
| Giamarchi | 5:46a732673cc5 | 165 | timer_rx_ctr = 3; | 
| Giamarchi | 5:46a732673cc5 | 166 | flag_in = get_rx_pin_status(); | 
| Giamarchi | 5:46a732673cc5 | 167 | if ( flag_in ) | 
| Giamarchi | 5:46a732673cc5 | 168 | { | 
| Giamarchi | 5:46a732673cc5 | 169 | internal_rx_buffer |= rx_mask; | 
| Giamarchi | 5:46a732673cc5 | 170 | } | 
| Giamarchi | 5:46a732673cc5 | 171 | rx_mask <<= 1; | 
| Giamarchi | 5:46a732673cc5 | 172 | if ( --bits_left_in_rx<=0 ) | 
| Giamarchi | 5:46a732673cc5 | 173 | { | 
| Giamarchi | 5:46a732673cc5 | 174 | flag_rx_waiting_for_stop_bit = TRUE; | 
| Giamarchi | 5:46a732673cc5 | 175 | } | 
| Giamarchi | 5:46a732673cc5 | 176 | } | 
| Giamarchi | 5:46a732673cc5 | 177 | } | 
| Giamarchi | 5:46a732673cc5 | 178 | } | 
| Giamarchi | 5:46a732673cc5 | 179 | } | 
| Giamarchi | 5:46a732673cc5 | 180 | } | 
| Giamarchi | 5:46a732673cc5 | 181 | |
| Giamarchi | 5:46a732673cc5 | 182 | void init_uart( void ) | 
| Giamarchi | 5:46a732673cc5 | 183 | { | 
| Giamarchi | 5:46a732673cc5 | 184 | flag_tx_ready = FALSE; | 
| Giamarchi | 5:46a732673cc5 | 185 | flag_rx_ready = FALSE; | 
| Giamarchi | 5:46a732673cc5 | 186 | flag_rx_waiting_for_stop_bit = FALSE; | 
| Giamarchi | 5:46a732673cc5 | 187 | flag_rx_off = FALSE; | 
| Giamarchi | 5:46a732673cc5 | 188 | rx_num_of_bits = 8;//10 | 
| Giamarchi | 5:46a732673cc5 | 189 | tx_num_of_bits = 10;//10 | 
| Giamarchi | 5:46a732673cc5 | 190 | |
| Giamarchi | 5:46a732673cc5 | 191 | set_tx_pin_high(); | 
| Giamarchi | 5:46a732673cc5 | 192 | ticker.attach_us(&timer_isr, 1000000.0 / (BAUD_RATE * 3.0)); | 
| Giamarchi | 5:46a732673cc5 | 193 | |
| Giamarchi | 5:46a732673cc5 | 194 | } | 
| Giamarchi | 5:46a732673cc5 | 195 | |
| Giamarchi | 5:46a732673cc5 | 196 | char _getchar( void ) | 
| Giamarchi | 5:46a732673cc5 | 197 | { | 
| Giamarchi | 5:46a732673cc5 | 198 | char ch; | 
| Giamarchi | 5:46a732673cc5 | 199 | |
| Giamarchi | 5:46a732673cc5 | 200 | do | 
| Giamarchi | 5:46a732673cc5 | 201 | { | 
| Giamarchi | 5:46a732673cc5 | 202 | while ( qout==qin ) | 
| Giamarchi | 5:46a732673cc5 | 203 | { | 
| Giamarchi | 5:46a732673cc5 | 204 | idle(); | 
| Giamarchi | 5:46a732673cc5 | 205 | } | 
| Giamarchi | 5:46a732673cc5 | 206 | ch = inbuf[qout] & 0xFF; | 
| Giamarchi | 5:46a732673cc5 | 207 | if ( ++qout>=IN_BUF_SIZE ) | 
| Giamarchi | 5:46a732673cc5 | 208 | { | 
| Giamarchi | 5:46a732673cc5 | 209 | qout = 0; | 
| Giamarchi | 5:46a732673cc5 | 210 | } | 
| Giamarchi | 5:46a732673cc5 | 211 | } | 
| Giamarchi | 5:46a732673cc5 | 212 | while ( ch==0x0A || ch==0xC2 ); | 
| Giamarchi | 5:46a732673cc5 | 213 | return( ch ); | 
| Giamarchi | 5:46a732673cc5 | 214 | } | 
| Giamarchi | 5:46a732673cc5 | 215 | |
| Giamarchi | 5:46a732673cc5 | 216 | void _putchar( int ch ) | 
| Giamarchi | 5:46a732673cc5 | 217 | { | 
| Giamarchi | 5:46a732673cc5 | 218 | while ( flag_tx_ready ); | 
| Giamarchi | 5:46a732673cc5 | 219 | user_tx_buffer = ch; | 
| Giamarchi | 5:46a732673cc5 | 220 | |
| Giamarchi | 5:46a732673cc5 | 221 | // invoke_UART_transmit | 
| Giamarchi | 5:46a732673cc5 | 222 | timer_tx_ctr = 3; | 
| Giamarchi | 5:46a732673cc5 | 223 | bits_left_in_tx = tx_num_of_bits; | 
| Giamarchi | 5:46a732673cc5 | 224 | internal_tx_buffer = (user_tx_buffer<<1) | 0x200;; | 
| Giamarchi | 5:46a732673cc5 | 225 | flag_tx_ready = TRUE; | 
| Giamarchi | 5:46a732673cc5 | 226 | } | 
| Giamarchi | 5:46a732673cc5 | 227 | |
| Giamarchi | 5:46a732673cc5 | 228 | void flush_input_buffer( void ) | 
| Giamarchi | 5:46a732673cc5 | 229 | { | 
| Giamarchi | 5:46a732673cc5 | 230 | qin = 0; | 
| Giamarchi | 5:46a732673cc5 | 231 | qout = 0; | 
| Giamarchi | 5:46a732673cc5 | 232 | } | 
| Giamarchi | 5:46a732673cc5 | 233 | |
| Giamarchi | 5:46a732673cc5 | 234 | char kbhit( void ) | 
| Giamarchi | 5:46a732673cc5 | 235 | { | 
| Giamarchi | 5:46a732673cc5 | 236 | return( qin!=qout ); | 
| Giamarchi | 5:46a732673cc5 | 237 | } | 
| Giamarchi | 5:46a732673cc5 | 238 | |
| Giamarchi | 5:46a732673cc5 | 239 | void turn_rx_on( void ) | 
| Giamarchi | 5:46a732673cc5 | 240 | { | 
| Giamarchi | 5:46a732673cc5 | 241 | flag_rx_off = FALSE; | 
| Giamarchi | 5:46a732673cc5 | 242 | } | 
| Giamarchi | 5:46a732673cc5 | 243 | |
| Giamarchi | 5:46a732673cc5 | 244 | void turn_rx_off( void ) | 
| Giamarchi | 5:46a732673cc5 | 245 | { | 
| Giamarchi | 5:46a732673cc5 | 246 | flag_rx_off = TRUE; | 
| Giamarchi | 5:46a732673cc5 | 247 | } | 
| Giamarchi | 5:46a732673cc5 | 248 | |
| Giamarchi | 5:46a732673cc5 | 249 | void printStr(char* str){ | 
| Giamarchi | 5:46a732673cc5 | 250 | int i = 0; | 
| Giamarchi | 5:46a732673cc5 | 251 | int len = strlen(str); | 
| Giamarchi | 5:46a732673cc5 | 252 | for(i = 0; i<len; i++){ | 
| Giamarchi | 5:46a732673cc5 | 253 | wait(0.01); | 
| Giamarchi | 5:46a732673cc5 | 254 | _putchar(str[i]); | 
| Giamarchi | 5:46a732673cc5 | 255 | } | 
| Giamarchi | 5:46a732673cc5 | 256 | } |