微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第88节:单片机靠关键字快速截取有效数据串

第88节:单片机靠关键字快速截取有效数据串

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

  1. ;//数码管6的小数点是否显示的标志
  2. unsigned char ucDigDot5;//数码管5的小数点是否显示的标志
  3. unsigned char ucDigDot4;//数码管4的小数点是否显示的标志
  4. unsigned char ucDigDot3;//数码管3的小数点是否显示的标志
  5. unsigned char ucDigDot2;//数码管2的小数点是否显示的标志
  6. unsigned char ucDigDot1;//数码管1的小数点是否显示的标志
  7. unsigned char ucDigShowTemp=0; //临时中间变量
  8. unsigned char ucDisplayDriveStep=1;//动态扫描数码管的步骤变量
  9. unsigned char ucWd1Part1Update=1; //8位数码管更新显示标志
  10. unsigned long ulWeightCurrent=12345; //显示当前实际的重量
  11. void main()
  12. {
  13. initial_myself();
  14. delay_long(100);
  15. initial_peripheral();
  16. while(1)
  17. {
  18. usart_service();//串口接收服务程序
  19. display_service(); //显示的窗口菜单服务程序
  20. }
  21. }
  22. /* 注释一:
  23. * 本节内容处理串口数据是根据数据尾是否有0x0d 0x0a来判断数据串是否有效的,一旦发现有此关键字,
  24. * 再判断总的数据长度是否等于或者大于一串数据的固定长度,如果满足,则把相关标志位置位,通知主函数中
  25. * 的串口服务程序进行处理。同时也及时关闭串口中断,避免在处理串口数据期间受到串口数据的中断干扰,
  26. * 等串口服务程序处理完毕再打开。
  27. */
  28. void usart_receive(void) interrupt 4 //串口接收数据中断函数
  29. {
  30. if(RI==1)
  31. {
  32. RI = 0;
  33. ++uiRcregTotal;
  34. ucRcregBuf[uiRcregTotal-1]=SBUF; //将串口接收到的数据缓存到接收缓冲区里
  35. if(uiRcregTotal>=2&&ucRcregBuf[uiRcregTotal-2]==0x0d&&ucRcregBuf[uiRcregTotal-1]==0x0a)//一旦发现后缀是0x0d 0x0a关键字的就进去处理判断
  36. {
  37. if(uiRcregTotal
  38. {
  39. uiRcregTotal=0;
  40. }
  41. else
  42. {
  43. uiRcregTotalTemp=uiRcregTotal; //把接收到的总数据传递给一个中间变量,在主函数那边处理这个中间变量
  44. ucReceiveFlag=1; //通知主程序接收成功
  45. ES=0; // 禁止接收中断,等主函数处理完接收的数据后再打开串口中断,避免在处理串口数据期间受到串口数据的中断干扰。
  46. }
  47. }
  48. else if(uiRcregTotal>=const_rc_size)//超过缓冲区
  49. {
  50. uiRcregTotal=0;
  51. }
  52. }
  53. else //如果不是串口接收中断,那么必然是串口发送中断,及时清除发送中断的标志,否则一直发送中断
  54. {
  55. TI = 0;
  56. }
  57. }
  58. void usart_service(void)//串口接收服务程序,在main函数里
  59. {
  60. //加了static关键字后,此局部变量不会每次进来函数都初始化一次,这样有可能减少了一点指令消耗的时间。
  61. static unsigned long ulReceiveData10000; //定义成long类型,是为了方便后面换算的乘法运算,让它不会溢出而出错。
  62. static unsigned long ulReceiveData1000;
  63. static unsigned long ulReceiveData100;
  64. static unsigned long ulReceiveData10;
  65. static unsigned long ulReceiveData1;
  66. if(ucReceiveFlag==1)//说明有数据接收成功,进入数据处理分析
  67. {
  68. ulReceiveData10000=0;
  69. ulReceiveData1000=0;
  70. ulReceiveData100=0;
  71. ulReceiveData10=0;
  72. ulReceiveData1=0;
  73. /* 注释二:
  74. * 根据协议,倒数第9,10,11,12,13,14为有效的ASCII码数字,其中倒数第11位为固定的小数点,因此省略不写。
  75. */
  76. if(ucRcregBuf[uiRcregTotalTemp-9]>=0x30)
  77. {
  78. ulReceiveData1=ucRcregBuf[uiRcregTotalTemp-9]-0x30; //接收到的ASCII码数字减去0x30变成实际数值.
  79. }
  80. if(ucRcregBuf[uiRcregTotalTemp-10]>=0x30)
  81. {
  82. ulReceiveData10=ucRcregBuf[uiRcregTotalTemp-10]-0x30;
  83. ulReceiveData10=ulReceiveData10*10;
  84. }
  85. if(ucRcregBuf[uiRcregTotalTemp-12]>=0x30)
  86. {
  87. ulReceiveData100=ucRcregBuf[uiRcregTotalTemp-12]-0x30;
  88. ulReceiveData100=ulReceiveData100*100;
  89. }
  90. if(ucRcregBuf[uiRcregTotalTemp-13]>=0x30)
  91. {
  92. ulReceiveData1000=ucRcregBuf[uiRcregTotalTemp-13]-0x30;
  93. ulReceiveData1000=ulReceiveData1000*1000;
  94. }
  95. if(ucRcregBuf[uiRcregTotalTemp-14]>=0x30)
  96. {
  97. ulReceiveData10000=ucRcregBuf[uiRcregTotalTemp-14]-0x30;
  98. ulReceiveData10000=ulReceiveData10000*10000;
  99. }
  100. ulWeightCurrent=ulReceiveData10000+ulReceiveData1000+ulReceiveData100+ulReceiveData10+ulReceiveData1;
  101. ucWd1Part1Update=1; //更新显示
  102. uiRcregTotalTemp=0;//清零实际接收到的字节数的中间变量
  103. uiRcregTotal=0;//清零实际接收到的字节数
  104. ucRe

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

网站地图

Top