3 #include "pins_arduino.h"
5 #include "HardwareSerial.h"
6 #include "RingBufferN.h"
7 #include "pico/stdlib.h"
8 #include "hardware/uart.h"
14 #define BUFFER_SIZE 512
17 #if !defined(TINYUSB_HOST_LINKED) && !defined(TINYUSB_DEVICE_LINKED)
20 static bool tud_cdc_connected (
void);
40 virtual void begin(
unsigned long baudrate) {
45 virtual void begin(
unsigned long baudrate, uint16_t config){
54 virtual int available(
void){
56 return buffer.available();
59 virtual int peek(
void) {
64 virtual int read(
void){
69 return buffer.read_char();
72 virtual void flush(
void) {
77 virtual size_t write(uint8_t c) {
78 size_t len = putchar(c);
79 #ifndef PICO_ARDUINO_NO_FLUSH
86 virtual size_t write(
const uint8_t *buffer,
size_t size){
88 for (
size_t j=0;j<size;j++){
89 result += putchar(buffer[j]);
100 virtual operator bool(){
101 return tud_cdc_connected() && is_open;
106 RingBufferN<BUFFER_SIZE> buffer;
110 if (buffer.available()==0){
112 int wait_time = 1000;
113 int c = getchar_timeout_us(wait_time);
114 while(c!=PICO_ERROR_TIMEOUT && buffer.availableForStore()>0){
115 buffer.store_char(c);
116 c = getchar_timeout_us(wait_time);
135 this->uart_no = uart_no;
136 this->uart = uart_no == 0 ? uart0 : uart1;
139 virtual void begin(
unsigned long baudrate=PICO_DEFAULT_UART_BAUD_RATE) {
140 begin(baudrate, -1, -1, SERIAL_8N1);
143 virtual void begin(
unsigned long baudrate, uint16_t config) {
144 begin(baudrate, -1, -1, config);
159 virtual void begin(
unsigned long baudrate,
int rxPin,
int txPin, uint32_t config=SERIAL_8N1,
bool invert=
false,
bool cts=
false,
bool rts=
false) {
160 Logger.info(
"PicoHardwareSerial::begin", toStr(baudrate));
163 uart_init(uart, baudrate);
164 setupDefaultRxTxPins();
165 uart_set_hw_flow(uart, cts, rts);
167 uart_set_translate_crlf(uart,
false);
168 uart_set_fifo_enabled(uart,
true);
170 uint rate_effective = uart_set_baudrate(uart,baudrate);
171 open = uart_is_enabled(uart);
172 if (Logger.isLogging(PicoLogger::Info)) {
173 Logger.info(
"baud_rate requested:",toStr(baudrate));
174 Logger.info(
"baud_rate effective:",toStr(rate_effective));
175 Logger.info(
"uart_is_enabled:", open ?
"true" :
"false");
181 Logger.info(
"PicoHardwareSerial::end ",toStr(uart_no));
186 virtual int available(
void){
188 return buffer.available();
191 virtual int availableForWrite(
void){
192 return uart_is_writable(uart);
195 virtual int peek(
void){
197 return buffer.peek();
200 virtual int read(
void){
202 return buffer.read_char();
207 using Print::println;
209 virtual size_t write(uint8_t c) {
210 bool ok = uart_is_writable (uart);
217 virtual size_t write(
const uint8_t *buffer,
size_t size){
218 uart_write_blocking(uart, buffer, size);
226 virtual void flush(
void) {
229 virtual operator bool(){
235 RingBufferN<BUFFER_SIZE> buffer;
244 void readBuffer(
bool refill=
false) {
246 if (refill || buffer.available()==0){
247 while(buffer.availableForStore()>0 && uart_is_readable(uart) ) {
248 char c = uart_get_hw(uart)->dr;
249 buffer.store_char(c);
254 void set_config(uint32_t config){
255 Logger.info(
"set_config");
259 uart_set_format(uart, 5, 1,UART_PARITY_NONE);
262 uart_set_format(uart, 6, 1,UART_PARITY_NONE);
265 uart_set_format(uart, 7, 1,UART_PARITY_NONE);
268 Logger.info(
"SERIAL_8N1 - UART_PARITY_NONE");
269 uart_set_format(uart, 8, 1,UART_PARITY_NONE);
272 uart_set_format(uart, 5, 2,UART_PARITY_NONE);
275 uart_set_format(uart, 6, 2,UART_PARITY_NONE);
278 uart_set_format(uart, 7, 2,UART_PARITY_NONE);
281 uart_set_format(uart, 8, 2,UART_PARITY_NONE);
284 uart_set_format(uart, 5, 1,UART_PARITY_EVEN);
287 uart_set_format(uart, 6, 1,UART_PARITY_EVEN);
290 uart_set_format(uart, 7, 1,UART_PARITY_EVEN);
293 uart_set_format(uart, 8, 1,UART_PARITY_EVEN);
296 uart_set_format(uart, 5, 2,UART_PARITY_EVEN);
299 uart_set_format(uart, 6, 2,UART_PARITY_EVEN);
302 uart_set_format(uart, 7, 2,UART_PARITY_EVEN);
305 uart_set_format(uart, 8, 2,UART_PARITY_EVEN);
308 uart_set_format(uart, 5, 1,UART_PARITY_ODD);
311 uart_set_format(uart, 6, 1,UART_PARITY_ODD);
314 uart_set_format(uart, 7, 1,UART_PARITY_ODD);
317 uart_set_format(uart, 8, 1,UART_PARITY_ODD);
320 uart_set_format(uart, 5, 2,UART_PARITY_ODD);
323 uart_set_format(uart, 6, 2,UART_PARITY_ODD);
326 uart_set_format(uart, 7, 2,UART_PARITY_ODD);
329 uart_set_format(uart, 8, 2,UART_PARITY_ODD);
334 void setupDefaultRxTxPins(){
335 Logger.info(
"setupDefaultRxTxPins");
353 if (Logger.isLogging()) {
354 Logger.info(
"Using UART: ", toStr(uart_no));
355 Logger.info(
"txPin is ", toStr(tx_pin));
356 Logger.info(
"rxPin is ", toStr(rx_pin));
359 gpio_set_function(tx_pin, GPIO_FUNC_UART);
362 gpio_set_function(rx_pin, GPIO_FUNC_UART);
367 const char* toStr(
int value){
368 static char buffer[10];
369 itoa(value,buffer,10);
370 return (
const char*)buffer;
Serial Stream for a defined UART. By default we use the following pins: UART0 tx/rx = gp0/gp1; UART1 ...
Definition: PicoHardwareSerial.h:129
virtual void begin(unsigned long baudrate, int rxPin, int txPin, uint32_t config=SERIAL_8N1, bool invert=false, bool cts=false, bool rts=false)
Initialization to output to UART.
Definition: PicoHardwareSerial.h:159
PicoUSBSerial is using the pico USB output. It is mapped to the Arduino Serial variable.
Definition: PicoHardwareSerial.h:28
Definition: HardwareSerial.h:88