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

第62节:大数据的加法运算

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

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

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

网站地图

Top