如标题所见,这是一个失败的项目,我尝试使用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.这个对时序要求很高,害可能我这个串口模块有点问题吧
十分十分希望有大佬,能看出端倪指导一下!不胜感激!