微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第43节:通过串口用计数延时方式发送一串数据

第43节:通过串口用计数延时方式发送一串数据

时间:11-22 来源:互联网 点击:

  1. 息两个核心函数,以及一个
  2. * 统计消息总数的uiMessageCnt核心变量,通过此变量,我们可以知道消息队列里面是否有消息需要处理.
  3. * 我在做项目中很少用消息队列的,印象中我只在两个项目中用过消息队列这种方法。大部分的单片机
  4. * 项目其实直接用一两个中间变量就可以起到传递消息的作用,就能满足系统的要求。以下是各变量的含义:
  5. * #define const_Message_size10//环形消息队列的缓冲区数组大小
  6. * unsigned char ucMessageBuf[const_Message_size]; //环形消息队列的缓冲区数据
  7. * unsigned intuiMessageCurrent=0;//环形消息队列的取数据当前位置
  8. * unsigned intuiMessageInsert=0;//环形消息队列的插入新消息时候的位置
  9. * unsigned intuiMessageCnt=0;//统计环形消息队列的消息数量等于0时表示消息队列里没有消息
  10. */
  11. void insert_message(unsigned char ucMessageTemp)//插入新的消息到环形消息队列里
  12. {
  13. if(uiMessageCnt
  14. {
  15. ucMessageBuf[uiMessageInsert]=ucMessageTemp;
  16. uiMessageInsert++;//插入新消息时候的位置
  17. if(uiMessageInsert>=const_Message_size) //到了缓冲区末尾,则从缓冲区的开头重新开始。数组的首尾连接,看起来就像环形
  18. {
  19. uiMessageInsert=0;
  20. }
  21. uiMessageCnt++; //消息数量累加等于0时表示消息队列里没有消息
  22. }
  23. }
  24. unsigned char get_message(void)//从环形消息队列里提取消息
  25. {
  26. unsigned char ucMessageTemp=0;//返回的消息中间变量,默认为0
  27. if(uiMessageCnt>0)//只有消息数量大于0时才可以提取消息
  28. {
  29. ucMessageTemp=ucMessageBuf[uiMessageCurrent];
  30. uiMessageCurrent++;//环形消息队列的取数据当前位置
  31. if(uiMessageCurrent>=const_Message_size) //到了缓冲区末尾,则从缓冲区的开头重新开始。数组的首尾连接,看起来就像环形
  32. {
  33. uiMessageCurrent=0;
  34. }
  35. uiMessageCnt--; //每提取一次,消息数量就减一等于0时表示消息队列里没有消息
  36. }
  37. return ucMessageTemp;
  38. }
  39. void send_service(void)//利用累计主循环次数的计数延时方式来发送一串数据
  40. {
  41. switch(ucSendStep)//发送一串数据的运行步骤
  42. {
  43. case 0: //从环形消息队列里提取消息
  44. if(uiMessageCnt>0)//说明有消息需要处理
  45. {
  46. ucMessage=get_message();
  47. switch(ucMessage) //消息处理
  48. {
  49. case 1:
  50. ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
  51. ucSendregBuf[1]=0x00;
  52. ucSendregBuf[2]=0x55;
  53. ucSendregBuf[3]=0x01; //01代表1号键
  54. ucSendregBuf[4]=0x00;
  55. ucSendregBuf[5]=0x00;
  56. ucSendregBuf[6]=0x00;
  57. ucSendregBuf[7]=0x00;
  58. ucSendregBuf[8]=0x41;
  59. uiSendCnt=0; //发送数据的中间变量清零
  60. uiSendTimeCnt=0; //累计主循环次数的计数延时器清零
  61. ucSendStep=1; //切换到下一步发送一串数据
  62. break;
  63. case 2:
  64. ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
  65. ucSendregBuf[1]=0x00;
  66. ucSendregBuf[2]=0x55;
  67. ucSendregBuf[3]=0x02; //02代表2号键
  68. ucSendregBuf[4]=0x00;
  69. ucSendregBuf[5]=0x00;
  70. ucSendregBuf[6]=0x00;
  71. ucSendregBuf[7]=0x00;
  72. ucSendregBuf[8]=0x42;
  73. uiSendCnt=0; //发送数据的中间变量清零
  74. uiSendTimeCnt=0; //累计主循环次数的计数延时器清零
  75. ucSendStep=1; //切换到下一步发送一串数据
  76. break;
  77. case 3:
  78. ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
  79. ucSendregBuf[1]=0x00;
  80. ucSendregBuf[2]=0x55;
  81. ucSendregBuf[3]=0x03; //03代表3号键
  82. ucSendregBuf[4]=0x00;
  83. ucSendregBuf[5]=0x00;
  84. ucSendregBuf[6]=0x00;
  85. ucSendregBuf[7]=0x00;
  86. ucSendregBuf[8]=0x43;
  87. uiSendCnt=0; //发送数据的中间变量清零
  88. uiSendTimeCnt=0; //累计主循环次数的计数延时器清零
  89. ucSendStep=1; //切换到下一步发送一串数据
  90. break;
  91. case 4:
  92. ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
  93. ucSendregBuf[1]=0x00;
  94. ucSendregBuf[2]=0x55;
  95. ucSendregBuf[3]=0x04; //04代表4号键
  96. ucSendregBuf[4]=0x00;
  97. ucSendregBuf[5]=0x00;
  98. ucSendregBuf[6]=0x00;
  99. ucSendregBuf[7]=0x00;
  100. ucSendregBuf[8]=0x44;
  101. uiSendCnt=0; //发送

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top