找回密码
 立即注册
查看: 219|回复: 8

15W4K48S4+ESP8266实现通信时遇到问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-03-25 23:05:12
已绑定手机

1

主题

3

回帖

29

积分

新手上路

积分
29
发表于 2025-3-23 23:21:34 | 显示全部楼层 |阅读模式
需求:用15W4K48S4+ESP8266与服务器通信。
问题:程序烧录成功后,拔掉电源,接上esp826601s,接通电源,led不闪烁,在路由器中找不到此设备(esp8266),感觉芯片没有向esp8266发送at相关指令
预期:接esp8266并通电后,led会根据通信情况闪烁(通信OK闪2次,失败闪烁5次,出现错误闪10次),并在路由中能找到此设备
硬件:
    程序烧录电路图:
      

程序烧录电路图

程序烧录电路图


       usb-ttl:3.3v供电,通过串口1烧录程序。tx接收芯片的rx(p3.0),rx接芯片的tx(p3.1)。
       程序烧录是成功的:

       3.jpg
   连接esp8266的电路图:
       2.jpg
       esp8266与芯片的串口2进行通信。tx接到芯片的P1.0(第9脚引),rx接到芯片的P1.1(第10引脚)
程序:
   
  1. #include <STC15.H>
  2. #include <intrins.h>
  3. #include <string.h>
  4. #define FOSC 30000000L    // 主频设为30MHz
  5. #define BAUD 115200         // 波特率115200
  6. #define SIZE 12
  7. #define NONE_PARITY     0       //无校验
  8. #define ODD_PARITY      1       //奇校验
  9. #define EVEN_PARITY     2       //偶校验
  10. #define MARK_PARITY     3       //标记校验
  11. #define SPACE_PARITY    4       //空白校验
  12. #define PARITYBIT NONE_PARITY   //定义校验位
  13. typedef unsigned char BYTE;
  14. typedef unsigned int WORD;
  15. char buffer[SIZE];
  16. char AT_OK_Flag = 0; //OK返回值的标志位
  17. bit busy;
  18. void delay_ms(unsigned int ms);
  19. void SendData(BYTE dat);
  20. void UART2_SendString(char *s);
  21. void Receive();
  22. /************ UART1配置(P3.0/RxD1, P3.1/TxD1) ************/
  23. void UART1_Init(void)
  24. {
  25.     P3M1 &= ~0x03; P3M0 &= ~0x03; // P3.0/P3.1设为准双向模式
  26.         
  27.     P_SW1 |= 0x00;                // 串口1使用默认的3.0和3.1
  28.    
  29.         SCON = 0x50;        // 8位数据,可变波特率
  30.     AUXR |= 0x40;       // Timer1时钟为FOSC
  31.     AUXR &= 0xFE;       // UART1选择Timer1为波特率发生器
  32.     TMOD &= 0x0F;       // Timer1设为16位自动重载
  33.         TL1 = 0xBF;                        // 波特率115200(当FOSC=30MHz)
  34.         TH1 = 0xFF;
  35.     TR1 = 1;            // 启动Timer1
  36.     ES = 1;             // 使能UART1中断
  37. }
  38. /************ UART2配置(P1.6/RxD2, P1.7/TxD2) ************/
  39. void UART2_Init(void)
  40. {
  41.     P_SW2 |= 0x00;       // 将UART2切换到P1.0(RxD2)和P1.1(TxD2)
  42.    
  43.     S2CON = 0x50;        // 8位数据,可变波特率
  44.         
  45.         T2L = (65536 - (FOSC/4/BAUD));   //设置波特率重装值
  46.     T2H = (65536 - (FOSC/4/BAUD))>>8;
  47.     AUXR = 0x14;                //T2为1T模式, 并启动定时器2
  48.     IE2 = 0x01;                 //使能串口2中断
  49. }
  50. /************ 中断服务函数 ************/
  51. void UART1_ISR() interrupt 4
  52. {
  53.     if (RI)
  54.     {
  55.         RI = 0;          // 清除接收中断标志
  56.         // 处理接收数据:SBUF为接收到的字节
  57.                
  58.     }
  59.     if (TI)
  60.     {
  61.         TI = 0;          // 清除发送中断标志
  62.         // 发送完成处理
  63.     }
  64. }
  65. void UART2_ISR() interrupt 8
  66. {
  67.     if (S2CON & 0x01)    // 检测接收中断标志S2RI
  68.     {
  69.         S2CON &= ~0x01;  // 清除S2RI
  70.         // 处理接收数据:S2BUF为接收到的字节
  71.                 Receive();
  72.     }
  73.     if (S2CON & 0x02)    // 检测发送中断标志S2TI
  74.     {
  75.         S2CON &= ~0x02;  // 清除S2TI
  76.         // 发送完成处理
  77.     }
  78. }
  79. /************ ESP826601s初始化函数 ************/
  80. void ESP8266_Init(){
  81.         // 发送AT指令配置ESP8266
  82.     UART2_SendString("AT+RST\r\n");      // 重启模块
  83.         delay_ms(3000);   
  84.         UART2_SendString("AT+UART=115200,8,1,0,0\r\n");      // 设置波特率
  85.     delay_ms(1000);
  86.     UART2_SendString("AT+CWMODE=1\r\n"); // 设置为STA模式
  87.     delay_ms(1000);
  88.     UART2_SendString("AT+CWJAP="Route-1302","wg.89702993"\r\n"); // 连接WiFi
  89.     delay_ms(3000);
  90.     UART2_SendString("AT+CIPSTART="TCP","192.168.3.5",8080\r\n"); // 连接服务器
  91.     delay_ms(3000);
  92.         UART2_SendString("AT+CIPMODE=1\r\n"); // 设置透传
  93.     delay_ms(1000);
  94.         UART2_SendString("AT+CIPSEND\r\n");
  95.         delay_ms(1000);
  96. }
  97. /************ 主函数 ************/
  98. void main()
  99. {
  100.         P00 = 1;
  101.         
  102.         P0M0 = 0x00;
  103.     P0M1 = 0x00;
  104.     P1M0 = 0x00;
  105.     P1M1 = 0x00;
  106.     P2M0 = 0x00;
  107.     P2M1 = 0x00;
  108.     P3M0 = 0x00;
  109.     P3M1 = 0x00;
  110.     P4M0 = 0x00;
  111.     P4M1 = 0x00;
  112.     P5M0 = 0x00;
  113.     P5M1 = 0x00;
  114.     P6M0 = 0x00;
  115.     P6M1 = 0x00;
  116.     P7M0 = 0x00;
  117.     P7M1 = 0x00;
  118.     EA = 1;             // 全局中断使能
  119.         
  120.     UART1_Init();
  121.     UART2_Init();
  122.         ESP8266_Init();
  123.    
  124.     while (1);
  125. }
  126. /************ 延时函数:以毫秒为单位 ************/
  127. void delay_ms(unsigned int ms)        //@30.000MHz
  128. {
  129.         unsigned char data i, j;
  130.         i = 30;
  131.         j = 43;
  132.         while(ms--){
  133.                 do
  134.                 {
  135.                         while (--j);
  136.                 } while (--i);
  137.         }
  138. }
  139. /************ 接收信息 ************/
  140. void Receive(){
  141.         static int i=0; //静态变量,被初始化一次
  142.         int n = 0;
  143.         char tmp = SBUF;
  144.         if(tmp == 'W' || tmp == 'O' || tmp == 'F' || tmp=='L' || tmp == 'E' || tmp == "?"){
  145.                 i = 0;
  146.         }
  147.         buffer[i++] = tmp;
  148.         //连接服务器等OK返回值指令的判断
  149.         if(buffer[0] == 'O' && buffer[1] == 'K'){
  150.                 AT_OK_Flag = 1;
  151.                 memset(buffer,'\0',SIZE);
  152.                 for(n = 0; n < 2; n++){
  153.                         P00 = 0;
  154.                         delay_ms(200);
  155.                         P00 = 1;
  156.                         delay_ms(200);
  157.                 }
  158.         }
  159.         //联网失败出现FAIL字样捕获
  160.         if(buffer[0] == 'F' && buffer[1] == 'A'){
  161.                 for(n = 0; n < 5; n++){
  162.                         P00 = 0;
  163.                         delay_ms(200);
  164.                         P00 = 1;
  165.                         delay_ms(200);
  166.                 }
  167.                 memset(buffer,'\0',SIZE);
  168.         }
  169.         if(buffer[0]=='E' && buffer[4] =='R'){
  170.                 for(n = 0; n < 10; n++){
  171.                         P00 = 0;
  172.                         delay_ms(200);
  173.                         P00 = 1;
  174.                         delay_ms(200);
  175.                 }
  176.                 memset(buffer,'\0',SIZE);
  177.         }
  178. /*        if(buffer[0]=='0' || buffer[0] =='?'){
  179.                 for(i=0; i<5; i++){
  180.                         P00 = 0;
  181.                         delay_ms(1000);
  182.                         P00 = 1;
  183.                         delay_ms(1000);
  184.                 }
  185.                 memset(buffer,'\0',SIZE);
  186.         }
  187.         if(buffer[0] == 'L' && buffer[1] == '1'){
  188.                 P00 = 0;
  189.                 memset(buffer,'\0',SIZE);
  190.         }
  191.         if(buffer[0] == 'L' && buffer[1] == '0'){
  192.                 P00 = 1;
  193.                 memset(buffer,'\0',SIZE);
  194.         }        
  195. */
  196. }
  197. /*----------------------------
  198. 发送串口数据
  199. ----------------------------*/
  200. void SendData(BYTE dat)
  201. {
  202.     while (busy);               //等待前面的数据发送完成
  203.     ACC = dat;                  //获取校验位P (PSW.0)
  204.     if (P)                      //根据P来设置校验位
  205.     {
  206. #if (PARITYBIT == ODD_PARITY)
  207.         S2CON &= ~S2TB8;        //设置校验位为0
  208. #elif (PARITYBIT == EVEN_PARITY)
  209.         S2CON |= S2TB8;         //设置校验位为1
  210. #endif
  211.     }
  212.     else
  213.     {
  214. #if (PARITYBIT == ODD_PARITY)
  215.         S2CON |= S2TB8;         //设置校验位为1
  216. #elif (PARITYBIT == EVEN_PARITY)
  217.         S2CON &= ~S2TB8;        //设置校验位为0
  218. #endif
  219.     }
  220.     busy = 1;
  221.     S2BUF = ACC;                //写数据到UART2数据寄存器
  222. }
  223. /*----------------------------
  224. 发送字符串
  225. ----------------------------*/
  226. void UART2_SendString(char *s)
  227. {
  228.     while (*s)                  //检测字符串结束标志
  229.     {
  230.         SendData(*s++);         //发送当前字符
  231.     }
  232. }
