@@ -79,10 +79,6 @@ void arduino::ZephyrSerial::IrqHandler()
79
79
return ;
80
80
}
81
81
82
- if (ring_buf_size_get (&tx.ringbuf ) == 0 ) {
83
- uart_irq_tx_disable (uart);
84
- }
85
-
86
82
k_sem_take (&rx.sem , K_NO_WAIT);
87
83
while (uart_irq_rx_ready (uart) && ((length = uart_fifo_read (uart, buf, sizeof (buf))) > 0 )) {
88
84
length = min (sizeof (buf), static_cast <size_t >(length));
@@ -95,6 +91,11 @@ void arduino::ZephyrSerial::IrqHandler()
95
91
k_sem_give (&rx.sem );
96
92
97
93
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
+
98
99
while (uart_irq_tx_ready (uart) && ((length = ring_buf_size_get (&tx.ringbuf )) > 0 )) {
99
100
length = min (sizeof (buf), static_cast <size_t >(length));
100
101
ring_buf_peek (&tx.ringbuf , &buf[0 ], length);
@@ -149,19 +150,28 @@ int arduino::ZephyrSerial::read()
149
150
150
151
size_t arduino::ZephyrSerial::write (const uint8_t *buffer, size_t size)
151
152
{
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 ;
157
154
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
+ }
160
170
}
161
171
162
172
uart_irq_tx_enable (uart);
163
173
164
- return ret ;
174
+ return size ;
165
175
}
166
176
167
177
#if DT_NODE_HAS_PROP(DT_PATH(zephyr_user), serials)
0 commit comments