首先这是一篇血泪文章,当你看到这篇文章的时候,笔者已经失败了,首先笔者选用了51单片机进行编写,51单片机的一个串口难以进行相应的验证,这是其一;其二,使用AT+CWLAP调回WIFI信息的时候,你会发现字符串的数量过于庞大,验证时间过长;其三RSSI值影响太大了,可以说基本没有精度。下面我会分享我的流程,如果你有幸成功的话,可以在下面留言。同时这篇文章包含字符串的接收和发送等知识,包含中断,超时接收,如何检验帧头帧尾等内容,希望对大家有所帮助。
1,字符串的发送
void SendChar(char Char)//这是发送单个字符的
{
SBUF=Char;
while(!TI);
TI=0;
}
void SendString(char *p)//发送字符串
{
while(*p!='\0')
{
SendChar(*p);
p++;
}
}
这个地方笔者不做太多的解释,主要就是利用TI和SBUF,进行单个字符的发送,而字符串的发送则是调用指针的类型然后进行字符串的发送。
2串口的初始化函数(这一部分可以在ISP中进行寻找)
void UsartInit()
{
SCON=0X50; //???????1
TMOD=0X20; //?????????2
//PCON=0X80; //?????
TH1=0xfd; //????????,??????9600?
TL1=0xfd;
ES=1; //??????
EA=1; //?????
TR1=1; //?????
}
不做太多解释
3利用中断进行字符串的接收(本人使用了帧头检验,帧尾检验以及超时接收等)
void Usart() interrupt 4//中断
{
if(RI)//当检验到数据时
{
RI = 0;//归0,下次检验
start_timer = 1;//定时计数器置1
temp = SBUF;//这里是定义了一个中间变量,将SBUF的内容传给中间变量,然后对中间变量进行检验
if(temp != 0x63)//这里本人是用的字符串“c”使用的是16进制,因为单片机接收数据接受的是16进制
{
recv_buf[recv_cnt] = temp;//这里讲接收到的一帧放入数组
recv_cnt++;//recv_cnt进行累加,方便下一次
if(recv_cnt > MAX_LEN)//当recv_cnt大于规定的最大字符串时,不再进行接收
{
recv_cnt = MAX_LEN;
}
}
else
{
usart_receive_flag = 1;//这是串口接收字符的标志位
recv_length = 47;//我设置的最大接收区为47(51单片机最多接收128个字符)
//recv_cnt = 0;
}
recv_timer_cnt = 0;//定时器计数归0
}
}
void Timer0Init(void) //1??@11.0592MHz
{
//AUXR &= 0x7F; //?????12T??
TMOD &= 0xF0; //???????
TL0 = 0x66; //??????
TH0 = 0xFC; //??????
TF0 = 0; //??TF0??
ET0 = 1;
TR0 = 1; //???0????
}
void timer0_ISR() interrupt 1
{
TR0 = 0;
if(start_timer == 1)
{
recv_timer_cnt++;
if(recv_timer_cnt > MAX_REV_TIME)
{
recv_timer_cnt =0;
recv_cnt = 0;
usart_receive_flag = 1;
}
}
TL0 = 0x66; //??????
TH0 = 0xFC; //??????
TR0 = 1;
}
4.清楚数组的数据也就是清除缓存
void clr_recvbuffer(unsigned char *buf)
{
unsigned char i;
for(i=0;i<MAX_LEN;i++)
{
buf[i] = 0;
}
}
这里很容易理解,就是利用i来清空每一个数组
5串口中断服务函数
void uart_service(unsigned char *buf)
{
unsigned char recv_m