diff --git a/cores/arduino/HardwareSerial.cpp b/cores/arduino/HardwareSerial.cpp index 8554ded..5bcb875 100644 --- a/cores/arduino/HardwareSerial.cpp +++ b/cores/arduino/HardwareSerial.cpp @@ -170,14 +170,17 @@ int HardwareSerial::read(void) size_t HardwareSerial::write(const uint8_t *buffer, size_t size) { - return uart_debug_write((uint8_t *)buffer, size); + for (size_t i = 0; i < size; i++) { + write(buffer[i]); + } + + return size; } size_t HardwareSerial::write(uint8_t c) { - uint8_t buff = c; - return write(&buff, 1); + return uart_putc(&_serial, c); } void HardwareSerial::setRx(uint32_t _rx) diff --git a/cores/arduino/ch32/uart.c b/cores/arduino/ch32/uart.c index 3707072..7d787c5 100644 --- a/cores/arduino/ch32/uart.c +++ b/cores/arduino/ch32/uart.c @@ -523,11 +523,40 @@ int uart_getc(serial_t *obj, unsigned char *c) return -1; } + if (!USART_GetFlagStatus(uart_handlers[obj->index]->Instance, USART_FLAG_RXNE)){ + return -1; + } + *c = (unsigned char)USART_ReceiveData(uart_handlers[obj->index]->Instance); return 0; } +/** + * @brief Write byte to uart + * @param obj : pointer to serial_t structure + * @retval error status + */ +int uart_putc(serial_t *obj, unsigned char c) +{ + uint32_t tickstart = GetTick(); + + if (obj == NULL) { + return -1; + } + + while (serial_tx_active(obj)) + { + if ((GetTick() - tickstart) >= TX_TIMEOUT) + { + return 0; + } + } + + USART_SendData(uart_handlers[obj->index]->Instance, c); + + return 0; +} diff --git a/cores/arduino/ch32/uart.h b/cores/arduino/ch32/uart.h index 1a1e905..18d9256 100644 --- a/cores/arduino/ch32/uart.h +++ b/cores/arduino/ch32/uart.h @@ -90,6 +90,7 @@ typedef struct __UART_HandleTypeDef void uart_deinit(serial_t *obj); int uart_getc(serial_t *obj, unsigned char *c); + int uart_putc(serial_t *obj, unsigned char c); uint8_t serial_tx_active(serial_t *obj); uint8_t serial_rx_active(serial_t *obj);