drv_rs485.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-10-24 thread-liu first version
  9. * 2023-05-05 yuanjie add test method
  10. */
  11. #include <board.h>
  12. #include "drv_rs485.h"
  13. #ifdef BSP_USING_RS485
  14. #define RS485_OUT rt_pin_write(BSP_RS485_RTS_PIN, PIN_HIGH)
  15. #define RS485_IN rt_pin_write(BSP_RS485_RTS_PIN, PIN_LOW)
  16. rt_device_t rs485_serial = {0};
  17. struct rt_semaphore rs485_rx_sem = {0};
  18. /* uart send data callback function */
  19. static rt_err_t rs485_output(rt_device_t dev, void * buffer)
  20. {
  21. return RT_EOK;
  22. }
  23. /* uart receive data callback function */
  24. static rt_err_t rs485_input(rt_device_t dev, rt_size_t size)
  25. {
  26. rt_sem_release(&rs485_rx_sem);
  27. return RT_EOK;
  28. }
  29. /* send string */
  30. int rs485_send_data(char *tbuf, rt_uint16_t t_len)
  31. {
  32. /* change rs485 mode */
  33. RS485_OUT;
  34. /* send data */
  35. rt_device_write(rs485_serial, 0, tbuf, t_len);
  36. /* change rs485 mode */
  37. RS485_IN;
  38. rt_kprintf("\nsend:");
  39. for(int i =0;i<t_len;i++)
  40. {
  41. rt_kprintf("%d:%x ",i,tbuf[i]);
  42. }
  43. return RT_EOK;
  44. }
  45. #ifndef BSP_USING_LED_MATRIX_RS485_DEMO
  46. static void rs485_thread_entry(void *parameter)
  47. {
  48. char ch;
  49. while (1)
  50. {
  51. /* A byte of data is read from a rs485_serial port, and if it is not read, it waits for the received semaphore */
  52. while (rt_device_read(rs485_serial, -1, &ch, 1) != 1)
  53. {
  54. rt_sem_take(&rs485_rx_sem, RT_WAITING_FOREVER);
  55. }
  56. // rt_kprintf("%c",ch);
  57. }
  58. }
  59. #endif
  60. /* rs485 rts pin init */
  61. int rs485_init(void)
  62. {
  63. /* find uart device */
  64. rs485_serial = rt_device_find(RS485_UART_DEVICE_NAME);
  65. if (!rs485_serial)
  66. {
  67. rt_kprintf("find %s failed!\n", RS485_UART_DEVICE_NAME);
  68. return -RT_ERROR;
  69. }
  70. rt_device_open(rs485_serial, RT_DEVICE_FLAG_INT_RX);
  71. /* set receive data callback function */
  72. rt_device_set_rx_indicate(rs485_serial, rs485_input);
  73. /* set the send completion callback function */
  74. rt_device_set_tx_complete(rs485_serial, rs485_output);
  75. rt_pin_mode(BSP_RS485_RTS_PIN, PIN_MODE_OUTPUT);
  76. RS485_IN;
  77. rt_sem_init(&rs485_rx_sem, "rs485_rx_sem", 0, RT_IPC_FLAG_FIFO);
  78. #ifndef BSP_USING_LED_MATRIX_RS485_DEMO
  79. /* create rs485 receive thread */
  80. rt_thread_t thread = rt_thread_create("rs485", rs485_thread_entry, RT_NULL, 1024, 25, 10);
  81. #else
  82. extern void led_matrix_receieve_task(void *parameter);
  83. rt_thread_t thread = rt_thread_create("rs485", led_matrix_receieve_task, RT_NULL, 1024, 20, 10);
  84. #endif
  85. if (thread != RT_NULL)
  86. {
  87. rt_thread_startup(thread);
  88. }
  89. else
  90. {
  91. return -RT_ERROR;
  92. }
  93. return RT_EOK;
  94. }
  95. // INIT_DEVICE_EXPORT(rs485_init);
  96. void rs485_test(int argc, void **argv)
  97. {
  98. char *str;
  99. if (argc == 1)
  100. {
  101. rt_kprintf("-t --Enter any keys to send.\n");
  102. }
  103. else if (argc == 3)
  104. {
  105. if (rt_strcmp(argv[1], "-t") == 0)
  106. {
  107. str = argv[2];
  108. rs485_send_data(str, rt_strnlen(str, 32));
  109. }
  110. }
  111. }
  112. MSH_CMD_EXPORT(rs485_test, test rs485 transmission);
  113. #endif /* bsp_using_RS485 */