微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第44节:从机的串口收发综合程序框架

第44节:从机的串口收发综合程序框架

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

  1. 成一个int类型的数据
  2. uiSetData3=uiSetData3<8;
  3. uiSetData3=uiSetData3+ucRcregBuf[uiRcMoveIndex+7];
  4. ucWd3Update=1; //窗口3更新显示
  5. break;
  6. case 0x04: //设置参数4
  7. ucStatus=0; //从设置参数4结束发送数据的状态,表示发送数据的过程成功,切换回待机状态
  8. uiSetData4=ucRcregBuf[uiRcMoveIndex+6];//把两个字节合并成一个int类型的数据
  9. uiSetData4=uiSetData4<8;
  10. uiSetData4=uiSetData4+ucRcregBuf[uiRcMoveIndex+7];
  11. ucWd4Update=1; //窗口4更新显示
  12. break;
  13. }
  14. ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
  15. ucSendregBuf[1]=0x00;
  16. ucSendregBuf[2]=0x55;
  17. ucSendregBuf[3]=0xf5;//代表校验正确
  18. ucSendregBuf[4]=0x00;
  19. ucSendregBuf[5]=0x00;
  20. ucSendregBuf[6]=0x35;
  21. for(i=0;i<7;i++)//返回校验正确的应答指令
  22. {
  23. eusart_send(ucSendregBuf[i]);//发送一串数据给上位机
  24. }
  25. }
  26. else
  27. {
  28. ucSendTimeOutLock=1; //原子锁加锁
  29. uiSendTimeOutCnt=0;//超时计时器计时清零
  30. ucSendTimeOutLock=0; //原子锁解锁
  31. ucSendregBuf[0]=0xeb; //把准备发送的数据放入发送缓冲区
  32. ucSendregBuf[1]=0x00;
  33. ucSendregBuf[2]=0x55;
  34. ucSendregBuf[3]=0xfa; //代表校验错误
  35. ucSendregBuf[4]=0x00;
  36. ucSendregBuf[5]=0x00;
  37. ucSendregBuf[6]=0x3a;
  38. for(i=0;i<7;i++)//返回校验错误的应答指令
  39. {
  40. eusart_send(ucSendregBuf[i]);//发送一串数据给上位机
  41. }
  42. }
  43. ucSendTimeOutLock=1; //原子锁加锁
  44. uiSendTimeOutCnt=0;//超时计时器计时清零
  45. ucSendTimeOutLock=0; //原子锁解锁
  46. break; //退出循环
  47. }
  48. uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动
  49. }
  50. uiRcregTotal=0;//清空缓冲的下标,方便下次重新从0下标开始接受新数据
  51. }
  52. }
  53. void eusart_send(unsigned char ucSendData) //发送一个字节,内部自带每个字节之间的delay延时
  54. {
  55. ES = 0; //关串口中断
  56. TI = 0; //清零串口发送完成中断请求标志
  57. SBUF =ucSendData; //发送一个字节
  58. delay_short(400);//每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调整
  59. TI = 0; //清零串口发送完成中断请求标志
  60. ES = 1; //允许串口中断
  61. }
  62. void display_service(void) //显示的窗口菜单服务程序
  63. {
  64. switch(ucWd)//本程序的核心变量,窗口显示变量。类似于一级菜单的变量。代表显示不同的窗口。
  65. {
  66. case 1: //显示P--1窗口的数据
  67. if(ucWd1Update==1)//窗口1要全部更新显示
  68. {
  69. ucWd1Update=0;//及时清零标志,避免一直进来扫描
  70. ucDigShow8=12;//第8位数码管显示P
  71. ucDigShow7=11;//第7位数码管显示-
  72. ucDigShow6=1; //第6位数码管显示1
  73. ucDigShow5=10;//第5位数码管显示无
  74. //先分解数据
  75. ucTemp4=uiSetData1/1000;
  76. ucTemp3=uiSetData1%1000/100;
  77. ucTemp2=uiSetData1%100/10;
  78. ucTemp1=uiSetData1%10;
  79. //再过渡需要显示的数据到缓冲变量里,让过渡的时间越短越好
  80. if(uiSetData1<1000)
  81. {
  82. ucDigShow4=10;//如果小于1000,千位显示无
  83. }
  84. else
  85. {
  86. ucDigShow4=ucTemp4;//第4位数码管要显示的内容
  87. }
  88. if(uiSetData1<100)
  89. {
  90. ucDigShow3=10;//如果小于100,百位显示无
  91. }
  92. else
  93. {
  94. ucDigShow3=ucTemp3;//第3位数码管要显示的内容
  95. }
  96. if(uiSetData1<10)
  97. {
  98. ucDigShow2=10;//如果小于10,十位显示无
  99. }
  100. else
  101. {
  102. ucDigShow2=ucTemp2;//第2位数码管要显示的内容
  103. }
  104. ucDigShow1=ucTemp1;//第1位数码管要显示的内容
  105. }
  106. break;
  107. case 2://显示P--2窗口的数据
  108. if(ucWd2Update==1)//窗口2要全部更新显示
  109. {
  110. ucWd2Update=0;//及时清零标志,避免一直进来扫描
  111. ucDigShow8=12;//第8位数码管显示P
  112. ucDigShow7=11;//第7位数码管显示-
  113. ucDigShow6=2;//第

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

网站地图

Top