uart_flush_rx.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * Copyright (c) 2006-2024 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. *
  9. */
  10. #include <rtthread.h>
  11. #include "utest.h"
  12. #include <rtdevice.h>
  13. #include <stdlib.h>
  14. #ifdef UTEST_SERIAL_TC
  15. static struct rt_serial_device *serial;
  16. static rt_err_t uart_find(void)
  17. {
  18. serial = (struct rt_serial_device *)rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
  19. if (serial == RT_NULL)
  20. {
  21. LOG_E("find %s device failed!\n", RT_SERIAL_TC_DEVICE_NAME);
  22. return -RT_ERROR;
  23. }
  24. return RT_EOK;
  25. }
  26. static rt_err_t test_item(rt_uint8_t *uart_write_buffer, rt_uint32_t send_size)
  27. {
  28. rt_uint8_t readBuf[16] = {0};
  29. rt_uint32_t readSize = 0;
  30. if (send_size >= sizeof(readBuf))
  31. {
  32. readSize = sizeof(readBuf);
  33. }
  34. else
  35. {
  36. readSize = send_size;
  37. }
  38. rt_ssize_t size = rt_device_write(&serial->parent, 0, uart_write_buffer, send_size);
  39. if (size != send_size)
  40. {
  41. LOG_E("size [%4d], send_size [%4d]", size, send_size);
  42. return -RT_ERROR;
  43. }
  44. rt_thread_mdelay(send_size * 0.0868 + 5);
  45. if (1 != rt_device_read(&serial->parent, 0, uart_write_buffer, 1))
  46. {
  47. LOG_E("read failed.");
  48. return -RT_ERROR;
  49. }
  50. rt_device_control(&serial->parent, RT_SERIAL_CTRL_RX_FLUSH, RT_NULL);
  51. if (0 != rt_device_read(&serial->parent, 0, uart_write_buffer, 1))
  52. {
  53. LOG_E("read failed.");
  54. return -RT_ERROR;
  55. }
  56. /* Resend the data and check for any discrepancies upon reception */
  57. if (readSize > 0)
  58. {
  59. rt_device_write(&serial->parent, 0, uart_write_buffer, readSize);
  60. rt_thread_mdelay(readSize * 0.0868 + 5);
  61. rt_device_read(&serial->parent, 0, readBuf, readSize);
  62. for (rt_uint32_t i = 0; i < readSize; i++)
  63. {
  64. if (readBuf[i] != uart_write_buffer[i])
  65. {
  66. LOG_E("index: %d, Read Different data -> former data: %x, current data: %x.", i, uart_write_buffer[i], readBuf[i]);
  67. return -RT_ERROR;
  68. }
  69. }
  70. }
  71. LOG_I("flush rx send_size [%4d]", send_size);
  72. return RT_EOK;
  73. }
  74. static rt_bool_t uart_api()
  75. {
  76. rt_err_t result = RT_EOK;
  77. result = uart_find();
  78. if (result != RT_EOK)
  79. {
  80. return RT_FALSE;
  81. }
  82. /* Reinitialize */
  83. struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
  84. config.baud_rate = BAUD_RATE_115200;
  85. config.rx_bufsz = RT_SERIAL_TC_RXBUF_SIZE;
  86. config.tx_bufsz = RT_SERIAL_TC_TXBUF_SIZE;
  87. #ifdef RT_SERIAL_USING_DMA
  88. config.dma_ping_bufsz = RT_SERIAL_TC_RXBUF_SIZE / 2;
  89. #endif
  90. rt_device_control(&serial->parent, RT_DEVICE_CTRL_CONFIG, &config);
  91. result = rt_device_open(&serial->parent, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
  92. if (result != RT_EOK)
  93. {
  94. LOG_E("Open uart device failed.");
  95. return RT_FALSE;
  96. }
  97. rt_uint8_t *uart_write_buffer;
  98. rt_uint32_t i;
  99. uart_write_buffer = (rt_uint8_t *)rt_malloc(RT_SERIAL_TC_RXBUF_SIZE * 5 + 1);
  100. for (rt_uint32_t count = 0; count < (RT_SERIAL_TC_RXBUF_SIZE * 5 + 1); count++)
  101. {
  102. uart_write_buffer[count] = count;
  103. }
  104. srand(rt_tick_get());
  105. for (i = 0; i < RT_SERIAL_TC_SEND_ITERATIONS; i++)
  106. {
  107. if (RT_EOK != test_item(uart_write_buffer, RT_SERIAL_TC_RXBUF_SIZE + RT_SERIAL_TC_RXBUF_SIZE * (rand() % 5)))
  108. {
  109. LOG_E("test_item failed.");
  110. result = -RT_ERROR;
  111. goto __exit;
  112. }
  113. if (RT_EOK != test_item(uart_write_buffer, rand() % (RT_SERIAL_TC_RXBUF_SIZE * 5)))
  114. {
  115. LOG_E("test_item failed.");
  116. result = -RT_ERROR;
  117. goto __exit;
  118. }
  119. }
  120. __exit:
  121. rt_free(uart_write_buffer);
  122. rt_device_close(&serial->parent);
  123. rt_thread_mdelay(5);
  124. return result == RT_EOK ? RT_TRUE : RT_FALSE;
  125. }
  126. static void tc_uart_api(void)
  127. {
  128. uassert_true(uart_api() == RT_TRUE);
  129. }
  130. static rt_err_t utest_tc_init(void)
  131. {
  132. LOG_I("UART TEST: Please connect Tx and Rx directly for self testing.");
  133. return RT_EOK;
  134. }
  135. static rt_err_t utest_tc_cleanup(void)
  136. {
  137. rt_device_t uart_dev = rt_device_find(RT_SERIAL_TC_DEVICE_NAME);
  138. while (rt_device_close(uart_dev) != -RT_ERROR);
  139. return RT_EOK;
  140. }
  141. static void testcase(void)
  142. {
  143. UTEST_UNIT_RUN(tc_uart_api);
  144. }
  145. UTEST_TC_EXPORT(testcase, "testcases.drivers.uart_flush_rx", utest_tc_init, utest_tc_cleanup, 30);
  146. #endif /* TC_UART_USING_TC */