【发布时间】:2016-05-04 07:54:37
【问题描述】:
我会开始告诉你,关于函数 serialEvent 的引用对于 Arduino 没有很好的记录。 https://www.arduino.cc/en/Reference/SerialEvent
由于缺乏信息,我误解了此功能的工作原理。 因为我有 Arduino Mega 2560,它带有 4 个串行输入/输出,并且它们有自己的 serialEventX 函数(其中 X = {'',1,2,3})。
我已经成功与一个 ESP8266 模块通信,一旦客户端连接到它,它就会发送和接收信息。
使用serialEvent1(1,因为它连接到RX1和TX1)我希望仅在数据传入时调用serialEvent1,但实际上每当我使用Serial1.write(msg)时也会调用,所以这意味着当消息正在发送。
#define DEBUG_ESP8622 1
#include <esp8622.h>
#include <string.h>
#include "common.h"
#include <stdlib.h>
Wifi esp = Wifi(); //Here Serial1.begin(115200) happens
void setup() {
Serial.begin(9600); //First of all SERIAL for debugging
Serial.println("Starting");
while(!esp.sReachable()); //Works
Serial.println("ESP found");
while(!esp.sSetMode(1)); //Works
Serial.println("Mode set to Client");
while(!esp.sConnect(WIFISSID,WIFIPASSWORD)); //Works
Serial.println("Connected");
Serial.print("IP:");
Serial.println(esp.getIP());
while(!esp.sStartServer(80)); //Works
Serial.println("Server started");
}
void loop() {
if(Serial.available()>0){
int inByte=Serial.read();
/*HERE whenever I call Serial1.write(inByte)
serialEvent1 will be called at the end of the loop
but actually I don't want it to
*/
Serial1.write(inByte);
}
}
void serialEvent(){
return;
}
void serialEvent1(){
Serial.println("Write or Read event?");
while(Serial1.available()>0){
int inByte=Serial1.read();
//Serial.write(inByte);
}
//esp.onSerialEvent(); //Stores message and parses it, not relevant
return;
}
所以现在,知道 Arduino 库是基于 AVR libc 库的,我想微控制器内部的 RX1 和 TX1 中断都通过 Arduino 库绑定到 serialEvent1。
是否可以使用库仅解除 TX1 与 serialEvent1 的绑定,并且仍然使用 Arduino 库 (Serial1.write()/read())?
我使用最简单的方法使用 Makefile 将代码上传到 Mega。选择从命令行使用 arduino 是因为到目前为止它适合我的需求,我知道 avrdude 和 avr-gcc 是从命令行编译/上传的更完整或更好的方法,如果我错了,请纠正我。
CC=arduino
upload: terminal.ino
$(CC) terminal.ino --upload
verify: terminal.ino
$(CC) terminal.ino --verify
如果我开始使用,我应该开始学习如何使用 avrdude 和 avr-gcc 吗? (或者可能与使用 AVR 库无关)
最后,我正在使用带有 USB 电缆的上述 Makefile,如果我使用 avrdude 和 avr-gcc 是通过 ICSP 还是仍然可以通过 USB 电缆使用?这会消除引导加载程序吗?
非常感谢
【问题讨论】:
-
当
serialEvent1()被调用时,有没有数据Serial1.available()? - 您可能希望将serialEvent1()更改为while(Serial1.available()>0){而不是if(...。 -
另外,您可能还想检查 ESP8266 是否配置为
echo将您的命令返回给您 (ATE0/ATE1)。 -
@HannoBinder,感谢您的指出,更改了它。关于 ESP8266 回显,它没有,已经用这里提到的代码检查了它:arduino.cc/en/Tutorial/MultiSerialMega
-
@HannoBinder 实际上你是对的,我正在阅读下面发布的 NeoHWSerial 代码,实际上 TX 引脚没有调用serialEvent,我没有仔细检查 ESP8266 的回声,这一次做对了ATE0 解决了这个问题。请贴出AT指令参考,我用的是这套link
-
@HannoBinder,请发布您用于 ESP8266 的 AT 命令集参考,
标签: arduino interrupt avr avr-gcc avrdude