复制代码
我想过好些办法都未解决,请各位大能帮忙看看,谢谢
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-3-23 23:23:00 | 显示全部楼层
针对您在使用STC15W4K48S4与ESP8266进行通信时遇到的问题,以下是一些可能的原因和解决方案:

1. 硬件连接检查
首先,确保ESP8266与STC15W4K48S4的硬件连接正确。根据您的描述,ESP8266的TX应连接到STC15W4K48S4的P1.0,RX应连接到P1.1。请仔细检查这些连接是否正确,并确保没有虚焊或短路现象。

2. 电源供应
ESP8266的工作电压为3.3V,确保您为ESP8266提供了稳定的3.3V电源。如果电源不稳定或电压不足,ESP8266可能无法正常工作。您可以使用电压表测量ESP8266的VCC引脚,确保其在3.3V左右。

3. 串口配置
确保STC15W4K48S4的串口2配置正确。您需要设置正确的波特率、数据位、停止位和校验位。ESP8266默认的AT指令波特率为115200,因此您需要将STC15W4K48S4的串口2配置为相同的波特率。

4. AT指令发送
在程序中,您需要确保STC15W4K48S4通过串口2向ESP8266发送AT指令。以下是一个简单的示例代码,展示如何发送AT指令并接收响应:
  1. c
  2. include
  3. include
  4. include
  5. define ESP8266RX P10
  6. define ESP8266TX P11
  7. void UART2Init(void) {
  8.     SCON2 = 0x50; // 8位数据, 1位停止位, 无校验位
  9.     AUXR |= 0x04; // 定时器1作为波特率发生器
  10.     T2L = 0xE8;   // 波特率115200
  11.     T2H = 0xFF;
  12.     AUXR |= 0x10; // 启动定时器2
  13. }
  14. void UART2SendByte(unsigned char dat) {
  15.     SBUF2 = dat;
  16.     while (!TI2);
  17.     TI2 = 0;
  18. }
  19. void UART2SendString(char s) {
  20.     while (s) {
  21.         UART2SendByte(s++);
  22.     }
  23. }
  24. unsigned char UART2ReceiveByte(void) {
  25.     while (!RI2);
  26.     RI2 = 0;
  27.     return SBUF2;
  28. }
  29. void main(void) {
  30.     UART2Init();
  31.     UART2SendString("AT\r\n"); // 发送AT指令
  32.     while (1) {
  33.         unsigned char response = UART2ReceiveByte();
  34.         // 处理ESP8266的响应
  35.     }
  36. }
