BufferedSerial for NUCLEO-F446RE forked from Veysel KARADAG and Sam Grove

Dependencies:   Buffer

Dependents:   Lab05_buffered_serial Lab05_Xbee_receive

Committer:
sam_grove
Date:
Fri May 24 22:00:26 2013 +0000
Revision:
2:7e8a450a9101
Parent:
1:57a11fb5d529
Child:
3:6b76fcf27545
Override virtual member write. Better management of prime to avoid contentious writes under heavy traffic. updated puts to add \n per stdlib puts definition

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
sam_grove 0:a977d0a3d81e 30 /** A serial port (UART) for communication with other serial devices
sam_grove 0:a977d0a3d81e 31 *
sam_grove 0:a977d0a3d81e 32 * Can be used for Full Duplex communication, or Simplex by specifying
sam_grove 0:a977d0a3d81e 33 * one pin as NC (Not Connected)
sam_grove 0:a977d0a3d81e 34 *
sam_grove 0:a977d0a3d81e 35 * Example:
sam_grove 0:a977d0a3d81e 36 * @code
sam_grove 0:a977d0a3d81e 37 * #include "mbed.h"
sam_grove 0:a977d0a3d81e 38 * #include "BufferedSerial.h"
sam_grove 0:a977d0a3d81e 39 *
sam_grove 0:a977d0a3d81e 40 * BufferedSerial pc(USBTX, USBRX);
sam_grove 0:a977d0a3d81e 41 *
sam_grove 0:a977d0a3d81e 42 * int main()
sam_grove 0:a977d0a3d81e 43 * {
sam_grove 0:a977d0a3d81e 44 * pc.baud(115200);
sam_grove 0:a977d0a3d81e 45 *
sam_grove 0:a977d0a3d81e 46 * while(1)
sam_grove 0:a977d0a3d81e 47 * {
sam_grove 0:a977d0a3d81e 48 * Timer s;
sam_grove 0:a977d0a3d81e 49 *
sam_grove 0:a977d0a3d81e 50 * s.start();
sam_grove 0:a977d0a3d81e 51 * pc.printf("Hello World - buff\n");
sam_grove 0:a977d0a3d81e 52 * int buffered_time = s.read_us();
sam_grove 0:a977d0a3d81e 53 * wait(0.1f); // give time for the buffer to empty
sam_grove 0:a977d0a3d81e 54 *
sam_grove 0:a977d0a3d81e 55 * s.reset();
sam_grove 0:a977d0a3d81e 56 * printf("Hello World - poll\n");
sam_grove 0:a977d0a3d81e 57 * int polled_time = s.read_us();
sam_grove 0:a977d0a3d81e 58 * s.stop();
sam_grove 0:a977d0a3d81e 59 * wait(0.1f); // give time for the buffer to empty
sam_grove 0:a977d0a3d81e 60 *
sam_grove 0:a977d0a3d81e 61 * pc.printf("printf buffered took %d us\n", buffered_time);
sam_grove 0:a977d0a3d81e 62 * pc.printf("printf polled took %d us\n", polled_time);
sam_grove 0:a977d0a3d81e 63 * wait(0.5f);
sam_grove 0:a977d0a3d81e 64 * }
sam_grove 0:a977d0a3d81e 65 * }
sam_grove 0:a977d0a3d81e 66 * @endcode
sam_grove 0:a977d0a3d81e 67 */
sam_grove 0:a977d0a3d81e 68
sam_grove 0:a977d0a3d81e 69 /**
sam_grove 0:a977d0a3d81e 70 * @class BufferedSerial
sam_grove 0:a977d0a3d81e 71 * @brief Software buffers and interrupt driven tx and rx for Serial
sam_grove 0:a977d0a3d81e 72 */
sam_grove 0:a977d0a3d81e 73 class BufferedSerial : public Serial
sam_grove 0:a977d0a3d81e 74 {
sam_grove 0:a977d0a3d81e 75 private:
sam_grove 2:7e8a450a9101 76 Buffer <char> _rxbuf;
sam_grove 2:7e8a450a9101 77 Buffer <char> _txbuf;
sam_grove 0:a977d0a3d81e 78
sam_grove 0:a977d0a3d81e 79 void rxIrq(void);
sam_grove 0:a977d0a3d81e 80 void txIrq(void);
sam_grove 1:57a11fb5d529 81 void prime(void);
sam_grove 0:a977d0a3d81e 82
sam_grove 0:a977d0a3d81e 83 public:
sam_grove 0:a977d0a3d81e 84 /** Create a BufferedSerial port, connected to the specified transmit and receive pins
sam_grove 0:a977d0a3d81e 85 * @param tx Transmit pin
sam_grove 0:a977d0a3d81e 86 * @param rx Receive pin
sam_grove 0:a977d0a3d81e 87 * @note Either tx or rx may be specified as NC if unused
sam_grove 0:a977d0a3d81e 88 */
sam_grove 0:a977d0a3d81e 89 BufferedSerial(PinName tx, PinName rx, const char* name=NULL);
sam_grove 0:a977d0a3d81e 90
sam_grove 0:a977d0a3d81e 91 /** Destroy a BufferedSerial port
sam_grove 0:a977d0a3d81e 92 */
sam_grove 0:a977d0a3d81e 93 virtual ~BufferedSerial(void);
sam_grove 0:a977d0a3d81e 94
sam_grove 0:a977d0a3d81e 95 /** Check on how many bytes are in the rx buffer
sam_grove 0:a977d0a3d81e 96 * @return 1 if something exists, 0 otherwise
sam_grove 0:a977d0a3d81e 97 */
sam_grove 0:a977d0a3d81e 98 virtual int readable(void);
sam_grove 0:a977d0a3d81e 99
sam_grove 0:a977d0a3d81e 100 /** Check to see if the tx buffer has room
sam_grove 0:a977d0a3d81e 101 * @return 1 always has room and can overwrite previous content if too small / slow
sam_grove 0:a977d0a3d81e 102 */
sam_grove 0:a977d0a3d81e 103 virtual int writeable(void);
sam_grove 0:a977d0a3d81e 104
sam_grove 0:a977d0a3d81e 105 /** Get a single byte from the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 106 * Should check readable() before calling this.
sam_grove 0:a977d0a3d81e 107 * @return A byte that came in on the Serial Port
sam_grove 0:a977d0a3d81e 108 */
sam_grove 0:a977d0a3d81e 109 virtual int getc(void);
sam_grove 0:a977d0a3d81e 110
sam_grove 0:a977d0a3d81e 111 /** Write a single byte to the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 112 * @param c The byte to write to the Serial Port
sam_grove 2:7e8a450a9101 113 * @return The byte that was written to the Serial Port Buffer
sam_grove 0:a977d0a3d81e 114 */
sam_grove 0:a977d0a3d81e 115 virtual int putc(int c);
sam_grove 0:a977d0a3d81e 116
sam_grove 0:a977d0a3d81e 117 /** Write a string to the BufferedSerial Port. Must be NULL terminated
sam_grove 0:a977d0a3d81e 118 * @param s The string to write to the Serial Port
sam_grove 2:7e8a450a9101 119 * @return The number of bytes written to the Serial Port Buffer
sam_grove 0:a977d0a3d81e 120 */
sam_grove 0:a977d0a3d81e 121 virtual int puts(const char *s);
sam_grove 0:a977d0a3d81e 122
sam_grove 0:a977d0a3d81e 123 /** Write a formatted string to the BufferedSerial Port.
sam_grove 0:a977d0a3d81e 124 * @param format The string + format specifiers 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 printf(const char* format, ...);
sam_grove 0:a977d0a3d81e 128
sam_grove 2:7e8a450a9101 129 /** Write data to the Buffered Serial Port
sam_grove 2:7e8a450a9101 130 * @param s A pointer to data to send
sam_grove 2:7e8a450a9101 131 * @param length The amount of data being pointed to
sam_grove 2:7e8a450a9101 132 * @return The number of bytes written to the Serial Port Buffer
sam_grove 2:7e8a450a9101 133 */
sam_grove 2:7e8a450a9101 134 virtual ssize_t write(const void *s, std::size_t length);
sam_grove 0:a977d0a3d81e 135 };
sam_grove 0:a977d0a3d81e 136
sam_grove 0:a977d0a3d81e 137 #endif