Inherit from Serial and use software buffers for TX and RX. This allows the UART peripherals to operate in a IRQ driven mode. Overrides most (but not all) stdio functions as Serial did

Dependencies:   Buffer

Dependents:   buffered_serial_test BLE_Police_HRM evena_BLE_Police_HRM df-2014-workshop-rfid-case-generator-k64f ... more

Example

 #include "mbed.h"
 #include "BufferedSerial.h"

 BufferedSerial pc(USBTX, USBRX);

 int main()
 {
     pc.baud(115200);
   
     while(1)
     {
         Timer s;
       
         s.start();
         pc.printf("Hello World - buff\n");
         int buffered_time = s.read_us();
         wait(0.1f); // give time for the buffer to empty
       
         s.reset();
         printf("Hello World - poll\n");
         int polled_time = s.read_us();
         s.stop();
         wait(0.1f); // give time for the buffer to empty
       
         pc.printf("printf buffered took %d us\n", buffered_time);
         pc.printf("printf polled took %d us\n", polled_time);
         wait(0.5f);
     }
 }
Committer:
sam_grove
Date:
Wed Feb 20 01:29:28 2019 +0000
Revision:
13:c17c532bc4f8
Parent:
12:a0d37088b405
Child:
14:7e5e866edd3d
Eliminate warnings with Mbed 2 version 131 and Mbed OS 5.2.0 and newer. Added error messages to help if incompatible versions are identified (best effort)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 0:a977d0a3d81e 1
sam_grove 0:a977d0a3d81e 2 /**
sam_grove 0:a977d0a3d81e 3 * @file BufferedSerial.h
sam_grove 0:a977d0a3d81e 4 * @brief Software Buffer - Extends mbed Serial functionallity adding irq driven TX and RX
sam_grove 0:a977d0a3d81e 5 * @author sam grove
sam_grove 0:a977d0a3d81e 6 * @version 1.0
sam_grove 0:a977d0a3d81e 7 * @see
sam_grove 0:a977d0a3d81e 8 *
sam_grove 0:a977d0a3d81e 9 * Copyright (c) 2013
sam_grove 0:a977d0a3d81e 10 *
sam_grove 0:a977d0a3d81e 11 * Licensed under the Apache License, Version 2.0 (the "License");
sam_grove 0:a977d0a3d81e 12 * you may not use this file except in compliance with the License.
sam_grove 0:a977d0a3d81e 13 * You may obtain a copy of the License at
sam_grove 0:a977d0a3d81e 14 *
sam_grove 0:a977d0a3d81e 15 * http://www.apache.org/licenses/LICENSE-2.0
sam_grove 0:a977d0a3d81e 16 *
sam_grove 0:a977d0a3d81e 17 * Unless required by applicable law or agreed to in writing, software
sam_grove 0:a977d0a3d81e 18 * distributed under the License is distributed on an "AS IS" BASIS,
sam_grove 0:a977d0a3d81e 19 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sam_grove 0:a977d0a3d81e 20 * See the License for the specific language governing permissions and
sam_grove 0:a977d0a3d81e 21 * limitations under the License.
sam_grove 0:a977d0a3d81e 22 */
sam_grove 0:a977d0a3d81e 23
sam_grove 0:a977d0a3d81e 24 #ifndef BUFFEREDSERIAL_H
sam_grove 0:a977d0a3d81e 25 #define BUFFEREDSERIAL_H
sam_grove 0:a977d0a3d81e 26
sam_grove 0:a977d0a3d81e 27 #include "mbed.h"
sam_grove 12:a0d37088b405 28 #include "MyBuffer.h"
sam_grove 0:a977d0a3d81e 29
sam_grove 13:c17c532bc4f8 30 #if (MBED_MAJOR_VERSION == 5) && (MBED_MINOR_VERSION >= 2)
sam_grove 13:c17c532bc4f8 31 #elif (MBED_MAJOR_VERSION == 2) && (MBED_PATCH_VERSION > 130)
sam_grove 13:c17c532bc4f8 32 #else
sam_grove 13:c17c532bc4f8 33 #error "BufferedSerial version 13 requires use of Mbed OS 5.2.0 and newer or Mbed 2 version 130 and newer. Use BufferedSerial version 12 and older or upgrade the Mbed version.
sam_grove 13:c17c532bc4f8 34 #endif
sam_grove 13:c17c532bc4f8 35
sam_grove 0:a977d0a3d81e 36 /** A serial port (UART) for communication with other serial devices
sam_grove 0:a977d0a3d81e 37 *
sam_grove 0:a977d0a3d81e 38 * Can be used for Full Duplex communication, or Simplex by specifying
sam_grove 0:a977d0a3d81e 39 * one pin as NC (Not Connected)
sam_grove 0:a977d0a3d81e 40 *
sam_grove 0:a977d0a3d81e 41 * Example:
sam_grove 0:a977d0a3d81e 42 * @code
sam_grove 0:a977d0a3d81e 43 * #include "mbed.h"
sam_grove 0:a977d0a3d81e 44 * #include "BufferedSerial.h"
sam_grove 0:a977d0a3d81e 45 *
sam_grove 0:a977d0a3d81e 46 * BufferedSerial pc(USBTX, USBRX);
sam_grove 0:a977d0a3d81e 47 *
sam_grove 0:a977d0a3d81e 48 * int main()
sam_grove 5:4d6a311fc8bf 49 * {
sam_grove 0:a977d0a3d81e 50 * while(1)
sam_grove 0:a977d0a3d81e 51 * {
sam_grove 0:a977d0a3d81e 52 * Timer s;
sam_grove 0:a977d0a3d81e 53 *
sam_grove 0:a977d0a3d81e 54 * s.start();
sam_grove 5:4d6a311fc8bf 55 * pc.printf("Hello World - buffered\n");
sam_grove 0:a977d0a3d81e 56 * int buffered_time = s.read_us();
sam_grove 0:a977d0a3d81e 57 * wait(0.1f); // give time for the buffer to empty
sam_grove 0:a977d0a3d81e 58 *
sam_grove 0:a977d0a3d81e 59 * s.reset();
sam_grove 5:4d6a311fc8bf 60 * printf("Hello World - blocking\n");
sam_grove 0:a977d0a3d81e 61 * int polled_time = s.read_us();
sam_grove 0:a977d0a3d81e 62 * s.stop();
sam_grove 0:a977d0a3d81e 63 * wait(0.1f); // give time for the buffer to empty
sam_grove 0:a977d0a3d81e 64 *
sam_grove 0:a977d0a3d81e 65 * pc.printf("printf buffered took %d us\n", buffered_time);
sam_grove 5:4d6a311fc8bf 66 * pc.printf("printf blocking took %d us\n", polled_time);
sam_grove 0:a977d0a3d81e 67 * wait(0.5f);
sam_grove 0:a977d0a3d81e 68 * }
sam_grove 0:a977d0a3d81e 69 * }
sam_grove 0:a977d0a3d81e 70 * @endcode
sam_grove 0:a977d0a3d81e 71 */
sam_grove 0:a977d0a3d81e 72
sam_grove 0:a977d0a3d81e 73 /**
sam_grove 0:a977d0a3d81e 74 * @class BufferedSerial
sam_grove 0:a977d0a3d81e 75 * @brief Software buffers and interrupt driven tx and rx for Serial
sam_grove 0:a977d0a3d81e 76 */
sam_grove 11:779304f9c5d2 77 class BufferedSerial : public RawSerial
sam_grove 0:a977d0a3d81e 78 {
sam_grove 0:a977d0a3d81e 79 private:
sam_grove 12:a0d37088b405 80 MyBuffer <char> _rxbuf;
sam_grove 12:a0d37088b405 81 MyBuffer <char> _txbuf;
ansond 10:9ee15ae3d1a3 82 uint32_t _buf_size;
ansond 10:9ee15ae3d1a3 83 uint32_t _tx_multiple;
sam_grove 0:a977d0a3d81e 84
sam_grove 0:a977d0a3d81e 85 void rxIrq(void);
sam_grove 0:a977d0a3d81e 86 void txIrq(void);
sam_grove 1:57a11fb5d529 87 void prime(void);
sam_grove 0:a977d0a3d81e 88
sam_grove 0:a977d0a3d81e 89 public:
sam_grove 0:a977d0a3d81e 90 /** Create a BufferedSerial port, connected to the specified transmit and receive pins
sam_grove 0:a977d0a3d81e 91 * @param tx Transmit pin
sam_grove 0:a977d0a3d81e 92 * @param rx Receive pin
ansond 10:9ee15ae3d1a3 93 * @param buf_size printf() buffer size
ansond 10:9ee15ae3d1a3 94 * @param tx_multiple amount of max printf() present in the internal ring buffer at one time
ansond 7:6fa214b41d73 95 * @param name optional name
sam_grove 0:a977d0a3d81e 96 * @note Either tx or rx may be specified as NC if unused
sam_grove 0:a977d0a3d81e 97 */
ansond 10:9ee15ae3d1a3 98 BufferedSerial(PinName tx, PinName rx, uint32_t buf_size = 256, uint32_t tx_multiple = 4,const char* name=NULL);
sam_grove 0:a977d0a3d81e 99
sam_grove 0:a977d0a3d81e 100 /** Destroy a BufferedSerial port
sam_grove 0:a977d0a3d81e 101 */
sam_grove 0:a977d0a3d81e 102 virtual ~BufferedSerial(void);
sam_grove 0:a977d0a3d81e 103
sam_grove 0:a977d0a3d81e 104 /** Check on how many bytes are in the rx buffer
sam_grove 0:a977d0a3d81e 105 * @return 1 if something exists, 0 otherwise
sam_grove 0:a977d0a3d81e 106 */
sam_grove 0:a977d0a3d81e 107 virtual int readable(void);
sam_grove 0:a977d0a3d81e 108
sam_grove 0:a977d0a3d81e 109 /** Check to see if the tx buffer has room
sam_grove 0:a977d0a3d81e 110 * @return 1 always has room and can overwrite previous content if too small / slow
sam_grove 0:a977d0a3d81e 111 */
sam_grove 0:a977d0a3d81e 112 virtual int writeable(void);
sam_grove 0:a977d0a3d81e 113
sam_grove 0:a977d0a3d81e 114 /** Get a single byte from the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 115 * Should check readable() before calling this.
sam_grove 0:a977d0a3d81e 116 * @return A byte that came in on the Serial Port
sam_grove 0:a977d0a3d81e 117 */
sam_grove 0:a977d0a3d81e 118 virtual int getc(void);
sam_grove 0:a977d0a3d81e 119
sam_grove 0:a977d0a3d81e 120 /** Write a single byte to the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 121 * @param c The byte to write to the Serial Port
sam_grove 2:7e8a450a9101 122 * @return The byte that was written to the Serial Port Buffer
sam_grove 0:a977d0a3d81e 123 */
sam_grove 0:a977d0a3d81e 124 virtual int putc(int c);
sam_grove 0:a977d0a3d81e 125
sam_grove 0:a977d0a3d81e 126 /** Write a string to the BufferedSerial Port. Must be NULL terminated
sam_grove 0:a977d0a3d81e 127 * @param s The string to write to the Serial Port
sam_grove 2:7e8a450a9101 128 * @return The number of bytes written to the Serial Port Buffer
sam_grove 0:a977d0a3d81e 129 */
sam_grove 0:a977d0a3d81e 130 virtual int puts(const char *s);
sam_grove 0:a977d0a3d81e 131
sam_grove 0:a977d0a3d81e 132 /** Write a formatted string to the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 133 * @param format The string + format specifiers to write to the Serial Port
sam_grove 2:7e8a450a9101 134 * @return The number of bytes written to the Serial Port Buffer
sam_grove 0:a977d0a3d81e 135 */
sam_grove 0:a977d0a3d81e 136 virtual int printf(const char* format, ...);
sam_grove 0:a977d0a3d81e 137
sam_grove 2:7e8a450a9101 138 /** Write data to the Buffered Serial Port
sam_grove 2:7e8a450a9101 139 * @param s A pointer to data to send
sam_grove 2:7e8a450a9101 140 * @param length The amount of data being pointed to
sam_grove 2:7e8a450a9101 141 * @return The number of bytes written to the Serial Port Buffer
sam_grove 2:7e8a450a9101 142 */
sam_grove 2:7e8a450a9101 143 virtual ssize_t write(const void *s, std::size_t length);
sam_grove 0:a977d0a3d81e 144 };
sam_grove 0:a977d0a3d81e 145
sam_grove 0:a977d0a3d81e 146 #endif