libxr  1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
LibXR::ESP32UART Class Reference
Inheritance diagram for LibXR::ESP32UART:
[legend]
Collaboration diagram for LibXR::ESP32UART:
[legend]

Public Member Functions

 ESP32UART (uart_port_t port, int tx_pin, int rx_pin, uint32_t buffer_size=256, uint32_t rx_thread_stack_depth=1024, uint32_t rx_thread_priority=10)
 
ErrorCode SetConfig (UART::Configuration config) override
 设置 UART 配置 / Sets the UART configuration
 
- Public Member Functions inherited from LibXR::UART
template<typename ReadPortType = ReadPort, typename WritePortType = WritePort>
 UART (ReadPortType *read_port, WritePortType *write_port)
 UART 构造函数 / UART constructor.
 
template<typename OperationType , typename = std::enable_if_t<std::is_base_of_v< WriteOperation, std::decay_t<OperationType>>>>
ErrorCode Write (ConstRawData data, OperationType &&op)
 
template<typename OperationType , typename = std::enable_if_t<std::is_base_of_v< ReadOperation, std::decay_t<OperationType>>>>
ErrorCode Read (RawData data, OperationType &&op)
 

Static Public Member Functions

static ErrorCode WriteFun (WritePort &port)
 
static ErrorCode ReadFun (ReadPort &port)
 

Private Member Functions

void HandleEvent (const uart_event_t &event)
 

Static Private Member Functions

static void RxTask (void *param)
 
static void TxTask (void *param)
 

Private Attributes

uart_port_t port_
 
QueueHandle_t event_queue_
 
RawData rx_buff_
 
RawData tx_buff_
 
ESP32UARTReadPort _read_port
 
ESP32UARTWritePort _write_port
 

Friends

class ESP32UARTReadPort
 
class ESP32UARTWritePort
 

Additional Inherited Members

- Public Types inherited from LibXR::UART
enum class  Parity : uint8_t { NO_PARITY = 0 , EVEN = 1 , ODD = 2 }
 奇偶校验模式 / Parity mode More...
 
- Data Fields inherited from LibXR::UART
ReadPortread_port_
 读取端口 / Read port
 
WritePortwrite_port_
 写入端口 / Write port
 

Detailed Description

Definition at line 56 of file esp_uart.hpp.

Constructor & Destructor Documentation

◆ ESP32UART()

ESP32UART::ESP32UART ( uart_port_t port,
int tx_pin,
int rx_pin,
uint32_t buffer_size = 256,
uint32_t rx_thread_stack_depth = 1024,
uint32_t rx_thread_priority = 10 )

Definition at line 56 of file esp_uart.cpp.

