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.
Fork of mbed-dev by
drivers/UARTSerial.h@178:79309dc6340a, 2017-11-23 (annotated)
- Committer:
- AnnaBridge
- Date:
- Thu Nov 23 11:57:25 2017 +0000
- Revision:
- 178:79309dc6340a
- Parent:
- 176:447f873cad2f
mbed-dev library. Release version 156
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 167:e84263d55307 | 1 | /* mbed Microcontroller Library |
AnnaBridge | 167:e84263d55307 | 2 | * Copyright (c) 2006-2017 ARM Limited |
AnnaBridge | 167:e84263d55307 | 3 | * |
AnnaBridge | 167:e84263d55307 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
AnnaBridge | 167:e84263d55307 | 5 | * you may not use this file except in compliance with the License. |
AnnaBridge | 167:e84263d55307 | 6 | * You may obtain a copy of the License at |
AnnaBridge | 167:e84263d55307 | 7 | * |
AnnaBridge | 167:e84263d55307 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
AnnaBridge | 167:e84263d55307 | 9 | * |
AnnaBridge | 167:e84263d55307 | 10 | * Unless required by applicable law or agreed to in writing, software |
AnnaBridge | 167:e84263d55307 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
AnnaBridge | 167:e84263d55307 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
AnnaBridge | 167:e84263d55307 | 13 | * See the License for the specific language governing permissions and |
AnnaBridge | 167:e84263d55307 | 14 | * limitations under the License. |
AnnaBridge | 167:e84263d55307 | 15 | */ |
AnnaBridge | 167:e84263d55307 | 16 | |
AnnaBridge | 167:e84263d55307 | 17 | #ifndef MBED_UARTSERIAL_H |
AnnaBridge | 167:e84263d55307 | 18 | #define MBED_UARTSERIAL_H |
AnnaBridge | 167:e84263d55307 | 19 | |
AnnaBridge | 167:e84263d55307 | 20 | #include "platform/platform.h" |
AnnaBridge | 167:e84263d55307 | 21 | |
AnnaBridge | 168:9672193075cf | 22 | #if (DEVICE_SERIAL && DEVICE_INTERRUPTIN) || defined(DOXYGEN_ONLY) |
AnnaBridge | 167:e84263d55307 | 23 | |
AnnaBridge | 167:e84263d55307 | 24 | #include "FileHandle.h" |
AnnaBridge | 167:e84263d55307 | 25 | #include "SerialBase.h" |
AnnaBridge | 167:e84263d55307 | 26 | #include "InterruptIn.h" |
AnnaBridge | 167:e84263d55307 | 27 | #include "PlatformMutex.h" |
AnnaBridge | 167:e84263d55307 | 28 | #include "serial_api.h" |
AnnaBridge | 167:e84263d55307 | 29 | #include "CircularBuffer.h" |
AnnaBridge | 168:9672193075cf | 30 | #include "platform/NonCopyable.h" |
AnnaBridge | 167:e84263d55307 | 31 | |
AnnaBridge | 167:e84263d55307 | 32 | #ifndef MBED_CONF_DRIVERS_UART_SERIAL_RXBUF_SIZE |
AnnaBridge | 167:e84263d55307 | 33 | #define MBED_CONF_DRIVERS_UART_SERIAL_RXBUF_SIZE 256 |
AnnaBridge | 167:e84263d55307 | 34 | #endif |
AnnaBridge | 167:e84263d55307 | 35 | |
AnnaBridge | 167:e84263d55307 | 36 | #ifndef MBED_CONF_DRIVERS_UART_SERIAL_TXBUF_SIZE |
AnnaBridge | 167:e84263d55307 | 37 | #define MBED_CONF_DRIVERS_UART_SERIAL_TXBUF_SIZE 256 |
AnnaBridge | 167:e84263d55307 | 38 | #endif |
AnnaBridge | 167:e84263d55307 | 39 | |
AnnaBridge | 167:e84263d55307 | 40 | namespace mbed { |
AnnaBridge | 167:e84263d55307 | 41 | |
AnnaBridge | 178:79309dc6340a | 42 | /** \addtogroup drivers */ |
AnnaBridge | 178:79309dc6340a | 43 | |
AnnaBridge | 178:79309dc6340a | 44 | /** Class providing buffered UART communication functionality using separate circular buffer for send and receive channels |
AnnaBridge | 178:79309dc6340a | 45 | * |
AnnaBridge | 178:79309dc6340a | 46 | * @ingroup drivers |
AnnaBridge | 178:79309dc6340a | 47 | */ |
AnnaBridge | 178:79309dc6340a | 48 | |
AnnaBridge | 168:9672193075cf | 49 | class UARTSerial : private SerialBase, public FileHandle, private NonCopyable<UARTSerial> { |
AnnaBridge | 167:e84263d55307 | 50 | |
AnnaBridge | 167:e84263d55307 | 51 | public: |
AnnaBridge | 167:e84263d55307 | 52 | |
AnnaBridge | 167:e84263d55307 | 53 | /** Create a UARTSerial port, connected to the specified transmit and receive pins, with a particular baud rate. |
AnnaBridge | 167:e84263d55307 | 54 | * @param tx Transmit pin |
AnnaBridge | 167:e84263d55307 | 55 | * @param rx Receive pin |
AnnaBridge | 167:e84263d55307 | 56 | * @param baud The baud rate of the serial port (optional, defaults to MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE) |
AnnaBridge | 167:e84263d55307 | 57 | */ |
AnnaBridge | 167:e84263d55307 | 58 | UARTSerial(PinName tx, PinName rx, int baud = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE); |
AnnaBridge | 167:e84263d55307 | 59 | virtual ~UARTSerial(); |
AnnaBridge | 167:e84263d55307 | 60 | |
AnnaBridge | 167:e84263d55307 | 61 | /** Equivalent to POSIX poll(). Derived from FileHandle. |
AnnaBridge | 167:e84263d55307 | 62 | * Provides a mechanism to multiplex input/output over a set of file handles. |
AnnaBridge | 167:e84263d55307 | 63 | */ |
AnnaBridge | 167:e84263d55307 | 64 | virtual short poll(short events) const; |
AnnaBridge | 167:e84263d55307 | 65 | |
AnnaBridge | 175:af195413fb11 | 66 | /* Resolve ambiguities versus our private SerialBase |
AnnaBridge | 175:af195413fb11 | 67 | * (for writable, spelling differs, but just in case) |
AnnaBridge | 175:af195413fb11 | 68 | */ |
AnnaBridge | 175:af195413fb11 | 69 | using FileHandle::readable; |
AnnaBridge | 175:af195413fb11 | 70 | using FileHandle::writable; |
AnnaBridge | 175:af195413fb11 | 71 | |
AnnaBridge | 167:e84263d55307 | 72 | /** Write the contents of a buffer to a file |
AnnaBridge | 167:e84263d55307 | 73 | * |
AnnaBridge | 167:e84263d55307 | 74 | * @param buffer The buffer to write from |
AnnaBridge | 168:9672193075cf | 75 | * @param length The number of bytes to write |
AnnaBridge | 167:e84263d55307 | 76 | * @return The number of bytes written, negative error on failure |
AnnaBridge | 167:e84263d55307 | 77 | */ |
AnnaBridge | 167:e84263d55307 | 78 | virtual ssize_t write(const void* buffer, size_t length); |
AnnaBridge | 167:e84263d55307 | 79 | |
AnnaBridge | 167:e84263d55307 | 80 | /** Read the contents of a file into a buffer |
AnnaBridge | 167:e84263d55307 | 81 | * |
AnnaBridge | 167:e84263d55307 | 82 | * Follows POSIX semantics: |
AnnaBridge | 167:e84263d55307 | 83 | * |
AnnaBridge | 167:e84263d55307 | 84 | * * if no data is available, and non-blocking set return -EAGAIN |
AnnaBridge | 167:e84263d55307 | 85 | * * if no data is available, and blocking set, wait until data is available |
AnnaBridge | 167:e84263d55307 | 86 | * * If any data is available, call returns immediately |
AnnaBridge | 167:e84263d55307 | 87 | * |
AnnaBridge | 167:e84263d55307 | 88 | * @param buffer The buffer to read in to |
AnnaBridge | 168:9672193075cf | 89 | * @param length The number of bytes to read |
AnnaBridge | 167:e84263d55307 | 90 | * @return The number of bytes read, 0 at end of file, negative error on failure |
AnnaBridge | 167:e84263d55307 | 91 | */ |
AnnaBridge | 167:e84263d55307 | 92 | virtual ssize_t read(void* buffer, size_t length); |
AnnaBridge | 167:e84263d55307 | 93 | |
AnnaBridge | 167:e84263d55307 | 94 | /** Close a file |
AnnaBridge | 167:e84263d55307 | 95 | * |
AnnaBridge | 167:e84263d55307 | 96 | * @return 0 on success, negative error code on failure |
AnnaBridge | 167:e84263d55307 | 97 | */ |
AnnaBridge | 167:e84263d55307 | 98 | virtual int close(); |
AnnaBridge | 167:e84263d55307 | 99 | |
AnnaBridge | 167:e84263d55307 | 100 | /** Check if the file in an interactive terminal device |
AnnaBridge | 167:e84263d55307 | 101 | * |
AnnaBridge | 167:e84263d55307 | 102 | * @return True if the file is a terminal |
AnnaBridge | 167:e84263d55307 | 103 | * @return False if the file is not a terminal |
AnnaBridge | 167:e84263d55307 | 104 | * @return Negative error code on failure |
AnnaBridge | 167:e84263d55307 | 105 | */ |
AnnaBridge | 167:e84263d55307 | 106 | virtual int isatty(); |
AnnaBridge | 167:e84263d55307 | 107 | |
AnnaBridge | 167:e84263d55307 | 108 | /** Move the file position to a given offset from from a given location |
AnnaBridge | 167:e84263d55307 | 109 | * |
AnnaBridge | 167:e84263d55307 | 110 | * Not valid for a device type FileHandle like UARTSerial. |
AnnaBridge | 167:e84263d55307 | 111 | * In case of UARTSerial, returns ESPIPE |
AnnaBridge | 167:e84263d55307 | 112 | * |
AnnaBridge | 167:e84263d55307 | 113 | * @param offset The offset from whence to move to |
AnnaBridge | 167:e84263d55307 | 114 | * @param whence The start of where to seek |
AnnaBridge | 167:e84263d55307 | 115 | * SEEK_SET to start from beginning of file, |
AnnaBridge | 167:e84263d55307 | 116 | * SEEK_CUR to start from current position in file, |
AnnaBridge | 167:e84263d55307 | 117 | * SEEK_END to start from end of file |
AnnaBridge | 167:e84263d55307 | 118 | * @return The new offset of the file, negative error code on failure |
AnnaBridge | 167:e84263d55307 | 119 | */ |
AnnaBridge | 167:e84263d55307 | 120 | virtual off_t seek(off_t offset, int whence); |
AnnaBridge | 167:e84263d55307 | 121 | |
AnnaBridge | 167:e84263d55307 | 122 | /** Flush any buffers associated with the file |
AnnaBridge | 167:e84263d55307 | 123 | * |
AnnaBridge | 167:e84263d55307 | 124 | * @return 0 on success, negative error code on failure |
AnnaBridge | 167:e84263d55307 | 125 | */ |
AnnaBridge | 167:e84263d55307 | 126 | virtual int sync(); |
AnnaBridge | 167:e84263d55307 | 127 | |
AnnaBridge | 167:e84263d55307 | 128 | /** Set blocking or non-blocking mode |
AnnaBridge | 167:e84263d55307 | 129 | * The default is blocking. |
AnnaBridge | 167:e84263d55307 | 130 | * |
AnnaBridge | 167:e84263d55307 | 131 | * @param blocking true for blocking mode, false for non-blocking mode. |
AnnaBridge | 167:e84263d55307 | 132 | */ |
AnnaBridge | 167:e84263d55307 | 133 | virtual int set_blocking(bool blocking) |
AnnaBridge | 167:e84263d55307 | 134 | { |
AnnaBridge | 167:e84263d55307 | 135 | _blocking = blocking; |
AnnaBridge | 167:e84263d55307 | 136 | return 0; |
AnnaBridge | 167:e84263d55307 | 137 | } |
AnnaBridge | 167:e84263d55307 | 138 | |
AnnaBridge | 167:e84263d55307 | 139 | /** Register a callback on state change of the file. |
AnnaBridge | 167:e84263d55307 | 140 | * |
AnnaBridge | 167:e84263d55307 | 141 | * The specified callback will be called on state changes such as when |
AnnaBridge | 167:e84263d55307 | 142 | * the file can be written to or read from. |
AnnaBridge | 167:e84263d55307 | 143 | * |
AnnaBridge | 167:e84263d55307 | 144 | * The callback may be called in an interrupt context and should not |
AnnaBridge | 167:e84263d55307 | 145 | * perform expensive operations. |
AnnaBridge | 167:e84263d55307 | 146 | * |
AnnaBridge | 167:e84263d55307 | 147 | * Note! This is not intended as an attach-like asynchronous api, but rather |
AnnaBridge | 167:e84263d55307 | 148 | * as a building block for constructing such functionality. |
AnnaBridge | 167:e84263d55307 | 149 | * |
AnnaBridge | 167:e84263d55307 | 150 | * The exact timing of when the registered function |
AnnaBridge | 167:e84263d55307 | 151 | * is called is not guaranteed and susceptible to change. It should be used |
AnnaBridge | 167:e84263d55307 | 152 | * as a cue to make read/write/poll calls to find the current state. |
AnnaBridge | 167:e84263d55307 | 153 | * |
AnnaBridge | 167:e84263d55307 | 154 | * @param func Function to call on state change |
AnnaBridge | 167:e84263d55307 | 155 | */ |
AnnaBridge | 167:e84263d55307 | 156 | virtual void sigio(Callback<void()> func); |
AnnaBridge | 167:e84263d55307 | 157 | |
AnnaBridge | 167:e84263d55307 | 158 | /** Setup interrupt handler for DCD line |
AnnaBridge | 167:e84263d55307 | 159 | * |
AnnaBridge | 167:e84263d55307 | 160 | * If DCD line is connected, an IRQ handler will be setup. |
AnnaBridge | 167:e84263d55307 | 161 | * Does nothing if DCD is NC, i.e., not connected. |
AnnaBridge | 167:e84263d55307 | 162 | * |
AnnaBridge | 167:e84263d55307 | 163 | * @param dcd_pin Pin-name for DCD |
AnnaBridge | 167:e84263d55307 | 164 | * @param active_high a boolean set to true if DCD polarity is active low |
AnnaBridge | 167:e84263d55307 | 165 | */ |
AnnaBridge | 167:e84263d55307 | 166 | void set_data_carrier_detect(PinName dcd_pin, bool active_high = false); |
AnnaBridge | 167:e84263d55307 | 167 | |
Kojto | 170:19eb464bc2be | 168 | /** Set the baud rate |
Kojto | 170:19eb464bc2be | 169 | * |
Kojto | 170:19eb464bc2be | 170 | * @param baud The baud rate |
Kojto | 170:19eb464bc2be | 171 | */ |
Kojto | 170:19eb464bc2be | 172 | void set_baud(int baud); |
Kojto | 170:19eb464bc2be | 173 | |
AnnaBridge | 167:e84263d55307 | 174 | private: |
AnnaBridge | 167:e84263d55307 | 175 | |
AnnaBridge | 176:447f873cad2f | 176 | void wait_ms(uint32_t millisec); |
AnnaBridge | 176:447f873cad2f | 177 | |
AnnaBridge | 168:9672193075cf | 178 | /** SerialBase lock override */ |
AnnaBridge | 168:9672193075cf | 179 | virtual void lock(void); |
AnnaBridge | 168:9672193075cf | 180 | |
AnnaBridge | 168:9672193075cf | 181 | /** SerialBase unlock override */ |
AnnaBridge | 168:9672193075cf | 182 | virtual void unlock(void); |
AnnaBridge | 168:9672193075cf | 183 | |
AnnaBridge | 168:9672193075cf | 184 | /** Acquire mutex */ |
AnnaBridge | 168:9672193075cf | 185 | virtual void api_lock(void); |
AnnaBridge | 168:9672193075cf | 186 | |
AnnaBridge | 168:9672193075cf | 187 | /** Release mutex */ |
AnnaBridge | 168:9672193075cf | 188 | virtual void api_unlock(void); |
AnnaBridge | 168:9672193075cf | 189 | |
AnnaBridge | 167:e84263d55307 | 190 | /** Software serial buffers |
AnnaBridge | 167:e84263d55307 | 191 | * By default buffer size is 256 for TX and 256 for RX. Configurable through mbed_app.json |
AnnaBridge | 167:e84263d55307 | 192 | */ |
AnnaBridge | 167:e84263d55307 | 193 | CircularBuffer<char, MBED_CONF_DRIVERS_UART_SERIAL_RXBUF_SIZE> _rxbuf; |
AnnaBridge | 167:e84263d55307 | 194 | CircularBuffer<char, MBED_CONF_DRIVERS_UART_SERIAL_TXBUF_SIZE> _txbuf; |
AnnaBridge | 167:e84263d55307 | 195 | |
AnnaBridge | 167:e84263d55307 | 196 | PlatformMutex _mutex; |
AnnaBridge | 167:e84263d55307 | 197 | |
AnnaBridge | 167:e84263d55307 | 198 | Callback<void()> _sigio_cb; |
AnnaBridge | 167:e84263d55307 | 199 | |
AnnaBridge | 167:e84263d55307 | 200 | bool _blocking; |
AnnaBridge | 167:e84263d55307 | 201 | bool _tx_irq_enabled; |
AnnaBridge | 167:e84263d55307 | 202 | InterruptIn *_dcd_irq; |
AnnaBridge | 167:e84263d55307 | 203 | |
AnnaBridge | 167:e84263d55307 | 204 | /** Device Hanged up |
AnnaBridge | 167:e84263d55307 | 205 | * Determines if the device hanged up on us. |
AnnaBridge | 167:e84263d55307 | 206 | * |
AnnaBridge | 167:e84263d55307 | 207 | * @return True, if hanged up |
AnnaBridge | 167:e84263d55307 | 208 | */ |
AnnaBridge | 167:e84263d55307 | 209 | bool hup() const; |
AnnaBridge | 167:e84263d55307 | 210 | |
AnnaBridge | 167:e84263d55307 | 211 | /** ISRs for serial |
AnnaBridge | 167:e84263d55307 | 212 | * Routines to handle interrupts on serial pins. |
AnnaBridge | 167:e84263d55307 | 213 | * Copies data into Circular Buffer. |
AnnaBridge | 167:e84263d55307 | 214 | * Reports the state change to File handle. |
AnnaBridge | 167:e84263d55307 | 215 | */ |
AnnaBridge | 167:e84263d55307 | 216 | void tx_irq(void); |
AnnaBridge | 167:e84263d55307 | 217 | void rx_irq(void); |
AnnaBridge | 167:e84263d55307 | 218 | |
AnnaBridge | 167:e84263d55307 | 219 | void wake(void); |
AnnaBridge | 167:e84263d55307 | 220 | |
AnnaBridge | 167:e84263d55307 | 221 | void dcd_irq(void); |
AnnaBridge | 168:9672193075cf | 222 | |
AnnaBridge | 167:e84263d55307 | 223 | }; |
AnnaBridge | 167:e84263d55307 | 224 | } //namespace mbed |
AnnaBridge | 167:e84263d55307 | 225 | |
AnnaBridge | 168:9672193075cf | 226 | #endif //(DEVICE_SERIAL && DEVICE_INTERRUPTIN) || defined(DOXYGEN_ONLY) |
AnnaBridge | 167:e84263d55307 | 227 | #endif //MBED_UARTSERIAL_H |