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

第64节:大数据的乘法运算

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

  1. if(ucRcregBuf[uiRcMoveIndex+0]==0xeb&&ucRcregBuf[uiRcMoveIndex+1]==0x00&&ucRcregBuf[uiRcMoveIndex+2]==0x55)//数据头eb 00 55的判断
  2. {
  3. i=0;
  4. ucGetDataStep=0;
  5. ucDataBCD4_cnt_1=0;//第1个数组合BCD码数组的有效数据长度
  6. ucDataBCD4_cnt_2=0;//第2个数组合BCD码数组的有效数据长度
  7. ClearAllData(BCD4_MAX,ucDataBCD4_1);//清零第1个参与运算的数据
  8. ClearAllData(BCD4_MAX,ucDataBCD4_2);//清零第2个参与运算的数据
  9. //以下while循环是通过关键字0x0d 0x0a来截取第1个和第2个参与运算的数据。
  10. while(i<(BCD8_MAX+4))//这里+4是因为有2对0x0d 0x0a结尾特殊符号,一个共4个字节
  11. {
  12. if(ucGetDataStep==0)//步骤0,相当于我平时用的case 0,获取第1个数,在这里是指被乘数
  13. {
  14. if(ucRcregBuf[uiRcMoveIndex+3+i]==0x0d&&ucRcregBuf[uiRcMoveIndex+4+i]==0x0a) //结束标志
  15. {
  16. for(k=0;k
  17. {
  18. ucDataBCD4_1[k]=ucRcregBuf[uiRcMoveIndex+3+i-1-k]; //注意,接收到的数组数据与实际存储的数组数据的下标方向是相反的
  19. }
  20. i=i+2; //跳过 0x0d 0x0a 这两个字节,进行下一轮的关键字提取
  21. ucGetDataStep=1;//切换到下一个关键字提取的步骤
  22. }
  23. else
  24. {
  25. i++;
  26. ucDataBCD4_cnt_1++;//统计第1个有效数据的长度
  27. }
  28. }
  29. else if(ucGetDataStep==1) //步骤1,相当于我平时用的case 1,获取第2个参与运行的数,在这里是乘数
  30. {
  31. if(ucRcregBuf[uiRcMoveIndex+3+i]==0x0d&&ucRcregBuf[uiRcMoveIndex+4+i]==0x0a) //结束标志
  32. {
  33. for(k=0;k
  34. {
  35. ucDataBCD4_2[k]=ucRcregBuf[uiRcMoveIndex+3+i-1-k]; //注意,接收到的数组数据与实际存储的数组数据的下标方向是相反的
  36. }
  37. break; //截取数据完成。直接跳出截取数据的while(i<(BCD8_MAX+4))循环
  38. }
  39. else
  40. {
  41. i++;
  42. ucDataBCD4_cnt_2++;//统计第2个有效数据的长度
  43. }
  44. }
  45. }
  46. //注意ucDataBCD8_cnt_1和ucDataBCD8_cnt_2要带地址符号&传址进去
  47. BCD4_to_BCD8(ucDataBCD4_1,ucDataBCD4_cnt_1,ucDataBCD8_1,&ucDataBCD8_cnt_1); //把接收到的组合BCD码转换成非组合BCD码第1个数
  48. BCD4_to_BCD8(ucDataBCD4_2,ucDataBCD4_cnt_2,ucDataBCD8_2,&ucDataBCD8_cnt_2); //把接收到的组合BCD码转换成非组合BCD码第2个数
  49. ClearAllData(BCD8_MAX,ucDataBCD8_3);//清零第3个参与运算的数据,用来接收运行的结果
  50. ucResultFlag=MultData(ucDataBCD8_1,ucDataBCD8_2,ucDataBCD8_3); //相乘运算,结果放在ucDataBCD8_3数组里
  51. if(ucResultFlag==11) //表示运算结果没有超范围
  52. {
  53. ucDataBCD8_cnt_3=GetDataLength(ucDataBCD8_3,BCD8_MAX);//获取运算结果的有效字节数
  54. if(ucDataBCD8_cnt_3==0) //如果1个有效位数都没有,表示数组所有的数据都是0,这个时候的有效位数应该人为的默认是1,表示一个0
  55. {
  56. ucDataBCD8_cnt_3=1;
  57. }
  58. BCD8_to_BCD4(ucDataBCD8_3,ucDataBCD8_cnt_3,ucDataBCD4_3,&ucDataBCD4_cnt_3); //把非组合BCD码转成组合BCD码。注意,&ucDataBCD4_cnt_3带地址符号&
  59. for(k=0;k
  60. {
  61. eusart_send(ucDataBCD4_3[ucDataBCD4_cnt_3-1-k]); //往上位机发送一个字节的函数
  62. }
  63. }
  64. else //运算结果超范围,返回EE EE EE
  65. {
  66. eusart_send(0xee); //往上位机发送一个字节的函数
  67. eusart_send(0xee); //往上位机发送一个字节的函数
  68. eusart_send(0xee); //往上位机发送一个字节的函数
  69. }
  70. break; //退出循环
  71. }
  72. uiRcMoveIndex++; //因为是判断数据头,游标向着数组最尾端的方向移动
  73. }
  74. ucRcregBuf[0]=0; //把数据头清零,方便下次接收判断新数据
  75. ucRcregBuf[1]=0;
  76. ucRcregBuf[2]=0;
  77. uiRcregTotal=0;//清空缓冲的下标,方便下次重新从0下标开始接受新数据
  78. }
  79. }
  80. void eusart_send(unsigned char ucSendData) //往上位机发送一个字节的函数
  81. {
  82. ES = 0; //关串口中断
  83. TI = 0; //清

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

网站地图

Top