先把ESP8266的TX,RX引脚连接到我们单片机的PB10,PB11引脚。初始化USART3,
void usart3_init(uint32_t baud)
{
//打开PA硬件时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//打开串口1硬件时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
//配置PA9和PA10为复用功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_10; //第9 10根引脚
GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF; //多功能模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出,增加输出电流能力。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//高速响应
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //没有使能上下拉电阻
GPIO_Init(GPIOB,&GPIO_InitStructure);
//将PA9和PA10引脚连接到串口1的硬件
GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3);
//配置串口1相关参数:波特率、无校验位、8位数据位、1个停止位......
USART_InitStructure.USART_BaudRate = baud; //波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位数据位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //允许收发数据
USART_Init(USART3, &USART_InitStructure);
//配置串口1的中断触发方法:接收一个字节触发中断
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//配置串口1的中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//使能串口1工作
USART_Cmd(USART3, ENABLE);
}
用串口3发送数据的代码
void usart3_send_str(char *str)
{
char *p = str;
while(p && (*p!='\0'))
{
USART_SendData(USART3,*p);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
p++;
}
}
最重要的是把串口3接收到的数据保存下来,用一个数组进行保存,把接收到的数据发送给我们的串口1。
static volatile uint8_t g_usart3_buf[64]={0};
static volatile uint32_t g_usart3_event=0;
static uint8_t g=0;
void USART3_IRQHandler(void)
{
static
uint32_t i=0;
uint8_t d;
//检测标志位
if(USART_GetITStatus(USART3,USART_IT_RXNE) == SET)
{
//接收数据
g=d=USART_ReceiveData(USART3);
//将接收到的数据,返发给PC
USART_SendData(USART1,d);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
g_usart3_buf[i] = d;
i++;
//判断是否有结束符‘#’,同时检测有没有超过缓冲区的大小
if(d == '}' || i >=sizeof (g_usart3_buf))
{
i=0;
g_usart3_event=1;
}
//清空标志位
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
}
}
之后就可以用串口3发送AT指令了,初始化代码如下
usart3_send_str("AT\r\n");
delay_ms(1000);
usart3_send_str("AT+CWMODE=1\r\n");
delay_ms(2000);
usart3_send_str("AT+CWJAP=\"test\",\"12345678\"\r\n"); //test是手机热点的名称,12345678是热点的密码
delay_ms(15000);
usart3_send_str("AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n");
delay_ms(3000);
usart3_send_str("AT+CIPMODE=1\r\n");
delay_ms(1000);
usart3_send_str("AT+CIPSEND\r\n");
接下来是http需要的资源
1145659828是设备号
api-key是Master-APIkey,用手机号就可以得到,这是老版onenet的链接,需要可以取申请一下
https://open.iot.10086.cn/develop/global/product/#/public?protocol=3&other=1
char mod[32]={0};
char temp[512];
extern char *str[5] ;
char *str[6] = {"POST /devices/1145659828/datapoints?type=3 HTTP/1.1",
"api-key:kSOfKDzxnza3csgzuanRYm7GsJ4=",
"Host:api.heclouds.com",
"Content-Length:32",
""};
http请求
strcpy(temp, "");
for (i = 0; i < 5; i++)
{
strcat(temp, str[i]);
strcat(temp, "\r\n");
delay_us(10);
}
//buf[2],buf[0],adc_vol%100 是温湿度传感器,跟光照传感器的值,可以自己设置
sprintf(mod,"{\"temp\":%d,\"humi\":%d,\"light\":%d}",buf[2],buf[0],adc_vol%100);
//sprintf(mod,"{\"temp\":%d,\"humi\":%d}",buf[2],buf[0]);
strcat(temp, mod);
strcat(temp, "\r\n");
usart3_send_str(temp);
使用get获得onenet的数据,传入的是想要获得的数据 temp/humi/light都可以,返回onenet上传的值,
u16 esp8266_get_data(char *vStr)
{
u8 i;
u16 value = 0;
char *back;
char temp[160] = "GET /devices/1145659828/datastreams/";
// 拼接请求报文
strcat(temp, vStr);
strcat(temp, " HTTP/1.1\r\n");
for (i = 1; i < 3; i++)
{
strcat(temp, str[i]);
strcat(temp, "\r\n");
}
//printf("%s",temp);
// 发送报文, 获取返回字符串
strcat(temp, "\r\n");
usart3_send_str(temp);
if(g_usart3_event)
{
if(strstr((const char *)g_usart3_buf,"current_value"))
{
back = strchr(strstr((char *)g_usart3_buf, "\"current_value\":"), ':') + 1;
while (*back != '}')
{
if(*back == '\"'){
back++;
continue;
}
value = value * 10 + (*back - '0');
back++;
}
}
g_usart3_event = 0;
}
return value;
}
这些就配置完了,可以收发数据了,也可以用lcd显示数据,这里就不写了