本文采用芯片at32f435,由两部分组成,Tlink平台相关设置,设备代码相关。硬件相关可以理解成WiFi模块连接的串口,本文函数名是uart2但是实际上用的是Com3,可能是老师也是移植的原因。
AT指令含义相关请在at指令技术文档查询或相关经验帖查看,关键词"esp8266 AT指令",这里不再赘述,请根据实际情况调整。
平台设置
TLINK平台主界面。(第一张图)用户头像下边的编辑图标可以新增传感器(第二张图),同时注意在这个页面给自己定位GPS。
注意这里的序列号,还有设备传感器的顺序,如果你打印之后顺序不对,调整代码的上报下发的数据信息前后位置即可,比如原先是"#a,b,c#",调整成“#b,a,c#”。至于顺序怎么调整的问题,可以观察传感器右边的那个“实时曲线”和“历史查询”,我就是发现ADC的值为0、1(正常范围是0~4096)而进行调整的,查询LED历史值确定了哪个对应哪个。我尝试调整云平台的排序顺序但是失败了,这里建议不要设置传感器顺序。
鼠标移植左侧,可以看到我们当前位于“监控中心”,接下来我们点击“设备管理”
点击“设置连接”,编辑协议,注意这里是设备传给平台的。同时观察本页面可以看到“IP”、“端口号”、“序列号”。以及右下角的“收发指令”,点击展开,这里可以看到设备发给平台的内容。
点击“所有传感器”,这里是平台发给设备的,你需要写对应的解析数据包代码,填写后注意点击写入指令,我的格式是“[id=001,switch=1]”,id1是设备1,switch1是开,0是关。ADC这里只是在云平台查看不下发,故不填写。
点击“开发者中心”
平台提供心跳包,我们可以用来判断设备当前是否与平台还有联系,设备发“Q”后,平台发“A”。
代码
为提高各位的移植成功率,我对代码进行了简单的"提炼"。不多说,上代码。
//20ms定时器
{
//1s
if(++timer1_counter1>=50)
{
timer1_counter1=0;
timer1_counter2++;//注意这个时标
//这里是55s,为什么呢,因为总有地方拖慢了定时器,我找不到原因
if(++timer1_counter3>=55)
{
timer1_counter3=0;
uart2SendStr("Q");
if(ESP12_WaitResponse("A", 10000) != 1)
{
WIFI_LOGO=HIDE;esp32Status1=0;
}
}
}
// 2s
if(++timer1_num>=100)
{
timer1_num=0;
//有网才上报,没网不鸟他
if(WIFI_LOGO==SHOW && esp32Status1==ESP_STAET_TLINK){
machine.adc=analogRead();
machine.led3_status=gpio_output_data_bit_read(LED3_GPIO,LED3_PIN)==0?1:0;
machine.led4_status=gpio_output_data_bit_read(LED4_GPIO,LED4_PIN)==0?1:0;
printf("\n\rTimer1Callback:");
sprintf(TlinkCommandStr, "#%d,%d,%d#",machine.led3_status,machine.led4_status,machine.adc);
//printf(TlinkCommandStr);
uart2SendStr(TlinkCommandStr);
}
}
}
主函数,我用了Freertos,这里小改一波
int main()
{
esp32Init();
//没用freertos的同学请解除初始化注释
// char testStr[] = "tlink的机器序列号";
// comSendBuf(COM3, "+++", 3);
// delay_ms(1000);
// ESP12_SendAT("AT");
// if (ESP12_WaitResponse("OK", 5000) != 1)
// {
// printf("\r\n AT fail!\r\n");
// delay_ms(1000);
// }
// ESP12_SendAT("ATE0");
// if (ESP12_WaitResponse("OK", 500) != 1)
// {
// printf("\r\n ATE0 fail\r\n");
// }
//
// ESP12_SendAT("AT+CWMODE=1");
// if (ESP12_WaitResponse("OK", 500) != 1)
// {
// printf("\r\n CWMODE fail\r\n");
// }
// ESP12_SendAT("AT+CWJAP=\"wifi\",\"12345678\"");
// if (ESP12_WaitResponse("OK", 5000) != 1)
// {
// printf("\r\n CWJAP fail\r\n");
// delay_ms(1000);
// }
// ESP12_SendAT("AT+CIPSTART=\"TCP\",\"tcp.tlink.io\",8647");
// if (ESP12_WaitResponse("OK", 5000) != 1)
// {
// printf("\r\n CIPSTART fail\r\n");
// }
//
// ESP12_SendAT("AT+CIPMODE=1");
// if (ESP12_WaitResponse("OK", 1000) != 1)
// {
// printf("\r\n CIPMODE fail\r\n");
// }
//
// ESP12_SendAT("AT+CIPSEND");
// if (ESP12_WaitResponse("OK", 1000) != 1)
// {
// printf("\r\n CIPMODE fail\r\n");
// }
// printf("\r\n server connected!\r\n");
// comSendBuf(COM3, testStr, strlen(testStr));
// delay_ms(4000);
while(1)
{
Esp12FrameScan();
vTaskDelay(10); //没用freertos的同学请注释这一行
}
}
//代码原先滴样子,看不懂的看下一节代码
typedef struct {
int adc;
bool led3_status;
bool led4_status;
} StateMachine;
StateMachine machine;
char commandParse(char * comd,char * id,char * value)
{
char idStr[4] = "001";
char *p = NULL;
int ret = 0;
int pos = 0;
p = strstr(comd,"id=");
if(p == NULL) return -1;
strncpy(idStr,p+strlen("id="),3);
*id = atoi(idStr);
memset(idStr,0,sizeof(idStr));
p = strstr(comd,"switch=");
if(p == NULL) return -1;
strncpy(idStr,p+strlen("switch="),1);
*value = atoi(idStr);
return 0;
}
#define ESP_TLINK_CONNECTED 1
#define ESP_TLINK_INIT 2
#define ESP_GET_WEATHER 3
#define ESP_GET_TIME 4
unsigned char timer1_counter1,timer1_counter2,timer1_counter3=0;
unsigned char esp32Status1=0;
void Esp12FrameScan()
{
static unsigned char failnum=0x00;
static int adcValue1=0;
static unsigned char airCtrl=0,lightCtrl=0;
static char Recv_Buf[20],Recv_len=0,Recv_CommandFlag=0;
char TlinkCommandStr[20],DeviceID,DeviceLight,ret;
unsigned char getChar=0;
static unsigned char state=0;
char testStr[] = "机器序列号";
if(esp32Status1 == ESP_TLINK_CONNECTED){
if(comGetChar(COM3,&getChar))
{
if(timer1_counter2>=60)
{
timer1_counter2=0;
esp32Status1=0;
WIFI_LOGO=HIDE;
return;
}else{
if(getChar=='A')
{
timer1_counter2=0;
WIFI_LOGO=SHOW;
return;
}
}
switch(state)
{
case 0:
if(getChar == '['){ state=1;}//WIFI_LOGO=SHOW;timer1_counter2=0;}
Recv_len=0;
break;
case 1:
if(getChar == ']')
{
state=0;
Recv_CommandFlag=1;
//WIFI_LOGO=SHOW;
}
else
{
*(Recv_Buf+Recv_len) = getChar;
Recv_len++;
if(Recv_len>17)
{
Recv_CommandFlag=0;
state=0;
}
}
break;
default:
break;
}
}
}else{
comSendBuf(COM3, "+++", 3);
vTaskDelay(500);
ESP12_SendAT("AT");
if (ESP12_WaitResponse("OK", 500) != 1)
{
printf("\r\n AT fail!\r\n");
failnum|=(1<<0);
vTaskDelay(1000);
}
ESP12_SendAT("ATE0");
if (ESP12_WaitResponse("OK", 500) != 1)
{
printf("\r\n ATE0 fail\r\n");
failnum|=(1<<1);vTaskDelay(1000);
}
ESP12_SendAT("AT+CWMODE=1");
if (ESP12_WaitResponse("OK", 500) != 1)
{
printf("\r\n CWMODE fail\r\n");
failnum|=(1<<2);vTaskDelay(1000);
}
ESP12_SendAT("AT+CWJAP=\"wifi\",\"12345677\"");
if (ESP12_WaitResponse("OK", 5000) != 1)
{
printf("\r\n CWJAP fail\r\n");
failnum|=(1<<3);
vTaskDelay(1000);
}
ESP12_SendAT("AT+CIPSTART=\"TCP\",\"tcp.tlink.io\",8647");
if (ESP12_WaitResponse("OK", 5000) != 1)
{
printf("\r\n CIPSTART fail\r\n");
failnum|=(1<<4);vTaskDelay(1000);
}
ESP12_SendAT("AT+CIPMODE=1");
if (ESP12_WaitResponse("OK", 5000) != 1)
{
printf("\r\n CIPMODE fail\r\n");
failnum|=(1<<5);vTaskDelay(1000);
}
ESP12_SendAT("AT+CIPSEND");
if (ESP12_WaitResponse("OK", 1000) != 1)
{
printf("\r\n CIPMODE fail\r\n");vTaskDelay(1000);
failnum|=(1<<6);
}
comSendBuf(COM3, testStr, strlen(testStr));
vTaskDelay(400);
if(failnum==0){
uart2SendStr("Q");
}
if ((failnum&(1<<3)&&failnum&(1<<4))||(ESP12_WaitResponse("A", 10000) != 1))
{
WIFI_LOGO=HIDE;
failnum=0;
return;
//vTaskDelay(1000);
}else{
printf("\r\n server connected!\r\n");
esp32Status1=ESP_STAET_TLINK;
WIFI_LOGO=SHOW;
}
}
if(Recv_CommandFlag == 1)
{
Recv_CommandFlag = 0;
airCtrl=gpio_output_data_bit_read(LED3_GPIO,LED3_PIN)==0?1:0;
lightCtrl=gpio_output_data_bit_read(LED4_GPIO,LED4_PIN)==0?1:0;
printf("Esp12FrameScanREV:");
printf("%s",Recv_Buf);
ret = commandParse(Recv_Buf,&DeviceID,&DeviceLight);
if(ret == 0)
{
switch(DeviceID)
{
case 001:
switch(DeviceLight)
{
case 0:
at32_led_off(LED3);
airCtrl=0;
break;
case 1:
at32_led_on(LED3);
airCtrl=1;
break;
default:
break;
}
adcValue1 = analogRead();
printf("Esp12FrameScan:");
sprintf((char *)TlinkCommandStr, "#%d,%d,%d#",airCtrl,lightCtrl,adcValue1);
printf("The upload string is %s",TlinkCommandStr);
uart2SendStr(TlinkCommandStr);
break;
case 002:
switch(DeviceLight)
{
case 0:
at32_led_off(LED4);
lightCtrl=0;
break;
case 1:
at32_led_on(LED4);
lightCtrl=1;
break;
default:
break;
}
adcValue1 = analogRead();printf("Esp12FrameScan:");
sprintf((char *)TlinkCommandStr, "#%d,%d,%d#",airCtrl,lightCtrl,adcValue1);
printf("The upload string is %s",TlinkCommandStr);
uart2SendStr(TlinkCommandStr);
break;
}
}
}
}
代码大致结构
读串口字节;
有字节说明wifi连着,如果是"A",counter2时标赶紧清了,不然到一定数量就是断网
if(符合帧结构)
{
先录下来;
flag=1;
}
else{
//这里面滴内容是用了freertos的同学看的;
}
if(flag==1)
{
解析包;
立刻上报一次;
}
麻烦看到最后的同学点个赞鼓励一下呗。
有问题在评论区说一下,谢谢。
标签:ESP12,TLink,esp8266,char,WaitResponse,AT32,timer1,printf,Recv From: https://blog.csdn.net/m0_64089565/article/details/139581311