读写串口模块 读取字符串转化成数字 如字符串"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];
}