mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-04 08:01:38 +01:00 
			
		
		
		
	* Expose uartStartDetectBaudrate(uart_t *) in esp32-hal-uart.h and call it from HardwareSerial::begin() if baudrate detection is requested (by passing a baudrate of 0) to solve baudrate detection problems * Avoid a division by zero error in uartGetBaudRate()
		
			
				
	
	
		
			159 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include <stdlib.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <inttypes.h>
 | 
						|
 | 
						|
#include "pins_arduino.h"
 | 
						|
#include "HardwareSerial.h"
 | 
						|
 | 
						|
#ifndef RX1
 | 
						|
#define RX1 9
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef TX1
 | 
						|
#define TX1 10
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef RX2
 | 
						|
#define RX2 16
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef TX2
 | 
						|
#define TX2 17
 | 
						|
#endif
 | 
						|
 | 
						|
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SERIAL)
 | 
						|
HardwareSerial Serial(0);
 | 
						|
HardwareSerial Serial1(1);
 | 
						|
HardwareSerial Serial2(2);
 | 
						|
#endif
 | 
						|
 | 
						|
HardwareSerial::HardwareSerial(int uart_nr) : _uart_nr(uart_nr), _uart(NULL) {}
 | 
						|
 | 
						|
void HardwareSerial::begin(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPin, bool invert, unsigned long timeout_ms)
 | 
						|
{
 | 
						|
    if(0 > _uart_nr || _uart_nr > 2) {
 | 
						|
        log_e("Serial number is invalid, please use 0, 1 or 2");
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    if(_uart) {
 | 
						|
        end();
 | 
						|
    }
 | 
						|
    if(_uart_nr == 0 && rxPin < 0 && txPin < 0) {
 | 
						|
        rxPin = 3;
 | 
						|
        txPin = 1;
 | 
						|
    }
 | 
						|
    if(_uart_nr == 1 && rxPin < 0 && txPin < 0) {
 | 
						|
        rxPin = RX1;
 | 
						|
        txPin = TX1;
 | 
						|
    }
 | 
						|
    if(_uart_nr == 2 && rxPin < 0 && txPin < 0) {
 | 
						|
        rxPin = RX2;
 | 
						|
        txPin = TX2;
 | 
						|
    }
 | 
						|
 | 
						|
    _uart = uartBegin(_uart_nr, baud ? baud : 9600, config, rxPin, txPin, 256, invert);
 | 
						|
 | 
						|
    if(!baud) {
 | 
						|
        uartStartDetectBaudrate(_uart);
 | 
						|
        time_t startMillis = millis();
 | 
						|
        unsigned long detectedBaudRate = 0;
 | 
						|
        while(millis() - startMillis < timeout_ms && !(detectedBaudRate = uartDetectBaudrate(_uart))) {
 | 
						|
            yield();
 | 
						|
        }
 | 
						|
 | 
						|
        end();
 | 
						|
 | 
						|
        if(detectedBaudRate) {
 | 
						|
            delay(100); // Give some time...
 | 
						|
            _uart = uartBegin(_uart_nr, detectedBaudRate, config, rxPin, txPin, 256, invert);
 | 
						|
        } else {
 | 
						|
            log_e("Could not detect baudrate. Serial data at the port must be present within the timeout for detection to be possible");
 | 
						|
            _uart = NULL;
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void HardwareSerial::updateBaudRate(unsigned long baud)
 | 
						|
{
 | 
						|
	uartSetBaudRate(_uart, baud);
 | 
						|
}
 | 
						|
 | 
						|
void HardwareSerial::end()
 | 
						|
{
 | 
						|
    if(uartGetDebug() == _uart_nr) {
 | 
						|
        uartSetDebug(0);
 | 
						|
    }
 | 
						|
    uartEnd(_uart);
 | 
						|
    _uart = 0;
 | 
						|
}
 | 
						|
 | 
						|
size_t HardwareSerial::setRxBufferSize(size_t new_size) {
 | 
						|
    return uartResizeRxBuffer(_uart, new_size);
 | 
						|
}
 | 
						|
 | 
						|
void HardwareSerial::setDebugOutput(bool en)
 | 
						|
{
 | 
						|
    if(_uart == 0) {
 | 
						|
        return;
 | 
						|
    }
 | 
						|
    if(en) {
 | 
						|
        uartSetDebug(_uart);
 | 
						|
    } else {
 | 
						|
        if(uartGetDebug() == _uart_nr) {
 | 
						|
            uartSetDebug(0);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
int HardwareSerial::available(void)
 | 
						|
{
 | 
						|
    return uartAvailable(_uart);
 | 
						|
}
 | 
						|
int HardwareSerial::availableForWrite(void)
 | 
						|
{
 | 
						|
    return uartAvailableForWrite(_uart);
 | 
						|
}
 | 
						|
 | 
						|
int HardwareSerial::peek(void)
 | 
						|
{
 | 
						|
    if (available()) {
 | 
						|
        return uartPeek(_uart);
 | 
						|
    }
 | 
						|
    return -1;
 | 
						|
}
 | 
						|
 | 
						|
int HardwareSerial::read(void)
 | 
						|
{
 | 
						|
    if(available()) {
 | 
						|
        return uartRead(_uart);
 | 
						|
    }
 | 
						|
    return -1;
 | 
						|
}
 | 
						|
 | 
						|
void HardwareSerial::flush()
 | 
						|
{
 | 
						|
    uartFlush(_uart);
 | 
						|
}
 | 
						|
 | 
						|
size_t HardwareSerial::write(uint8_t c)
 | 
						|
{
 | 
						|
    uartWrite(_uart, c);
 | 
						|
    return 1;
 | 
						|
}
 | 
						|
 | 
						|
size_t HardwareSerial::write(const uint8_t *buffer, size_t size)
 | 
						|
{
 | 
						|
    uartWriteBuf(_uart, buffer, size);
 | 
						|
    return size;
 | 
						|
}
 | 
						|
uint32_t  HardwareSerial::baudRate()
 | 
						|
 | 
						|
{
 | 
						|
	return uartGetBaudRate(_uart);
 | 
						|
}
 | 
						|
HardwareSerial::operator bool() const
 | 
						|
{
 | 
						|
    return true;
 | 
						|
}
 |