复制代码

5. 调试与日志
建议您使用调试工具或串口助手来监控STC15W4K48S4与ESP8266之间的通信。通过查看实际的AT指令发送和ESP8266的响应,可以更好地定位问题。

6. 固件更新
如果ESP8266的固件版本较旧,可能会导致AT指令无法正常工作。您可以尝试更新ESP8266的固件到最新版本。

7. 路由器配置
确保您的路由器允许新设备接入,并且没有启用MAC地址过滤等安全措施,这些可能会阻止ESP8266连接到网络。

通过以上步骤,您应该能够解决STC15W4K48S4与ESP8266通信中的问题。如果问题仍然存在,建议进一步检查硬件和软件配置,或寻求更专业的支持。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-24 08:27:31 | 显示全部楼层
这种需求一般先分开调试,
1.串口工具连接串口2是否有报文输出
2.用串口工具给esp8266发这些AT指令是否能正常工作
3.才是组合联调
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-24 08:43:13 | 显示全部楼层
代码里的问题:
1.AT发送这里语法问题,字符串拼接里面有"应该用\",否则编译报错
    UART2_SendString("AT+CWJAP=\"Route-1302\",\"wg.89702993\"\r\n"); // 连接WiFi
    delay_ms(3000);
    UART2_SendString("AT+CIPSTART=\"TCP\",\"192.168.3.5\",8080\r\n"); // 连接服务器

