【失败项目】使用esp8266实现无线透传,利用stc-isp下载stc8A,目前完成了无线透传

博主尝试使用ESP8266实现无线透传功能,以方便全国大学生智能车竞赛中STC单片机的远程烧录。通过Arduino IDE对ESP8266进行编程,搭建了客户端与服务器,实现了串口数据的无线传输。然而,在尝试无线烧录STC单片机时遭遇挑战,初步推测问题可能涉及波特率设置、电平转换和时序匹配。
摘要由CSDN通过智能技术生成

如标题所见,这是一个失败的项目,我尝试使用esp8266的来实现无线透传,从而下载单片机,最后遇见了一些问题,自己本身想做一下记录,如果大佬们感兴趣可以玩下看一看

目前是准备参加全国大学生智能车竞赛的节能组,然后呢今年节能组指定的单片机是stc,所以我突发奇想,如果我们在对车子调代码的时候,能整个无线烧录,那就挺方便的了,说干就干,一开始脑子里有俩个方案,分别是用蓝牙进行传输也就是HC-05这模块,还有个就是esp8266,因为自己一直以来对esp8266有所了解,但是呢具体的我没有使用过,所以为了尝试使用,我就是使用了esp8266,那么我们开始吧
首先我们是需要对esp8266进行编程,esp8266有很多种方式烧录,这里我使用的是arduino来烧录,如何进行下载可以参考我这篇博客手把手教你如何利用arduino IDE对esp8266进行下载,个人实测教学有手就行
下一步我们就是进行无线透传功能的实现,我们分别是有一个客户端client和一个服务器server,代码如下(这里说明一下,代码非原创,也是从网上寻找总结修改得来,因为当时的贴子已经不知道是哪些了,所以就没办法外附链接)

客户端
#include <ESP8266WiFi.h>

//wifi密码及ssid
const char *ssid     = "12345";
const char *password = "147258369";
//目标服务器ip即端口号
const char *host = "192.168.43.81";
const int tcpPort = 889;

WiFiClient client;//tcpclient实例

void setup() {
  //启动串口通信
  Serial.begin(115200);

  delay(10);

  //连接到WiFi
  WiFi.begin(ssid, password);

  //处理未连接异常
  while(WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.println("waiting");
  }
   Serial.println("ok!");
   
}

void loop() {
  //处理未连接到服务器异常
  while(!client.connected())
  {
    if(!client.connect(host, tcpPort))
    {
      delay(500); 
      Serial.println("not connect");
    }
  }
  //透传数据
  while (client.available())//读取到的数据转发到到串口
  {
      uint8_t c = client.read();
      Serial.write(c);
  }


  if (Serial.available())//串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
  {
      size_t counti = Serial.available();
      uint8_t sbuf[counti];
      Serial.readBytes(sbuf, counti);
      client.write(sbuf, counti);

  }

}
服务端
#include <ESP8266WiFi.h>
#define MAX_SRV_CLIENTS 3   //最大同时联接数,即你想要接入的设备数量,8266tcpserver只能接入五个,哎

const char *ssid = "12345"; 这里是我的wifi,你使用时修改为你要连接的wifi ssid
const char *password = "147258369"; //你要连接的wifi密码

//IPAddress local_IP(192, 168, 43, 181);//加入路由器时192, 168, 0, 1开始或根据路由分配的起始IP可到路由器中查看
//IPAddress gateway(192, 168, 43, 1);//加入路由器时192, 168, 0, 1/手机自建服务器时路由网关192, 168, 43, 1
//IPAddress subnet(255, 255, 255, 0);

WiFiServer server(889);//你要的端口号,随意修改,范围0-65535
WiFiClient serverClients[MAX_SRV_CLIENTS];
void setup()
{
    Serial.begin(115200);
    Serial.println("ok!");
    //WiFi.config(local_IP, gateway, subnet);//192.168.0.200
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED)
    {
        Serial.println("waiting");
        delay(500);
        
    }
    Serial.println("ok!");
    server.begin();
    server.setNoDelay(true);  //加上后才正常些
    Serial.println(WiFi.localIP());
}

