如何使用汇编对 ESP32 或 ESP8266 模块进行编程?我不想使用arduino ide。我想出了一种用汇编对 atmel 芯片进行编程的方法。我想学习如何用汇编语言对 esp32 和 esp8266 进行编程。
我在 Arduino 设备(本例中为 ESP8266)的 Visual Studio Code 中看不到任何 Serial.print() 输出。我期待在调试控制台上看到它。我是否配置不正确?
我知道我的代码正在工作,因为 LED 正在闪烁,但我在任何地方都没有看到任何输出。
这是我的代码:
#include <Arduino.h>
void setup()
{
Serial.begin(9600); // EDIT: added this line
Serial.println("Setup...");
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
Serial.print("On!");
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
Serial.print("Off!");
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
Run Code Online (Sandbox Code Playgroud)
我正在使用此板: https://www.waveshare.com/wiki/e-Paper_ESP8266_Driver_Board
这是我的 platformio.ini 文件:
[env:esp12e]
platform = espressif8266 …Run Code Online (Sandbox Code Playgroud) 我正在反汇编和检查(主要是为了乐趣和学习)为 ESP8266 (Xtensa ISA) 生成的 Arduino 代码。
到目前为止,我一直在跟踪代码,没有出现任何问题,直到4010f4c2主函数中的大括号(位置):
4010f494 <main>:
4010f494: 90a092 movi a9, 144
4010f497: c01190 sub a1, a1, a9
4010f49a: 00a022 movi a2, 0
4010f49d: 236102 s32i a0, a1, 140
4010f4a0: 2261c2 s32i a12, a1, 136
4010f4a3: 2161d2 s32i a13, a1, 132
4010f4a6: ffc2c5 call0 4010f0d4 <print_version>
4010f4a9: 202110 or a2, a1, a1
4010f4ac: 001045 call0 4010f5b4 <eboot_command_read>
4010f4af: 00d256 bnez a2, 4010f4c0 <main+0x2c>
4010f4b2: 024c movi.n a2, 64
4010f4b4: fee101 l32r a0, 4010f038 <_stext+0x38>
4010f4b7: …Run Code Online (Sandbox Code Playgroud) 我想使用 ESP32 在我的计算机上执行与 netcat“nc” 命令相同的请求:
电脑:
$ nc tcpbin.com 4242
Test
Test
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试过的:
#include <Arduino.h>
#include <WiFi.h>
WiFiClient localClient;
const char* ssid = "...";
const char* password = "...";
const uint port = 4242;
const char* ip = "45.79.112.203"; // tcpbin.com's ip
void setup() {
Serial.begin(115200);
Serial.println("Connect Wlan");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println(WiFi.localIP());
}
void loop() {
sendRequest();
delay(200);
}
void sendRequest() {
if(!localClient.connected()) {
if (localClient.connect(ip, port)) …Run Code Online (Sandbox Code Playgroud) 经过一些反复试验,今晚我的Arduino Uno开始与ESP8266模块进行通信,最常见的接线方式是,从大尺寸外部电源为模块提供3.3V电源,直接连接3.3V TX线路和分压器从5V RX读取.
SoftwareSerial esp8266(2,3);
void setup()
{
Serial.begin(9600);
esp8266.begin(115200);
char buffer[50];
esp8266.write("AT\r\n");
esp8266.readBytes(buffer, sizeof(buffer));
Serial.println(buffer);
}
Run Code Online (Sandbox Code Playgroud)
在为ESP8266 < - > Arduino串行通信设置115200速度后,串行监视器上出现了一些明确的启动消息和命令响应.
由于这些消息是由一些垃圾字符交错的,我试图降低通信速度.为此,我向AT+IPR=9600模块发出命令,该模块立即显示蓝色LED上的一些操作,控制台上的OK响应,最后导致相同的LED被固定.
我随后调整了串行速度上的Arduino的一侧,有esp8266.begin(9600);,但永远无法获得与模块的任何进一步的沟通.
我现在只能以任何速度看到垃圾.
模块可以升级到不同的速度吗?我尝试了很多(4800,57600,19200,回到115200等),但显示器上没有明显的响应.
您是否可以建议重新建立连接?有没有办法重置上一个命令结果?如果可以尝试任何更简单的解决方案,我宁愿避免设置固件更新.
不幸的是,我找不到关于NodeMCU的硬件规格.
所以我想了解GPIO电流限制,独立电源消耗和电路板尺寸.
或者您可以分享有关NodeMCU硬件规格的链接吗?
有些页面说GPIO Current Maximum是12mA,但我找不到任何自信的说法.
谢谢.
我希望能够将数据从网页发送到 esp8266 并控制引脚,每当我按下网页上的按钮时,它都会返回 ESP 的 i 地址和CONNECTION REFUSED. 我究竟做错了什么?
ESP代码:
void setup() {
Serial.begin(115200);
delay(100);
Serial.println();
Serial.println();
Serial.print("Connecting to: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while( WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("Netmask: ");
Serial.println(WiFi.subnetMask());
Serial.print("Gateway: ");
Serial.println(WiFi.gatewayIP());
}
int value = 0;
void loop() {
HTTPClient http;
http.begin("192.168.0.24:80");
int httpCode = http.GET();
if(httpCode > 0){
String payload = http.getString();
Serial.println(payload);
}
http.end();
delay(3000);
}
Run Code Online (Sandbox Code Playgroud)
HTML网站:
<html>
<head>
<title>ESP8266 toggle page</title>
</head>
<body> …Run Code Online (Sandbox Code Playgroud) 在SPIFFS中的文件内,我将以"XX:XX:XX:XX:XX:XX"的形式保存有关mac地址的信息.当我读取文件时,我需要将它从STRING切换为十六进制值数组.
uint8_t* str2mac(char* mac){
uint8_t bytes[6];
int values[6];
int i;
if( 6 == sscanf( mac, "%x:%x:%x:%x:%x:%x%*c",&values[0], &values[1], &values[2],&values[3], &values[4], &values[5] ) ){
/* convert to uint8_t */
for( i = 0; i < 6; ++i )bytes[i] = (uint8_t) values[i];
}else{
/* invalid mac */
}
return bytes;
}
wifi_set_macaddr(STATION_IF, str2mac((char*)readFileSPIFFS("/mac.txt").c_str()));
Run Code Online (Sandbox Code Playgroud)
但我在某处的代码中错了
当我AA:00:00:00:00:01输入文件时,我的ESP8266设置29:D5:23:40:00:00
我需要帮助,谢谢
我正在尝试使用 nodemcu v3 和 dht11 构建一个基本的 MQTT 发布器来发送温度数据。我正在使用 ESPlorer,当我尝试上传代码时,它告诉我该paho模块不存在。我的代码如下:
import time
import network
import paho.mqtt.client as mqtt
sta_if = network.WLAN(network.STA_IF)
ap_if = network.WLAN(network.AP_IF)
sta_if.connect('<MySSID>', '<MyPW>')
mqtt = mqtt.Client()
mqtt.connect("randomIPaddress")
pin = machine.Pin(4)
temp_instance = dht11.DHT11(pin)
result = temp_instance.read()
print("Temperature is: %d C" % result.temperature)
print("Humidity is: %d %%" % result.humidity)
message = result.temperature
mqtt.publish("base/dht11/temp", message)
mqtt.loop_forever()
Run Code Online (Sandbox Code Playgroud)
我仍然对 MQTT 发布的工作原理感到非常困惑,而且我似乎找不到任何在这一点上相互同意的来源。我所看到的每个地方都有不同的解决方案来解决我的问题。
有谁知道为什么 ESPLorer 一直告诉我该paho模块不存在?我已经尝试按照文档中所示安装模块,但这让我无处可去。
编辑: https: //pypi.python.org/pypi/paho-mqtt/1.1 这些是我安装 paho 所遵循的说明。
文档说可以使用 RTC.init 调用初始化 RTC 时钟。
https://docs.micropython.org/en/latest/esp8266/library/machine.RTC.html
但它不会那样工作:
>>>import machine
>>>rtc = machine.RTC()
>>>rtc.init((2018,4,10,17,30))
Traceback (most recent call last):
File "<stdin>", line 1 in <module>:
AttributeError: 'RTC' object has no attribute 'init'
Run Code Online (Sandbox Code Playgroud)
所以文档与现实相矛盾。固件版本是 v1.9.3 - 几天前下载了最新的。
最有趣的是,dir(rtc)给出['datetime','memory','alarm','alarm_left','irq','ALARM0']. 它缺少其他几种方法:now、deinit、cancel
那么RTC init方法在哪里,它怎么会消失呢?
UPDATE:我已经想通了,该文件是错误的,我需要使用RTC.datetime代替RTC.init。但它仍然是错误的:
>>>from machine import RTC
>>>rtc=RTC()
>>>rtc.datetime((2000,1,1,23,59,59,0,0))
>>>rtc.datetime()
(2000, 1, 3, 0, 11, 59, 3, 705)
Run Code Online (Sandbox Code Playgroud)
换句话说:2000-01-01T23:59:59 突然变成了 2000-01-03T00:11:59。如何?
我在 RTC.datetime 方法的 tzinfo 参数上也找不到任何有用的东西。它应该是一个数字,这很清楚。但是这是什么意思?
我也试过午夜:
>>>rtc.datetime((2000,1,1,0,0,0,0,0))
>>>rtc.datetime()
(2000,1,1,5,0,0,1,155)
Run Code Online (Sandbox Code Playgroud)
因此,在 tzinfo=0 时,午夜变为 05:00:00。我首先认为这意味着 …
我正在创建一个系统,该系统通过SoftwareSerial从Arduino Uno读取传感器值,并通过MQTT发布它。但是,我认为所面临的问题更为笼统,我必须承认我是c语言的新手。
我正在读取数据,并将其拆分为程序顶部定义的两个const *变量。
当我读回从串行连接中解析的已保存的“数据”和“主题”变量时,我只会得到垃圾输出,通常会崩溃,从而重启设备。
它可以在read-from-serial函数中成功打印它们,但以后无法正确读取。它与数据的保存方式有关吗?我可以为变量显式分配一些内存吗?
我正在使用ESP8266(ESP07)芯片,其波特率降低且电源电压合适。它似乎运行良好且稳定。
#include <StringSplitter.h>
#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <time.h>
//const char* ssid = "xxxx";
//const char* password = "xxxx";
const char* ssid = "xxxx";
const char* password = "xxxx";
const char* mqttServer = "xxxx;
const int mqttPort = xxxx;
const char* mqttUser = "xxxx";
const char* mqttPassword = "xxxx";
int timezone = 1;
int dst = 0;
Run Code Online (Sandbox Code Playgroud)
数据存储在这里:
char* data;
char* topic;
boolean newData = false;
boolean unpublishedData = false;
WiFiClient espClient;
PubSubClient client(espClient); …Run Code Online (Sandbox Code Playgroud)