2.串口2发送中断里没有及时清除busy状态,只能能出去一个字符
void UART2_ISR() interrupt 8
{
    if (S2CON & 0x01)    // 检测接收中断标志S2RI
    {
        S2CON &= ~0x01;  // 清除S2RI
        // 处理接收数据:S2BUF为接收到的字节
                Receive();
    }
    if (S2CON & 0x02)    // 检测发送中断标志S2TI
    {
        S2CON &= ~0x02;  // 清除S2TI
                        busy = 0;
        // 发送完成处理
    }
}
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-03-25 23:05:12
已绑定手机

1

主题

3

回帖

29

积分

新手上路

积分
29
发表于 2025-3-24 23:51:23 | 显示全部楼层
erci*** 发表于 2025-3-24 08:43
代码里的问题:
1.AT发送这里语法问题,字符串拼接里面有"应该用\",否则编译报错
    UART2_SendString("A ...

谢谢你提供的思路。引号\"原本是有的,复制出来不知怎样就没了。busy的问题已改。现通过芯片的uart2发送的内容如下:
AT+RST
AT+UART=115200,8,1,0,0
AT+CWMODE=1
AT+CWJAP="Route-1302","12345678"
AT+CIPSTART="TCP","192.168.3.5",8080
AT+CIPMODE=1
AT+CIPSEND

将esp826601s连接到芯片的uart2上,不停地闪烁蓝光,路由器中看到不此设备

点评

直接用串口工具连接esp8266逐条测试AT指令是否正确执行  详情 回复 发表于 2025-3-25 08:56
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-03-25 23:05:12
已绑定手机

1

主题

3

回帖

29

积分

新手上路

积分
29
发表于 2025-3-24 23:52:39 | 显示全部楼层
国芯人*** 发表于 2025-3-23 23:23
针对您在使用STC15W4K48S4与ESP8266进行通信时遇到的问题,以下是一些可能的原因和解决方案:

1. 硬件连接 ...

谢谢哦
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-25 08:56:05 | 显示全部楼层
wg2*** 发表于 2025-3-24 23:51
谢谢你提供的思路。引号\"原本是有的,复制出来不知怎样就没了。busy的问题已改。现通过芯片的uart2发送 ...

直接用串口工具连接esp8266逐条测试AT指令是否正确执行
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-03-25 23:05:12
已绑定手机

1

主题

3

回帖

29

积分

新手上路

积分
29
发表于 2025-3-25 23:05:12 | 显示全部楼层
erci*** 发表于 2025-3-25 08:56
直接用串口工具连接esp8266逐条测试AT指令是否正确执行

直接用串口工具连接esp8266逐条测试AT指令是能正确执行的,但将esp826601s与芯片连接就不行了

点评

一个串口和ESP8266通讯,用另一个串口将回复内容传到电脑上,和正常报文对比下,一步一步排查  详情 回复 发表于 2025-3-25 23:09
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-25 23:09:49 | 显示全部楼层
wg2*** 发表于 2025-3-25 23:05
直接用串口工具连接esp8266逐条测试AT指令是能正确执行的,但将esp826601s与芯片连接就不行了 ...

一个串口和ESP8266通讯,用另一个串口将回复内容传到电脑上,和正常报文对比下,一步一步排查
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:21 , Processed in 0.153404 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表