微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 第63节:大数据的减法运算

第63节:大数据的减法运算

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

  1. 数组。
  2. *返回值:9代表小于,10代表相等,11代表大于。
  3. */
  4. uchar CmpData(const uchar *destData,const uchar *sourceData)
  5. {
  6. uchar cmpResult=10; //开始默认相等
  7. uchar destCnt=0;
  8. uchar sourceCnt=0;
  9. uchar i;
  10. destCnt=GetDataLength(destData,BCD8_MAX);
  11. sourceCnt=GetDataLength(sourceData,BCD8_MAX);
  12. if(destCnt>sourceCnt)//大于
  13. {
  14. cmpResult=11;
  15. }
  16. else if(destCnt
  17. {
  18. cmpResult=9;
  19. }
  20. else if((destCnt==0)&&(sourceCnt==0))//如果都是等于0则等于
  21. {
  22. cmpResult=10;
  23. }
  24. else//否则就要继续判断
  25. {
  26. for(i=0;i
  27. {
  28. if(destData[destCnt-1-i]>sourceData[destCnt-1-i]) //从最高位开始判断,如果最高位大于则大于
  29. {
  30. cmpResult=11;
  31. break;
  32. }
  33. else if(destData[destCnt-1-i]
  34. {
  35. cmpResult=9;
  36. break;
  37. }
  38. //否则继续判断下一位
  39. }
  40. }
  41. return cmpResult;
  42. }
  43. /* 注释七:
  44. *函数介绍:两个数相减
  45. *输入参数:
  46. *(1)*destData--被减数的数组。
  47. *(2)*sourceData--减数的数组。
  48. *(3)*resultData--差的数组。注意,调用本函数前,必须先把这个数组清零
  49. *返回值:10代表计算结果是负数或者超出范围出错,11代表正常。
  50. */
  51. uchar SubData(const uchar *destData,const uchar *sourceData,uchar *resultData)
  52. {
  53. uchar subResult=11; //开始默认正常
  54. uchar destCnt=0;
  55. uchar i;
  56. uchar carryData=0;//进位
  57. uchar maxCnt=0; //最大位数
  58. uchar resultTemp=0; //存放临时运算结果的中间变量
  59. //为什么不在本函数内先把resultData数组清零?因为后面章节中的除法运算中要用到此函数实现连减功能。
  60. //因此如果纯粹实现减法运算时,在调用本函数之前,必须先在外面把差的数组清零,否则会计算出错。
  61. if(CmpData(destData,sourceData)==9)//被减数小于减数,报错
  62. {
  63. subResult=10;
  64. return subResult;//返回判断结果,并且退出本程序,不往下执行本程序余下代码
  65. }
  66. destCnt=GetDataLength(destData,BCD8_MAX);//获取被减数的有效数据长度
  67. maxCnt=destCnt;
  68. for(i=0;i
  69. {
  70. resultTemp=sourceData[i]+carryData; //按位相加
  71. if(resultTemp>destData[i])
  72. {
  73. resultData[i]=destData[i]+10-sourceData[i]-carryData; //借位
  74. carryData=1;
  75. }
  76. else
  77. {
  78. resultData[i]=destData[i]-sourceData[i]-carryData; //不用借位
  79. carryData=0;
  80. }
  81. }
  82. return subResult;
  83. }
  84. void usart_service(void)//串口服务程序,在main函数里
  85. {
  86. unsigned char i=0;
  87. unsigned char k=0;
  88. unsigned char ucGetDataStep=0;
  89. if(uiSendCnt>=const_receive_time&&ucSendLock==1) //说明超过了一定的时间内,再也没有新数据从串口来
  90. {
  91. ucSendLock=0; //处理一次就锁起来,不用每次都进来,除非有新接收的数据
  92. //下面的代码进入数据协议解析和数据处理的阶段
  93. uiRcMoveIndex=0; //由于是判断数据头,所以下标移动变量从数组的0开始向最尾端移动
  94. while(uiRcMoveIndex
  95. {
  96. if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55)//数据头eb 00 55的判断
  97. {
  98. i=0;
  99. ucGetDataStep=0;
  100. ucDataBCD4_cnt_1=0;//第1个数组合BCD码数组的有效数据长度
  101. ucDataBCD4_cnt_2=0;//第2个数组合BCD码数组的有效数据长度
  102. ClearAllData(BCD4_MAX,ucDataBCD4_1);//清零第1个参与运算的数据
  103. ClearAllData(BCD4_MAX,ucDataBCD4_2);//清零第2个参与运算的数据
  104. //以下while循环是通过关键字0x0d 0x0a来截取第1个和第2个参与运算的数据。
  105. while(i<(BCD8_MAX+4))//这里+4是因为有2对0x0d 0x0a结尾特殊符号,一个共4个字节
  106. {
  107. if(ucGetDataStep==0)//步骤0,相当于我平时用的case 0,获取第1个数,在这里是指被加数
  108. {
  109. if(ucRcregBuf[uiRcMoveIndex+3+i]==0x0d&&ucRcregBuf[uiRcMoveIndex+4+i]==0x0a) //结束标志
  110. {
  111. for(k=0;k
  112. {
  113. ucDataBCD4_1[k]=ucRcregBuf[uiRcMoveIndex+3+i-1-k]; //注意,接收到的数组数据与实际存储的数组数据的下标方向是相反的
  114. }
  115. i=i+2; //跳过 0x0d 0x0a 这两个字节,进行下一轮的关键字提取
  116. ucGetDataStep=1;//切换到下一个关键字提取的步骤
  117. }
  118. else
  119. {
  120. i++;
  121. ucDataBCD4_cnt_1++;//统计第1个有效数据的长度
  122. }
  123. }
  124. else if(ucGetDataStep==1) //步骤1,相当于我平时用的

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

网站地图

Top