usart_sim.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. #include <rtthread.h>
  2. #include <windows.h>
  3. #include <mmsystem.h>
  4. #include <stdio.h>
  5. #include "serial.h"
  6. struct serial_int_rx serial_rx;
  7. extern struct rt_device serial_device;
  8. /*
  9. * Handler for OSKey Thread
  10. */
  11. static HANDLE OSKey_Thread;
  12. static DWORD OSKey_ThreadID;
  13. static DWORD WINAPI ThreadforKeyGet(LPVOID lpParam);
  14. void rt_hw_usart_init(void)
  15. {
  16. /*
  17. * create serial thread that revice key input from keyboard
  18. */
  19. OSKey_Thread = CreateThread(NULL,
  20. 0,
  21. (LPTHREAD_START_ROUTINE)ThreadforKeyGet,
  22. 0,
  23. CREATE_SUSPENDED,
  24. &OSKey_ThreadID);
  25. if (OSKey_Thread == NULL)
  26. {
  27. //Display Error Message
  28. return;
  29. }
  30. SetThreadPriority(OSKey_Thread,
  31. THREAD_PRIORITY_NORMAL);
  32. SetThreadPriorityBoost(OSKey_Thread,
  33. TRUE);
  34. SetThreadAffinityMask(OSKey_Thread,
  35. 0x01);
  36. /*
  37. * Start OS get key Thread
  38. */
  39. ResumeThread(OSKey_Thread);
  40. }
  41. /*
  42. * 方向键(←): 0xe04b
  43. * 方向键(↑): 0xe048
  44. * 方向键(→): 0xe04d
  45. * 方向键(↓): 0xe050
  46. */
  47. static int savekey(unsigned char key)
  48. {
  49. /* save on rx buffer */
  50. {
  51. rt_base_t level;
  52. /* disable interrupt */
  53. //暂时关闭中断,因为要操作uart数据结构
  54. level = rt_hw_interrupt_disable();
  55. /* save character */
  56. serial_rx.rx_buffer[serial_rx.save_index] = key;
  57. serial_rx.save_index ++;
  58. //下面的代码检查save_index是否已经到到缓冲区尾部,如果是则回转到头部,称为一个环形缓冲区
  59. if (serial_rx.save_index >= SERIAL_RX_BUFFER_SIZE)
  60. serial_rx.save_index = 0;
  61. //这种情况表示反转后的save_index追上了read_index,则增大read_index,丢弃一个旧的数据
  62. /* if the next position is read index, discard this 'read char' */
  63. if (serial_rx.save_index == serial_rx.read_index)
  64. {
  65. serial_rx.read_index ++;
  66. if (serial_rx.read_index >= SERIAL_RX_BUFFER_SIZE)
  67. serial_rx.read_index = 0;
  68. }
  69. /* enable interrupt */
  70. //uart数据结构已经操作完成,重新使能中断
  71. rt_hw_interrupt_enable(level);
  72. }
  73. /* invoke callback */
  74. if (serial_device.rx_indicate != RT_NULL)
  75. {
  76. rt_size_t rx_length;
  77. /* get rx length */
  78. rx_length = serial_rx.read_index > serial_rx.save_index ?
  79. SERIAL_RX_BUFFER_SIZE - serial_rx.read_index + serial_rx.save_index :
  80. serial_rx.save_index - serial_rx.read_index;
  81. serial_device.rx_indicate(&serial_device, rx_length);
  82. }
  83. return 0;
  84. }
  85. static DWORD WINAPI ThreadforKeyGet(LPVOID lpParam)
  86. {
  87. unsigned char key;
  88. (void)lpParam; //prevent compiler warnings
  89. for (;;)
  90. {
  91. key = _getch();//getchar();
  92. if (key == 0xE0)
  93. {
  94. key = _getch();
  95. if (key == 0x48) //up key , 0x1b 0x5b 0x41
  96. {
  97. savekey(0x1b);
  98. savekey(0x5b);
  99. savekey(0x41);
  100. }
  101. else if (key == 0x50)//0x1b 0x5b 0x42
  102. {
  103. savekey(0x1b);
  104. savekey(0x5b);
  105. savekey(0x42);
  106. }
  107. continue;
  108. }
  109. savekey(key);
  110. }
  111. } /*** ThreadforKeyGet ***/