58 : UART(&_read_port, &_write_port),
59 port_(port),
60 rx_buff_(new uint8_t[buffer_size], buffer_size),
61 tx_buff_(new uint8_t[buffer_size], buffer_size),
62 _read_port(0, this),
63 _write_port(1, 0, this)
64{
65 uart_config_t config = {};
66 config.baud_rate = 115200;
67 config.data_bits = UART_DATA_8_BITS;
68 config.parity = UART_PARITY_DISABLE;
69 config.stop_bits = UART_STOP_BITS_1;
70 config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
71 config.source_clk = UART_SCLK_APB;
72
73 ESP_ERROR_CHECK(uart_param_config(port_, &config));
74 ESP_ERROR_CHECK(
75 uart_set_pin(port_, tx_pin, rx_pin, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
76 ESP_ERROR_CHECK(
77 uart_driver_install(port_, rx_buff_.size_, tx_buff_.size_, 20, &event_queue_, 0));
78
79 _read_port = ReadFun;
80 _write_port = WriteFun;
81
82 xTaskCreate(RxTask, "uart_rx_task", rx_thread_stack_depth, this, rx_thread_priority,
83 nullptr);
84}
size_t size_
数据大小(字节)。 The size of the data (in bytes).
UART(ReadPortType *read_port, WritePortType *write_port)
UART 构造函数 / UART constructor.
Definition uart.hpp:64
ErrorCode(* ReadFun)(ReadPort &port)
Function pointer type for read operations.
Definition libxr_rw.hpp:247
ErrorCode(* WriteFun)(WritePort &port)
Function pointer type for write operations.
Definition libxr_rw.hpp:243

Member Function Documentation

◆ HandleEvent()

void ESP32UART::HandleEvent ( const uart_event_t & event)
private

Definition at line 99 of file esp_uart.cpp.

100{
101 switch (event.type)
102 {
103 case UART_DATA:
104 {
106 break;
107 }
108 case UART_BUFFER_FULL:
109 case UART_FIFO_OVF:
110 case UART_FRAME_ERR:
111 case UART_PARITY_ERR:
112 {
113 LibXR::Mutex::LockGuard guard(read_port_->mutex_);
114
115 if (read_port_->busy_.load(std::memory_order_relaxed) ==
116 LibXR::ReadPort::BusyState::Pending)
117 {
118 read_port_->info_.op.UpdateStatus(false, ErrorCode::FAILED);
119 }
120 uart_flush_input(port_);
121 read_port_->Reset();
123 break;
124 }
125 default:
126 break;
127 }
128}
互斥锁的 RAII 机制封装 (RAII-style mechanism for automatic mutex management).
Definition mutex.hpp:65
void UpdateStatus(bool in_isr, Status &&...status)
Updates operation status based on type.
Definition libxr_rw.hpp:173
virtual void ProcessPendingReads(bool in_isr)
Processes pending reads.
Definition libxr_rw.hpp:501
virtual void Reset()
Resets the ReadPort.
Definition libxr_rw.hpp:550
ReadPort * read_port_
读取端口 / Read port
Definition uart.hpp:51
WritePort * write_port_
写入端口 / Write port
Definition uart.hpp:52
virtual void Reset()
Resets the WritePort.
Definition libxr_rw.hpp:803
ReadOperation op
Read operation instance. 读取操作实例。
Definition libxr_rw.hpp:256

◆ ReadFun()

ErrorCode ESP32UART::ReadFun ( ReadPort & port)
static

Definition at line 153 of file esp_uart.cpp.

154{
155 ESP32UART *self = CONTAINER_OF(&port, ESP32UART, _read_port);
156 UNUSED(self);
157
158 if (port.Size() >= port.info_.data.size_)
159 {
160 int len =
161 uart_read_bytes(self->port_, port.info_.data.addr_, port.info_.data.size_, 0);
162
163 port.read_size_ = len;
164 if (len == port.info_.data.size_)
165 {
166 return ErrorCode::OK;
167 }
168 }
169
170 return ErrorCode::EMPTY;
171}
void * addr_
数据存储地址。 The storage address of the data.
virtual size_t Size()
获取当前队列的已使用大小。 Gets the currently used size of the queue.
Definition libxr_rw.hpp:325
RawData data
Data buffer. 数据缓冲区。
Definition libxr_rw.hpp:255

◆ RxTask()

void ESP32UART::RxTask ( void * param)
staticprivate

Definition at line 86 of file esp_uart.cpp.

87{
88 auto *self = static_cast<ESP32UART *>(param);
89 uart_event_t event;
90 while (true)
91 {
92 if (xQueueReceive(self->event_queue_, &event, portMAX_DELAY))
93 {
94 self->HandleEvent(event);
95 }
96 }
97}

◆ SetConfig()

ErrorCode ESP32UART::SetConfig ( UART::Configuration config)
overridevirtual

设置 UART 配置 / Sets the UART configuration

Parameters
configUART 配置信息 / UART configuration settings
Returns
返回操作状态,成功时返回 ErrorCode::OK,否则返回相应错误码 / Returns the operation status, ErrorCode::OK if successful, otherwise an error code

该方法为纯虚函数,子类必须实现具体的 UART 配置逻辑。 This is a pure virtual function. Subclasses must implement the specific UART configuration logic.

Implements LibXR::UART.

Definition at line 173 of file esp_uart.cpp.

174{
175 uart_config_t uart_cfg = {};
176
177 uart_cfg.baud_rate = static_cast<int>(config.baudrate);
178 uart_cfg.data_bits = UART_DATA_8_BITS;
179 uart_cfg.parity = UART_PARITY_DISABLE;
180 uart_cfg.stop_bits = UART_STOP_BITS_1;
181 uart_cfg.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
182 uart_cfg.source_clk = UART_SCLK_APB;
183
184 switch (config.parity)
185 {
187 uart_cfg.parity = UART_PARITY_DISABLE;
188 uart_cfg.data_bits = UART_DATA_8_BITS;
189 break;
191 uart_cfg.parity = UART_PARITY_EVEN;
192 uart_cfg.data_bits = UART_DATA_8_BITS;
193 break;
195 uart_cfg.parity = UART_PARITY_ODD;
196 uart_cfg.data_bits = UART_DATA_8_BITS;
197 break;
198 default:
199 return ErrorCode::ARG_ERR;
200 }
201
202 switch (config.stop_bits)
203 {
204 case 1:
205 uart_cfg.stop_bits = UART_STOP_BITS_1;
206 break;
207 case 2:
208 uart_cfg.stop_bits = UART_STOP_BITS_2;
209 break;
210 default:
211 return ErrorCode::ARG_ERR;
212 }
213
214 if (uart_param_config(port_, &uart_cfg) != ESP_OK)
215 {
216 return ErrorCode::FAILED;
217 }
218
219 return ErrorCode::OK;
220}
@ NO_PARITY
无校验 / No parity
@ ODD
奇校验 / Odd parity
@ EVEN
偶校验 / Even parity
uint8_t stop_bits
停止位长度 / Number of stop bits
Definition uart.hpp:48
Parity parity
校验模式 / Parity mode
Definition uart.hpp:46
uint32_t baudrate
波特率 / Baud rate
Definition uart.hpp:45

◆ WriteFun()

ErrorCode ESP32UART::WriteFun ( WritePort & port)
static

Definition at line 130 of file esp_uart.cpp.

131{
132 ESP32UART *self = CONTAINER_OF(&port, ESP32UART, _write_port);
133 WriteInfoBlock info;
134 if (port.queue_info_->Pop(info) != ErrorCode::OK)
135 {
136 return ErrorCode::EMPTY;
137 }
138
139 size_t space = 0;
140
141 uart_get_tx_buffer_free_size(self->port_, &space);
142 if (space < info.data.size_)
143 {
144 return ErrorCode::FULL;
145 }
146
147 uart_write_bytes(self->port_, static_cast<const char *>(info.data.addr_),
148 info.data.size_);
149
150 return ErrorCode::OK;
151}
size_t size_
数据大小(字节)。 The size of the data (in bytes).
const void * addr_
数据存储地址(常量)。 The storage address of the data (constant).

Friends And Related Symbol Documentation

◆ ESP32UARTReadPort

friend class ESP32UARTReadPort
friend

Definition at line 67 of file esp_uart.hpp.

◆ ESP32UARTWritePort

friend class ESP32UARTWritePort
friend

Definition at line 68 of file esp_uart.hpp.

Field Documentation

◆ _read_port

ESP32UARTReadPort LibXR::ESP32UART::_read_port
private

Definition at line 80 of file esp_uart.hpp.

◆ _write_port

ESP32UARTWritePort LibXR::ESP32UART::_write_port
private

Definition at line 81 of file esp_uart.hpp.

◆ event_queue_

QueueHandle_t LibXR::ESP32UART::event_queue_
private

Definition at line 76 of file esp_uart.hpp.

◆ port_

uart_port_t LibXR::ESP32UART::port_
private

Definition at line 75 of file esp_uart.hpp.

◆ rx_buff_

RawData LibXR::ESP32UART::rx_buff_
private

Definition at line 77 of file esp_uart.hpp.

◆ tx_buff_

RawData LibXR::ESP32UART::tx_buff_
private

Definition at line 78 of file esp_uart.hpp.


The documentation for this class was generated from the following files: