图中结论:换行 0x0D,0X0A, TAB 0x09,空格 0x20
1写各种信息到M1卡,用户卡-管理员卡-配置卡,刷卡单片机读走数据,完成参数修改。---需要上位机配合写卡。
2屏幕UI,按键或者触屏修改。---比刷卡更可视化。
3蓝牙通讯,app发送数据。---需要开发移动app。
4放置指定名字的.txt,程序去读文件,比如树莓派那个我就是这么玩的。
后期任务;SD卡API升级
+++++++++++++++20180612更新 执行方案4+++++++++++++
+++++++++++++++++++++++课前准备+++++++++++++++++
知识点1:如下代码错误
1 #include<stdio.h>
2 #include<string.h>
3
4 int main()
5 {
6 char *A1="hello";
7 char *B1;
8 strncpy(B1,A1+1,2);
9 printf("%s\n",B1);
10
11
12 }
简单说就是strncpy strcpy 这样的函数它的B1和这个位置需要内存,可写的内存,所以必须是数组不能是string
其实在win下面编程char *A1="hello";已经直接报警了必须写成const char *A1="hello";就是我说的这个知识
知识点2:用数组,试试strncpy自己装自己!
1 #include<stdio.h>
2 #include<string.h>
3
4 int main()
5 {
6 char A1[10]="hello";
7 strncpy(A1,A1+1,2);
8 printf("%s\n",A1);
9
10
11 }
~
可以!上面的结果是elllo
hello
el
elllo
明白了吧!它自己的还是残留在数组中的!
+++++++++++++++++++++++开始试验+++++++++++++++++
SD卡准备文件
显示如图。
开始分析!
等一下 我们修改一下
加入空格!
好了 一些特殊也考虑到了 设计程序吧!
char len1,len2,len3;
char *A1,*A2,*A3;
char B1[10],B2[10],B3[10];
u32 A,B,C;
void Count_explan(char *cfgtxt)
{
// char *A1,*A2,*A3;
// char B1[5],B2[5],B3[3];
A1=strstr(cfgtxt,"Keycount=");
if(!A1)return;
A2=strstr(A1,"Cardcount=");
if(!A2)return;
A3=strstr(A2,"Cardfrz=");
if(!A3)return;
printf("A1:%s\n",A1);
printf("A2:%s\n",A1);
printf("A3:%s\n",A1);
len1=strlen(A1);
len2=strlen(A2);
len3=strlen(A3);
strncpy(B1,A1+strlen("Keycount="), strlen(A1)-strlen(A2)-strlen("Keycount=") -strlen("\r\n"));
strncpy(B2,A2+strlen("Cardcount="),strlen(A2)-strlen(A3)-strlen("Cardcount=")-strlen("\r\n"));
strncpy(B3,A3+strlen("Cardfrz="),strlen(A3));
}
此时效果:
后面就是再次过滤数据。
《上面主要是用strncpy来截取子串!!!》
void Count_explan(char *cfgtxt)
{
char *A1,*A2,*A3;
char B1[10],B2[10],B3[10];
A1=strstr(cfgtxt,"Keycount=");
if(!A1)return;
A2=strstr(A1,"Cardcount=");
if(!A2)return;
A3=strstr(A2,"Cardfrz=");
if(!A3)return;
strncpy(B1,A1+strlen("Keycount="), strlen(A1)-strlen(A2)-strlen("Keycount=") -strlen("\r\n"));
strncpy(B2,A2+strlen("Cardcount="),strlen(A2)-strlen(A3)-strlen("Cardcount=")-strlen("\r\n"));
strncpy(B3,A3+strlen("Cardfrz="),strlen(A3));
stringfilter(B1);
stringfilter(B2);
stringfilter(B3);
Set_K_Count(atoii(B1));
Set_C_Count(atoii(B2));
Set_C_Fre (atoii(B3));
}
上面的思路就是:拿到需要的数据段,去除里面的空格等,转化数据。
下面想了一个高级点的办法,
--去除里面的空格等,转化数据--这两部貌似没有什么优化,主要是前面
用strncpy去拿比较麻烦,能不能高级点?可以用 0 是字符串结束!!!平时是一个陷阱,现在我们倒过来用
我们用0去强行结束字符串!!
/*如果遇到/r/n换行 就结束这个字符*/
void stringfilter2(char *s)
{
u8 i=0;
for(i=0;i<strlen(s);i++)
if(s[i]=='\r')
{
s[i]=0;
break;
}
}
/*如果遇到空格 TAB 等就替换成‘0’*/
void stringfilter(char *s)
{
u8 i=0;
for(i=0;i<strlen(s);i++)
if(s[i]>'9'||s[i]<'0')
s[i]='0';
}
void Count_explan(char *cfgtxt)
{
char *A1,*A2,*A3;
char B1[10],B2[10],B3[10];
A1=strstr(cfgtxt,"Keycount=");
if(!A1)return;
A2=strstr(A1,"Cardcount=");
if(!A2)return;
A3=strstr(A2,"Cardfrz=");
if(!A3)return;
printf("bf:%s\n",A1);
stringfilter2(A1);
printf("df:%s\n",A1);
stringfilter(A1);
stringfilter2(A2);
stringfilter(A2);
stringfilter2(A3);
stringfilter(A3);
Set_K_Count(atoii(A1));
Set_C_Count(atoii(A2));
Set_C_Fre (atoii(A3));
}
看到了吧 果然愉快的结束了!!