static int f_uwrite(int uart, char* data) { if (_argc != 2 || !IS_STRING(data)) { return -1; } if (uart < 0 || uart >= CONFIG_UART_CNT) { return -1; } char c; while ((c = *data++) != 0) { UART_put_char(_UART(uart), c); } return 0; }
s32_t UART_put_buf(uart *u, u8_t* c, u16_t len) { if (UART_ALWAYS_SYNC_TX || u->sync_tx) { u16_t tlen = len; while (tlen-- > 0) { UART_put_char(u, *c++); } return len; } else { u32_t written = 0; u16_t guard = 0; do { u16_t avail = UART_tx_available(u); s32_t len_to_write = MIN(len - written, avail); guard++; if (len_to_write == 0) { while (UART_CHECK_TX(u) == 0) ; len_to_write = 1; } guard = 0; u32_t remaining = len_to_write; u32_t len_to_end = UART_TX_BUFFER - u->tx.wix; if (remaining > len_to_end) { memcpy(&u->tx.buf[u->tx.wix], c, len_to_end); c += len_to_end; remaining -= len_to_end; u->tx.wix = 0; } memcpy(&u->tx.buf[u->tx.wix], c, remaining); c += remaining; u->tx.wix += remaining; if (u->tx.wix >= UART_RX_BUFFER) { u->tx.wix = 0; } UART_SET_TX_IRQ_ON(u); written += len_to_write; } while (u->assure_tx && written < len && guard < 0xff); return written; } }