void loop()
{

    uint8_t i;
    if (server.hasClient())
    {
        for (i = 0; i < MAX_SRV_CLIENTS; i++)
        {
            if (!serverClients[i] || !serverClients[i].connected())
            {
                if (serverClients[i]) serverClients[i].stop();//未联接,就释放
                serverClients[i] = server.available();//分配新的
                Serial.print("1个新的客户端: ");
                Serial.println(i);
                continue;
            }

        }
        WiFiClient serverClient = server.available();
        serverClient.stop();
    }
    for(i = 0; i < MAX_SRV_CLIENTS; i++){
 
    if (serverClients[i] && serverClients[i].connected()){
 
      if(serverClients[i].available()){
 
        //从Telnet客户端获取数据,并推送到URAT端口
 
        while(serverClients[i].available()) Serial.write(serverClients[i].read());
 
        }
      }
 
    }
    if (Serial.available())
    {
        size_t len = Serial.available();
        uint8_t sbuf[len];
        Serial.readBytes(sbuf, len);
        //push UART data to all connected telnet clients
        for (i = 0; i < MAX_SRV_CLIENTS; i++)
        {
            if (serverClients[i] && serverClients[i].connected())
            {
                serverClients[i].write(sbuf, len);  //向所有客户端发送数据
                delay(1);
            }
        }
    }
}

这里需要说明一下,关于客户端的一个ip地址问题,我看到别人代码用的是wifi.ipconfig这个函数,但是亲测客户端和服务端无法连上,我不知道什么问题,我尝试print了ip了,ip是对的不知道为什么,可能是网关那边的问题(为什么计网没有好好学!!!!)也就是我注释的那几行,我现在的方案就是,先从服务端连接,查看服务端连接上去的ip,再去更改客户端的链接ip,这样我发现是可以的。就这样我实现了一个wifi的串口无线透传

紧接着下一步我就是对板子进行下载,查看芯片手册发现,stc8的引脚P3.0和P3.1是分别对应uart的RXD和TXD,老规矩了,TTL转串口下载,直接用串口芯片测试,下载成功,接下来我就用TLL转串口连我的客户端和服务端直接通过连STC8A,如图

在这里插入图片描述
开始下载了…

结果…当然你知道的
什么到这就结束了?那是不可能的,我是那种人吗?
我继续研究,是不是没接收到发送到?
我查阅很多资料,了解到stc-isp这个软件的发送流程如下
1.isp先发0x7f给单片机,单片机收到之后会回复50位的一个单片机信息回去,里面包括了很多信息,我看到的贴子有些他试出来了,有些没试出来
2isp会回复一个什么东西,紧接着就开始下载了

stc对于isp这个下载烧录模式还是没有公开的(好像?),我感觉可以有逆向工程师可以逆一下,手动狗头,于是我就查看到我模拟isp通过串口用上述方案发送0x7f给单片机,单片机确实回复了我50位的一个信息
在这里插入图片描述
然后,我就不知道怎么办了…这下真不知道了

我查阅芯片手册,他叫我给单片机TX接一个4.7k的上拉电阻,我尝试了一下不行,
然后我又思考是不是因为单片机的电平是5V,而esp8266的电平是3.3v,没有办法检测到但是如果按这这个办法来说,又不应该了,因为这个50位的信息能接受发送,就不该说明是电平问题,不过最好还是做一个电平转换电路
这里提出一些猜想
1.波特率太高了115200,isp在下载的时候的波特率设定不知道怎么弄的,我是设定为115200最低,最高也是这个,不知道我设置什么的有没有问题,尝试低一点的波特率
2.我很奇怪的是检测单片机这个选项都无法被检测到就很神奇,讲道理能回复就说明检测到了
3.这个对时序要求很高,害可能我这个串口模块有点问题吧

十分十分希望有大佬,能看出端倪指导一下!不胜感激!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值