1.利用串口三给esp8266发送AT指令,串口一打印调试信息
下面附上主要代码
esp8266.c的重要函数
先介绍一个非常有意思的函数,利用下面这个函数可以直接用串口发送指令
//串口3,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度
printf("i is %d\r\n",i);
printf("USART3_TX_BUF[j] is ");
for(j=0;j<i;j++) //循环发送数据
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART3,USART3_TX_BUF[j]);
printf("%c",USART3_TX_BUF[j]);
}
printf("\r\n");
}
向esp8266发送AT指令的函数,相比较u3_printf()函数,多了一个对应答的判断。核心还是用u3_printf()发送。
//向ESP8266发送命令
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 esp8266_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //发送命令
printf("cmd is %s\r\n",cmd);
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
if(esp8266_check_cmd(ack))
{
printf("ack:%s\r\n",(u8*)ack);
break;//得到有效数据
}
USART3_RX_STA=0;
}
}
if(waittime==0)
{
res=1;
printf("send error\r\n");
}
}
return res;
}
1.配置esp8266连接WiFi,设置工作模式。相当于初始化的过程
void esp8266_start_trans(void)
{
//设置工作模式 1:station模式 2:AP模式 3:兼容 AP+station模式
esp8266_send_cmd("AT+CWMODE=1","OK",500);
//让Wifi模块重启的命令
esp8266_send_cmd("AT+RST","ready",200);
delay_ms(1000); //延时3S等待重启成功
delay_ms(1000);
delay_ms(1000);
//让模块连接上自己的路由
while(esp8266_send_cmd("AT+CWJAP=\"wifi名\",\"wifi密码\"","WIFI GOT IP",900));
//=0:单路连接模式 =1:多路连接模式
esp8266_send_cmd("AT+CIPMUX=0","OK",90);
//建立TCP连接 这四项分别代表了 要连接的ID号0~4 连接类型 远程服务器IP地址 远程服务器端口号
while(esp8266_send_cmd("AT+CIPSTART=\"TCP\",\"192.168.0.106\",1234","CONNECT",200));
//是否开启透传模式 0:表示关闭 1:表示开启透传
esp8266_send_cmd("AT+CIPMODE=1","OK",900);
//透传模式下 开始发送数据的指令 这个指令之后就可以直接发数据了
esp8266_send_cmd("AT+CIPSEND","OK",50);
}
发送数据的函数
//向ESP8266发送数据
//cmd:发送的命令字符串;waittime:等待时间(单位:10ms)
//返回值:发送数据后,服务器的返回验证码
u8* esp8266_send_data(u8 *cmd,u16 waittime)
{
char temp[5];
char *ack=temp;
USART3_RX_STA=0;
u3_printf("%s\r\n",cmd); //发送命令
if(waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART3_RX_STA&0X8000)//接收到期待的应答结果
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
ack=(char*)USART3_RX_BUF;
printf("ack:%s\r\n",(u8*)ack);
printf("esp8266_send_data is ok");
USART3_RX_STA=0;
break;//得到有效数据
}
}
}
return (u8*)ack;
}
利用adc1来采集
float Get_Temprate(void)
{
u32 adcx;
float result;
double temperate;
adcx=Get_Adc_Average(ADC_Channel_16,10); //读取通道16内部温度传感器通道,10次取平均
temperate=(float)adcx*(3.3/4096); //电压值
temperate=(temperate-0.76)/0.0025 + 25; //转换为温度值
//result=temperate*=100; //扩大100倍.
return temperate;
}
利用adc3来采集光敏传感器数据
u8 Lsens_Get_Val(void)
{
u32 temp_val=0;
u8 t;
for(t=0;t<LSENS_READ_TIMES;t++)
{
temp_val+=Get_Adc3(ADC_Channel_5); //读取ADC值,通道5
delay_ms(5);
}
temp_val/=LSENS_READ_TIMES;//得到平均值
if(temp_val>4000)temp_val=4000;
return (u8)(100-(temp_val/40));
}
主函数
void DataAnalysis(void)
{
float a,b;
a=Get_Temprate();
sprintf(data.TEM, "%f",a);
printf("TEM IS %f\r\n",a);
b=Lsens_Get_Val();
sprintf(data.Light, "%f",b);
printf("Light is %f\r\n",b);
}
int main(void)
{
delay_init(168); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
usart3_init(115200); //串口初始化为115200
Adc_Init();
Lsens_Init();
DataAnalysis();
creatjson();
esp8266_start_trans(); //esp8266进行初始化
esp8266_send_data(out,50);
esp8266_quit_trans();
while(1)
{
}
}
实验结果
1串口打印信息
2利用手机的网络调试精灵,创建一个TCP服务端