?
第一、二章優(yōu)化拓展開發(fā)環(huán)境:
主控 | STM32F103C8T6 |
WIFI模塊 | ESP01S |
開發(fā)語言 | C |
開發(fā)編譯器· | KEIL |
組網(wǎng)方式 | WIFI |
服務(wù)器協(xié)議 | MQTT |
硬件連接
STM32 | ESP01S |
3.3V | 3.3V |
GND |
GND |
GPIO2? (USRAT2-TX) |
RX |
GPIO3 (USART3-RX) | TX |
本章要點:
- 對ESP01S的AT指令的反饋指令進(jìn)行驗證解析
- 對ESP的USART2通信串口進(jìn)行printf端口重映射
- 對調(diào)試用的USART1通信串口編寫USART_printf函數(shù)并且解析%d、%s等可變參數(shù)
抽象理解
1、對ESP01S的AT指令的反饋指令進(jìn)行驗證解析
? ? ? ? 進(jìn)入循環(huán)函數(shù):在STM32對ESP01S進(jìn)行USART通信發(fā)送完AT指令后,進(jìn)行串口監(jiān)聽,然后接收AT反饋指令,接著調(diào)用strstr()函數(shù)對指令進(jìn)行解析,當(dāng)解析到AT指令任務(wù)實現(xiàn)的反饋指令后,才執(zhí)行下一步,跳出循環(huán)函數(shù)
_Bool ESP8266_SendCmd(char *cmd, char *res, u16 time)
{
Usart2_SendString((unsigned char *)cmd, strlen((const char *)cmd));
while(time--)
{
if(ESP8266_WaitRecive() == REV_OK) //如果收到數(shù)據(jù)
{
if(strstr((const char *)esp8266_buf, res) != NULL) //如果檢索到關(guān)鍵詞
{
ESP8266_Clear(); //清空緩存
return 0;
}
}
delay_ms(10);
}
return 1;
}
2、對ESP的USART2通信串口進(jìn)行printf端口重映射
#if 1
#pragma import(__use_no_semihosting)
//標(biāo)準(zhǔn)庫需要的支持函數(shù)
struct __FILE
{
int handle;
};
FILE __stdout;
//定義_sys_exit()以避免使用半主機(jī)模式
void _sys_exit(int x)
{
x = x;
}
//重定義fputc函數(shù)
int fputc(int ch, FILE *f)
{
// while((USART2->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢
// USART2->DR = (u8) ch;
while((USART2->SR&0X40)==0);//循環(huán)發(fā)送,直到發(fā)送完畢 (若需要使用usart串口通信進(jìn)行信息驗證調(diào)試則取消注釋,正常使用請關(guān)閉,避免printf打印兩次)
USART2->DR = (u8) ch;
return ch;
}
#endif
3、對調(diào)試用的USART1通信串口編寫USART_printf函數(shù)并且解析%d、%s等可變參數(shù)
#include <stdarg.h>
//C庫重寫
#include <mystdlib.h>
void USART1_printf (char * Data, ... )
{
const char *s;
int d;
char buf[16];
va_list ap;
va_start(ap, Data);
while ( * Data != 0 ) // 判斷是否到達(dá)字符串結(jié)束符
{
if ( * Data == 0x5c ) //'\'
{
switch ( *++Data )
{
case 'r': //回車符
USART_SendData(USART1, 0x0d);
Data ++;
break;
case 'n': //換行符
USART_SendData(USART1, 0x0a);
Data ++;
break;
default:
Data ++;
break;
}
}
else if ( * Data == '%')
{ //
switch ( *++Data )
{
case 's': //字符串
s = va_arg(ap, const char *);
for ( ; *s; s++)
{
USART_SendData(USART1,*s);
while( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}
Data++;
break;
case 'd':
//十進(jìn)制
d = va_arg(ap, int);
myitoa(d, buf, 10);
for (s = buf; *s; s++)
{
USART_SendData(USART1,*s);
while( USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );
}
Data++;
break;
default:
Data++;
break;
}
}
else USART_SendData(USART1, *Data++);
while ( USART_GetFlagStatus ( USART1, USART_FLAG_TXE ) == RESET );
}
}
代碼:
由于在stm32內(nèi),無法使用stdlib.h的C語言庫,因此我們重寫編寫了stdlib.h庫的部分函數(shù)
mystdlib.h
#ifndef __MYSTDLIB_H
#define __MYSTDLIB_H
/*
將整數(shù)轉(zhuǎn)化為字符串:
num,轉(zhuǎn)換對象
str,轉(zhuǎn)換后存儲字符串的數(shù)組
radix,轉(zhuǎn)換(給于的字符串)的長度
*/
char *myitoa(int num,char *str,int radix)
{
/* 索引表 */
char index[]="0123456789abcdefghijklmnopqrstuvwxz";
unsigned unum; /* 中間變量 */
int i=0,j,k;
/* 確定unum的值 */
if(radix==10&&num<0) /* 十進(jìn)制負(fù)數(shù) */
{
unum=(unsigned)-num;
str[i++]='-';
}
else unum=(unsigned)num; /* 其它情況 */
/* 逆序 */
do
{
str[i++]=index[unum%(unsigned)radix];
unum/=radix;
}while(unum);
str[i]='\0';
/* 轉(zhuǎn)換 */
if(str[0]=='-') k=1; /* 十進(jìn)制負(fù)數(shù) */
else k=0;
/* 將原來的“/2”改為“/2.0”,保證當(dāng)num在16~255之間,radix等于16時,也能得到正確結(jié)果 */
char temp;
for(j=k;j<=(i-k-1)/2.0;j++)
{
temp=str[j];
str[j]=str[i-j-1];
str[i-j-1]=temp;
}
return str;
}
/*
將字符串轉(zhuǎn)換成整數(shù)
str,轉(zhuǎn)換的字符串?dāng)?shù)組目標(biāo)
返回值:為轉(zhuǎn)換后的整數(shù);
*/
int myatoi(char * str)
{
int n=0;//保存整形
char firstChar = *str;//記錄str的第一個字符
if (firstChar == '+' || firstChar == '-')//+123 -123
{
++str;
}
while(*str == '0')//00123 -00123
{
++str;
}
while (*str)
{
char temp = *str;
if (*str < '0' || *str> '9')
{
puts("literal does not match format string ") ;
return n;//該字符串含有非數(shù)字字符,不能轉(zhuǎn)為整數(shù)
}
else
{
temp -= '0';
n = n * 10 + temp;//將字符串轉(zhuǎn)為整形
}
str++;
}
if (firstChar == '-')
{
n = -n;
}
return n;
}
#endif
如果要本第一、二章優(yōu)化拓展的完整工程文件,可以直接到百度網(wǎng)盤提?。ń鈮好艽a同下)
鏈接:https://pan.baidu.com/s/1ECxx125pRlKVo366fzyTiw?pwd=1016?
提取碼:1016
?本文為作者獨立編寫?文章來源:http://www.zghlxwxcb.cn/news/detail-583864.html
?本BLOG上所有的原創(chuàng)文章未經(jīng)本人許可,不得用于商業(yè)用途及傳統(tǒng)媒體。網(wǎng)絡(luò)媒體轉(zhuǎn)載請注明出處,否則屬于侵權(quán)行為。文章來源地址http://www.zghlxwxcb.cn/news/detail-583864.html
到了這里,關(guān)于基于STM32的homeassistant(采用FreeRTOS操作系統(tǒng))【第一、二章優(yōu)化拓展:Wifi、服務(wù)器連接驗證以及UASRT串口區(qū)分】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!