为什么 测试esp8266 串口乱码会出现这么乱码 求大神

关于Arduino软串口与ESP8266模块连接时,8266一直发送乱码信息的一种解决办法
本人最近入手一块ESP8266模块,打算用于Arduino
UNO板与电脑的WiFi通信,然而在配置8266的时候,遇到了一些神奇的事情,在此写下解决方案,备忘。
刚入手8266,测试8266的原计划是将Arduino作为USB转TTL来使用,于是,我在Arduino中烧入了一个软串口程序,并将接线方式如下所示:
ESP8266------------------------Arduino
------------------------GND
------------------------3.3
------------------------3.3
CH_PD&&------------------------3.3
------------------------D3(软串口的RX)
------------------------D2(软串口的TX)
其他浮空。
上电后的现象就是一直向串口发送乱码信息。
解决办法:
受ESP8266固件烧写程序的提示(8266要单独供电),我把8266的用Arduino供电,而串口则改用USB转TTL的RX和TX,即将Arduino上的D2换为USB转TTL的RX,将Arduino上的D3换为USB转TTL的TX,其他接线不便,上电后,就成功出现了下图
“ready”,这个词很令人兴奋。
以上的解决方法关键点在于ESP8266的供电和串口分开,也就是说,要用独立供电。不过我在尝试这种方法的时候又出现了新的问题:8266会时不时的重启,暂不明确是什么原因,待解决完后再发博文说明。
以上解决办法只是个人的尝试,暂不清楚具体原因是什么,也不排除是巧合的可能。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。现在位置:
我想问个问题:我在user_init中添加uart_init(BIT_RATE_115200,BIT_RATE_115200);但是上电后输出还是乱码,为什么?
电池1.5V X2 单独供电就没问题了
是(1)部分乱码显示,但是最后一部分不是乱码;还是(2)全都都是乱码?
如果是前者,那是正常的。因为在你在user_init中添加uart_init(BIT_RATE_115200,BIT_RATE_115200);之前,ESP8266EX芯片就开始在串口输出了,这部分串口输出包括芯片内部的固有输出、BOOT固件中的初始输出、USWR支出SDK库通过FLASH参数初始化极其输出、然后才到你的USER区的打印输出。而且这几个部分的波特率还都不一样,而且在不同的重启模式下,同一个区域使用的波特率还可能变化,所以在串口工具的单一波特率设置下,看到部分乱码是不可避免的。只要最后一部分,就是在你的user设置期望的波特率之后,那部分输出可以看到,就可以了。
或者,你非要看到这部分乱码的内容是什么,而看到乱码就不舒服斯基,那么你可以选择具备波特率自适应的串口工具,比如这个链接的工具,可以全面显示出乱码。
ESP8266EX调试下载软件
而如果是后者,全部都是乱码,看不到任何READY之类的,在排除你的波特率没设置匹配对之后,你可能需要看看是不是你的代码有问题,或者烧写有问题,导致你的USER其实是没有正常执行的。这个时候,你可以将波特率设置到74880bps,然后去看初始启动、BOOT启动的打印输出,看看是否正确的跳入了USER,以及跳入USER CODE之后初始化是否正确,这些在串口上都会有打印输出提示的。上面的
ESP8266EX调试下载软件 也支持74880bps波特率,你可以试一试。大神教你ESP8266怎么在线升级
Esp8266在线升级,其实安信可、机智云都有提供接口,可是你得用人家服务器。这里说说我是怎么用esp8266的sdk实现在线升级的。
简单来说,就是在服务器放上我的bin文件,然后esp8266访问,通过http下载。然后擦写esp8266的flash,写进自己新的bin文件。
这里每个函数都只给函数名。怎么用,大家还是要自己好好看下sdk的手册。
数据传输:
1、 搭建服务器:
我使用的是wmap。关于如何配置使用,网上很多,贴个链接:
/link?url=KxbUiffPiMQGtbDbp4UWzDzdUentyPkXyTs7OvmNkCIbU97QG2TEUXSwiFBlAS0QLGs_IjVuTvetV-zaz_cdd5XHu09PpOoM9YqnmMO3Pd6IC6SLu3l2SC_YyOH3gmqI
2、 Esp8266搭建tcpclient:
赋值espconn结构体,这里使用http下载,所以服务器端口是80。
使用espconn_regist_recvcb()注册数据返回的回调函数,我们要的bin数据,到时候就是返回到这个函数里面的啦,注意好咯。
使用espconn_connect()连接服务器。有的时候因为一些网络问题会连接不上,这样下面的数据传输也会出错,所以要注意。
向服务器发送GET请求,espconn_sent()。发送的数据:"GET /espBin/user1.bin HTTP/1.1rnAccept:*/*rnHost: 120.24.71.183:80rnConnection: Keep-Alivernrn0"。/espBin/user1.bin这个是服务器的文件。120.24.71.183:80这个是服务器地址。
3、 接收文件:
Void espconn_recv_callback(void *arg, char *pdata, unsigned short len)
这个是上面用espconn_regist_recvcb()注册的回调函数。*arg是espconn的指针,可以判断数据的ip地址是否是服务器ip。*pdata是数据指针,len是每次接收到的数据长度。
返回的数据是http数据,会有http包头,而且接收到的文件是分包的,回调函数会执行多次。
这里有两个问题。我们在数据段里,怎么分辨bin文件数据在哪里开始?又怎么判断数据什么时候结束呢?
首先esp8266编译出来的bin文件,文件头是有特征的,只根据编译时的选项改变。这样就可以找到bin文件从哪里开始了。关于第二个问题,我选择的办法是,在文件结尾加4个字节作为标识(注意:这个标识不要也一起写到flash里面去哦!)。
注意:数据的传输方式不一定要跟我一样,喜欢通过串口传输数据都没问题的。这里的传输方式只是给大家一个参考。下面的才是重点。
数据写入:
1、 擦除flash扇区:
spi_flash_erase_sector()只擦除要写入的空间,别把全部都擦了。这个函数每次只擦一个扇区我使用了一个for循环擦除连续的多个扇区。
注意:一定要写擦除了才能开始写!
2、 写入flash:
spi_flash_write()这里很简单,就是写入数据,但是要注意,写入数据要4字节对齐。这里有个问题,网络传输过来的数据,不一定是4的倍数的,大家要注意怎么整理好数据。
3、 验证:
如果程序写入,能正常运行,那么真的恭喜各位。可是。。。现实是残酷的,基于各种原
因,写入的数据,会和我们想的不一样。那么我们怎么才能知道哪里出问题。
spi_flash_read()读出来。我是通过串口输出,可是经常输出着然后自动重启了。主要是我循环输出一直占着,只要system_soft_wdt_feed()喂下看门狗就行。串口输出速率可以调到1152000哦。3个零!
观察串口打印信息,esp8266上电时串口波特率是74880。
最后告诉系统,升级成功重启。
system_upgrade_flag_set(UPGRADE_FLAG_FINISH);
system_upgrade_reboot();
这里使用到升级功能,所以编译方式和一般的NON-FOTA的有所不同,存储位置,固件文件也有所不同。详细可以参考ESP8266云端升级指南。
每次升级要注意,现在运行的是user1.bin还是user2.bin这两个程序,在擦写flash时的位置是不一样的。而且,这两个文件编译出来也是有一点差别的。通过system_upgrade_userbin_check()可以确认正在运行的是哪一个user.bin。
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点

我要回帖

更多关于 为什么电脑会出现乱码 的文章

 

随机推荐