drv_rs485.c 3.2 KB

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