字符串数据转换为数值

读写串口模块 读取字符串转化成数字 如字符串"25000\r\n" 转换成0d25000;

字符串"190\r\n" 转换成0d190;(值在190~25000之间)

设读取的数据为数组rdata[];

代码1

uint32_t num_wav=0;

uint8_t position=0;

uint8_t mav[5]={0};

do{

        if(rdata[position]==0x0d){

            break;

           }

        position++;

}while(position<5);

 for(uint8_t j=0;j<position;j++){

            mav[j]=rdata[j]-48;

        }

for(uint8_t j=0;j<position;j++){

            num_wav=num_wav+mav[j]*pow(10,position-j-1);

        }

后面整理一下写出一个公共的模块使用

思考:在判断/r的位置时 开始是选择使用了for循环 在for循环中去判断rdata[position]==0x0d?,后面发现发现在for循环中加入if判断 当rdata[position]==0x0d时,使用break只能跳出if判断不能跳出for循环,所以当rdata[3]==0x0d,for循环中已经记录position的值。但是由于无法跳出for循环所以会一直判断,如果后面的值有/r就会刷新position值 从而计算错误。

还有一个计算值累加   代码1的质量要比代码2好很多

开始写的是代码2,经过思考觉得可以去优化。嗯,代码看起来好多了。

这里注意一点,使用strcmp函数比较两个字符串时

定义的字符串会自动加'\0'结尾 ascii码值为0x00;

当串口接收到字符串 如 char str1[10]={0x31,0x0d,0x0a};    ///<1[CR][LF]

自定义一个字符串 char str2="1\r\n";

这时候int res=strcmp(str1,str2);

res的值不为0;

在str1数据后加入'\0'

str1[10]={0x31,0x0d,0x0a,0x00}; 

这啥

int res=strcmp(str1,str2);

res的值为0;两字符串相同

代码2

待修改的代码段

返回 <值>[CR][LF]

说明:1.234E-01[CR][LF]为0.1234   1.234E+00[CR][LF]1.234      2.345E+01[CR][LF]23.45

uint8_t num[6];

            float power_mw;

            uint32_t xx;

            num[0]=rdata[0]-48;

            num[1]=rdata[2]-48;

            num[2]=rdata[3]-48;

            num[3]=rdata[4]-48;

            num[4]=rdata[8]-48;

           


            xx=pow(10,num[4]);

            if(rdata[6]==0x2b){                                            ///< '+' ascii 0x2b

                power_mw=num[0]*1000.0f*xx+num[1]*100.0f*xx+num[2]*10.0f*xx+num[3]*xx;

            }else if(rdata[6]==0x2d){                                      ///< '-' ascii 0x2d

                power_mw=1000.0f/xx*num[0]+100.0f/xx*num[1]+10.0f/xx*num[2]+1.0f/xx*num[3];                

            }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值