Skip to content

Commit 88b25bb

Browse files
committed
Serial: fix long write()
1 parent 073044d commit 88b25bb

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

cores/arduino/zephyrSerial.cpp

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,6 @@ void arduino::ZephyrSerial::IrqHandler()
7979
return;
8080
}
8181

82-
if (ring_buf_size_get(&tx.ringbuf) == 0) {
83-
uart_irq_tx_disable(uart);
84-
}
85-
8682
k_sem_take(&rx.sem, K_NO_WAIT);
8783
while (uart_irq_rx_ready(uart) && ((length = uart_fifo_read(uart, buf, sizeof(buf))) > 0)) {
8884
length = min(sizeof(buf), static_cast<size_t>(length));
@@ -95,6 +91,11 @@ void arduino::ZephyrSerial::IrqHandler()
9591
k_sem_give(&rx.sem);
9692

9793
k_sem_take(&tx.sem, K_NO_WAIT);
94+
95+
if (ring_buf_size_get(&tx.ringbuf) == 0) {
96+
uart_irq_tx_disable(uart);
97+
}
98+
9899
while (uart_irq_tx_ready(uart) && ((length = ring_buf_size_get(&tx.ringbuf)) > 0)) {
99100
length = min(sizeof(buf), static_cast<size_t>(length));
100101
ring_buf_peek(&tx.ringbuf, &buf[0], length);
@@ -149,19 +150,28 @@ int arduino::ZephyrSerial::read()
149150

150151
size_t arduino::ZephyrSerial::write(const uint8_t *buffer, size_t size)
151152
{
152-
int ret;
153-
154-
k_sem_take(&tx.sem, K_FOREVER);
155-
ret = ring_buf_put(&tx.ringbuf, buffer, size);
156-
k_sem_give(&tx.sem);
153+
int idx = 0;
157154

158-
if (ret < 0) {
159-
return 0;
155+
while (1) {
156+
k_sem_take(&tx.sem, K_FOREVER);
157+
auto ret = ring_buf_put(&tx.ringbuf, &buffer[idx], size-idx);
158+
k_sem_give(&tx.sem);
159+
if (ret < 0) {
160+
return 0;
161+
}
162+
idx += ret;
163+
if (ret == 0) {
164+
uart_irq_tx_enable(uart);
165+
yield();
166+
}
167+
if (idx == size) {
168+
break;
169+
}
160170
}
161171

162172
uart_irq_tx_enable(uart);
163173

164-
return ret;
174+
return size;
165175
}
166176

167177
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), serials)

0 commit comments

Comments
 (0)