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

第65节:大数据的除法运算

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

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

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

网站地图

Top