16template <UartType TxType>
class UartTx;
17template <UartType RxType>
class UartRx;
21 UartTx(UART_HandleTypeDef *huart) : huart_{huart} {}
23 bool transmit(
const uint8_t *data,
size_t size, uint32_t timeout) {
24 if (HAL_UART_Transmit_DMA(huart_, data, size) != HAL_OK) {
25 HAL_UART_AbortTransmit_IT(huart_);
29 while (huart_->gState != HAL_UART_STATE_READY) {
31 HAL_UART_AbortTransmit_IT(huart_);
40 UART_HandleTypeDef *huart_;
48 UartRx(UART_HandleTypeDef *huart,
size_t buf_size)
49 : huart_{huart}, buf_(buf_size) {
50 HAL_UART_Receive_DMA(huart, buf_.data(), buf_.size());
55 bool receive(uint8_t *data,
size_t size, uint32_t timeout) {
63 for (
size_t i = 0; i < size; ++i) {
64 data[i] = buf_[read_idx_];
73 size_t write_idx = buf_.size() - __HAL_DMA_GET_COUNTER(huart_->hdmarx);
74 return (buf_.size() + write_idx - read_idx_) % buf_.size();
78 UART_HandleTypeDef *huart_;
79 std::vector<uint8_t> buf_;
85 void advance(
size_t len) { read_idx_ = (read_idx_ + len) % buf_.size(); }
Definition utility.hpp:12
bool is_timeout(uint32_t &timeout)
Definition utility.hpp:16
void flush()
Definition uart_dma.hpp:70
size_t available()
Definition uart_dma.hpp:72
UartRx(UART_HandleTypeDef *huart, size_t buf_size)
Definition uart_dma.hpp:48
bool receive(uint8_t *data, size_t size, uint32_t timeout)
Definition uart_dma.hpp:55
~UartRx()
Definition uart_dma.hpp:53
UartTx(UART_HandleTypeDef *huart)
Definition uart_dma.hpp:21
bool transmit(const uint8_t *data, size_t size, uint32_t timeout)
Definition uart_dma.hpp:23
UartType
Definition uart_type.hpp:6
@ DMA
Definition uart_type.hpp:9