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:
ansond
Date:
Fri Jan 02 03:47:26 2015 +0000
Revision:
7:6fa214b41d73
Parent:
6:8287e83943f0
Child:
8:506247a040bc
made updates to enable the ability to expand the internal buffer. Additionally, used the definition to set the size of the ring buffers in the constructor initializer list. Increased the default buffer size to 512. Additional clean ups (param cks)

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 0:a977d0a3d81e 28 #include "Buffer.h"
sam_grove 0:a977d0a3d81e 29
ansond 7:6fa214b41d73 30 // Base Class
ansond 6:8287e83943f0 31 #define SERIAL_BASE RawSerial
ansond 6:8287e83943f0 32
ansond 7:6fa214b41d73 33 // Internal buffer size
ansond 7:6fa214b41d73 34 #define BUFFEREDSERIAL_MAX_BUFFER_SIZE 512
ansond 7:6fa214b41d73 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 */
ansond 6:8287e83943f0 77 class BufferedSerial : public SERIAL_BASE
sam_grove 0:a977d0a3d81e 78 {
sam_grove 0:a977d0a3d81e 79 private:
sam_grove 3:6b76fcf27545 80 Buffer <char> _rxbuf;
sam_grove 3:6b76fcf27545 81 Buffer <char> _txbuf;
ansond 7:6fa214b41d73 82 char _buffer[BUFFEREDSERIAL_MAX_BUFFER_SIZE+1];
sam_grove 0:a977d0a3d81e 83
sam_grove 0:a977d0a3d81e 84 void rxIrq(void);
sam_grove 0:a977d0a3d81e 85 void txIrq(void);
sam_grove 1:57a11fb5d529 86 void prime(void);
sam_grove 0:a977d0a3d81e 87
sam_grove 0:a977d0a3d81e 88 public:
sam_grove 0:a977d0a3d81e 89 /** Create a BufferedSerial port, connected to the specified transmit and receive pins
sam_grove 0:a977d0a3d81e 90 * @param tx Transmit pin
sam_grove 0:a977d0a3d81e 91 * @param rx Receive pin
ansond 7:6fa214b41d73 92 * @param name optional name
sam_grove 0:a977d0a3d81e 93 * @note Either tx or rx may be specified as NC if unused
sam_grove 0:a977d0a3d81e 94 */
sam_grove 0:a977d0a3d81e 95 BufferedSerial(PinName tx, PinName rx, const char* name=NULL);
sam_grove 0:a977d0a3d81e 96
sam_grove 0:a977d0a3d81e 97 /** Destroy a BufferedSerial port
sam_grove 0:a977d0a3d81e 98 */
sam_grove 0:a977d0a3d81e 99 virtual ~BufferedSerial(void);
sam_grove 0:a977d0a3d81e 100
sam_grove 0:a977d0a3d81e 101 /** Check on how many bytes are in the rx buffer
sam_grove 0:a977d0a3d81e 102 * @return 1 if something exists, 0 otherwise
sam_grove 0:a977d0a3d81e 103 */
sam_grove 0:a977d0a3d81e 104 virtual int readable(void);
sam_grove 0:a977d0a3d81e 105
sam_grove 0:a977d0a3d81e 106 /** Check to see if the tx buffer has room
sam_grove 0:a977d0a3d81e 107 * @return 1 always has room and can overwrite previous content if too small / slow
sam_grove 0:a977d0a3d81e 108 */
sam_grove 0:a977d0a3d81e 109 virtual int writeable(void);
sam_grove 0:a977d0a3d81e 110
sam_grove 0:a977d0a3d81e 111 /** Get a single byte from the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 112 * Should check readable() before calling this.
sam_grove 0:a977d0a3d81e 113 * @return A byte that came in on the Serial Port
sam_grove 0:a977d0a3d81e 114 */
sam_grove 0:a977d0a3d81e 115 virtual int getc(void);
sam_grove 0:a977d0a3d81e 116
sam_grove 0:a977d0a3d81e 117 /** Write a single byte to the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 118 * @param c The byte to write to the Serial Port
sam_grove 2:7e8a450a9101 119 * @return The byte that was written to the Serial Port Buffer
sam_grove 0:a977d0a3d81e 120 */
sam_grove 0:a977d0a3d81e 121 virtual int putc(int c);
sam_grove 0:a977d0a3d81e 122
sam_grove 0:a977d0a3d81e 123 /** Write a string to the BufferedSerial Port. Must be NULL terminated
sam_grove 0:a977d0a3d81e 124 * @param s The string to write to the Serial Port
sam_grove 2:7e8a450a9101 125 * @return The number of bytes written to the Serial Port Buffer
sam_grove 0:a977d0a3d81e 126 */
sam_grove 0:a977d0a3d81e 127 virtual int puts(const char *s);
sam_grove 0:a977d0a3d81e 128
sam_grove 0:a977d0a3d81e 129 /** Write a formatted string to the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 130 * @param format The string + format specifiers to write to the Serial Port
sam_grove 2:7e8a450a9101 131 * @return The number of bytes written to the Serial Port Buffer
sam_grove 0:a977d0a3d81e 132 */
sam_grove 0:a977d0a3d81e 133 virtual int printf(const char* format, ...);
sam_grove 0:a977d0a3d81e 134
sam_grove 2:7e8a450a9101 135 /** Write data to the Buffered Serial Port
sam_grove 2:7e8a450a9101 136 * @param s A pointer to data to send
sam_grove 2:7e8a450a9101 137 * @param length The amount of data being pointed to
sam_grove 2:7e8a450a9101 138 * @return The number of bytes written to the Serial Port Buffer
sam_grove 2:7e8a450a9101 139 */
sam_grove 2:7e8a450a9101 140 virtual ssize_t write(const void *s, std::size_t length);
sam_grove 0:a977d0a3d81e 141 };
sam_grove 0:a977d0a3d81e 142
sam_grove 0:a977d0a3d81e 143 #endif