* @brief Serial polling receive data routine, This function will receive data * in a continuous loop by one by one byte. * @param dev The pointer of device driver structure * @param pos Empty parameter. * @param buffer Receive data buffer. * @param size Receive data buffer length. * @return Return the final length of data received. */
| 376 | * @return Return the final length of data received. |
| 377 | */ |
| 378 | rt_ssize_t _serial_poll_rx(struct rt_device *dev, |
| 379 | rt_off_t pos, |
| 380 | void *buffer, |
| 381 | rt_size_t size) |
| 382 | { |
| 383 | struct rt_serial_device *serial; |
| 384 | rt_size_t getc_size; |
| 385 | int getc_element; /* Gets one byte of data received */ |
| 386 | rt_uint8_t *getc_buffer; /* Pointer to the receive data buffer */ |
| 387 | |
| 388 | RT_ASSERT(dev != RT_NULL && buffer != RT_NULL); |
| 389 | if (size == 0) return 0; |
| 390 | |
| 391 | serial = (struct rt_serial_device *)dev; |
| 392 | getc_buffer = (rt_uint8_t *)buffer; |
| 393 | getc_size = size; |
| 394 | |
| 395 | while (size) |
| 396 | { |
| 397 | getc_element = serial->ops->getc(serial); |
| 398 | if (getc_element < 0) break; |
| 399 | |
| 400 | *getc_buffer = getc_element; |
| 401 | |
| 402 | ++getc_buffer; |
| 403 | --size; |
| 404 | |
| 405 | if (serial->parent.open_flag & RT_DEVICE_FLAG_STREAM) |
| 406 | { |
| 407 | /* If open_flag satisfies RT_DEVICE_FLAG_STREAM |
| 408 | * and the received character is '\n', exit the loop directly */ |
| 409 | if (getc_element == '\n') break; |
| 410 | } |
| 411 | } |
| 412 | |
| 413 | return getc_size - size; |
| 414 | } |
| 415 | |
| 416 | /** |
| 417 | * @brief Serial polling transmit data routines, This function will transmit |