Arduino UNO 和 ESP8266 HUZZAH breakout 之间的软件序列
Software serial between Arduino UNO and ESP8266 HUZZAH breakout
我正在执行一项任务,通过 WIFI 将传感器数据从 esp 发送到 PC 应用程序以将其可视化。这个项目的所有部分都完成了,除了通过软件串行将传感器数据从 UNO 发送到 ESP 的部分。
接线:
将 UNO 的 Rx (0) 连接到 ESP 中的引脚 (12)。作为 Tx
将 UNO 的 Tx (1) 连接到分压器,将 3.3 v 电压连接到 ESP。引脚 (14) 作为 Rx.
- ESP接地。到 UNO 的地面。
- ESP的V+。到UNO的3v3。
代码:
Attached 两个代码来测试这个过程是否有效。一个在 ESP 上,另一个在 arduino
构建后我发现根据下面的屏幕显示,由于 while 循环的条件和我设置的延迟,正在发送一些东西但是输出被转换为数字而不是字符串,随机数!
- V+ of ESP. to 3v3 of UNO.
标准 Uno 上的 3v3 引脚无法为 ESP8266 可靠工作提供足够的电流。
Uno 上的串行连接到 Arduino 引脚 0 和 1,您正在使用它们输出到计算机上的串行监视器(以及上传草图)。您还使用引脚 0 和 1 通过软件串行与 ESP8266 通信。您不能同时将相同的引脚用于这两个目的。您需要为您的软件序列号使用不同的引脚,或者,由于您目前没有对序列号做任何有用的事情,您可以切换到使用 Uno 上的序列号与 ESP8266 通信并删除软件序列号。
如果您打算继续在 Uno 上使用软件串行,那么您应该使用低于 115200 的波特率,因为 Arduino 软件串行库在该速度下不可靠。
我不知道你认为这段代码在做什么:
char x = "ahmad,54,54,45";
while ( ESPserial.available() ) {
ESPserial.write( x );
但肯定不行。
行:
char x = "ahmad,54,54,45";
相当于:
char x = 16;
也许您打算使用字符数组:
char x[] = "ahmad,54,54,45";
但是这与
不兼容
ESPserial.write( x );
因此您需要将其更改为:
ESPserial.print( x );
这将一次打印完整的字符串,或者您可以一次处理一个字符的数组:
ESPserial.write( x[i] );
行:
while ( ESPserial.available() ) {
检查是否有来自 ESP8266 的可用传入数据,但这永远不会是真的,因为您永远不会通过软件串行从 ESP8266 发送任何数据。如果它确实接收到任何数据,那么它将永久卡在 while 循环中,因为您永远不会读取接收到的数据。然后将数字 16 写入 ESP8266,而不是读取不存在的传入数据:
ESPserial.write( x );
我建议您花时间阅读有关 ESP8266 的 documentation for the Arduino SoftwareSerial library. The same information should also apply to the ESP8266 SoftwareSerial library you're using。
我正在执行一项任务,通过 WIFI 将传感器数据从 esp 发送到 PC 应用程序以将其可视化。这个项目的所有部分都完成了,除了通过软件串行将传感器数据从 UNO 发送到 ESP 的部分。
接线:
将 UNO 的 Rx (0) 连接到 ESP 中的引脚 (12)。作为 Tx
将 UNO 的 Tx (1) 连接到分压器,将 3.3 v 电压连接到 ESP。引脚 (14) 作为 Rx.
- ESP接地。到 UNO 的地面。
- ESP的V+。到UNO的3v3。
代码:
Attached 两个代码来测试这个过程是否有效。一个在 ESP 上,另一个在 arduino
构建后我发现根据下面的屏幕显示,由于 while 循环的条件和我设置的延迟,正在发送一些东西但是输出被转换为数字而不是字符串,随机数!
- V+ of ESP. to 3v3 of UNO.
标准 Uno 上的 3v3 引脚无法为 ESP8266 可靠工作提供足够的电流。
Uno 上的串行连接到 Arduino 引脚 0 和 1,您正在使用它们输出到计算机上的串行监视器(以及上传草图)。您还使用引脚 0 和 1 通过软件串行与 ESP8266 通信。您不能同时将相同的引脚用于这两个目的。您需要为您的软件序列号使用不同的引脚,或者,由于您目前没有对序列号做任何有用的事情,您可以切换到使用 Uno 上的序列号与 ESP8266 通信并删除软件序列号。
如果您打算继续在 Uno 上使用软件串行,那么您应该使用低于 115200 的波特率,因为 Arduino 软件串行库在该速度下不可靠。
我不知道你认为这段代码在做什么:
char x = "ahmad,54,54,45";
while ( ESPserial.available() ) {
ESPserial.write( x );
但肯定不行。
行:
char x = "ahmad,54,54,45";
相当于:
char x = 16;
也许您打算使用字符数组:
char x[] = "ahmad,54,54,45";
但是这与
不兼容ESPserial.write( x );
因此您需要将其更改为:
ESPserial.print( x );
这将一次打印完整的字符串,或者您可以一次处理一个字符的数组:
ESPserial.write( x[i] );
行:
while ( ESPserial.available() ) {
检查是否有来自 ESP8266 的可用传入数据,但这永远不会是真的,因为您永远不会通过软件串行从 ESP8266 发送任何数据。如果它确实接收到任何数据,那么它将永久卡在 while 循环中,因为您永远不会读取接收到的数据。然后将数字 16 写入 ESP8266,而不是读取不存在的传入数据:
ESPserial.write( x );
我建议您花时间阅读有关 ESP8266 的 documentation for the Arduino SoftwareSerial library. The same information should also apply to the ESP8266 SoftwareSerial library you're using。