在 atmega328p 上复制 Arduino 的串行通信
Replicating Arduino's serial communication on atmega328p
我有一个简单的电路,有一个 ESP8266 和一个 Arduino Nano,通过串行通信。
为了测试这种通信,我发送了一个简单的 "TURN ON" 字符串,Arduino 应该会打开 LED。
这是 Arduino 代码:
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
}
void loop() {
if(Serial.available() > 0)
{
String command = "";
while(Serial.available())
{
command += (char)Serial.read();
delay(1);
if (command == "T"){
while(Serial.available())
{
command += (char)Serial.read();
delay(1);
}
}else{
command = "";
}
}
if(command == "TURN ON") {
digitalWrite(3, HIGH);
}
if(command == "TURN OFF") {
digitalWrite(3, LOW);
}
}
delay(500);
}
这很好用。
现在,我想用 Atmega328p 替换 Arduino。
我有基本电路:
加上 LED,TX 和 RX 引脚连接到 ESP8266。
如果我将相同的代码上传到 Atmega328p,它不起作用,所以我想我遗漏了一些非常重要的东西(比如 UART 配置或其他东西)但我不知道那是什么
我猜你在Atmega328p上使用了外部编程器,而且是新鲜的Atmega328p。
如果我的假设是正确的,那么您的 Atmega328p 中的熔丝位设置为使用内部 1MHz 时钟,这就是问题所在。
您可以采取什么措施来解决此问题:
将编程器连接到 Atmega328p
转到工具>板,板中的 select Arduino Uno。
转到工具>程序员 select 您正在使用的程序员。
转到工具和 select 烧录引导加载程序。
然后您可以将您的代码上传到 Atmega328p,它应该会按照您期望的方式开始工作。
希望对您有所帮助。
您使用 Serial API 的方式对字节的计时非常敏感。根据接收到的字节的时间,您可能只是回到循环的顶部并将 command
设置为空字符串,这意味着您的程序忘记了它之前看到的字节。您很幸运,这段代码在一个处理器上运行,在另一个处理器上失败也就不足为奇了。
你暂时将自己限制在一个字节的命令上如何? 'T' 可以打开 LED,'S' 可以关闭它。要实现多字节命令,您可能需要一个小型状态机,并且您需要一次从 UART 以一种不依赖于时间的方式向它提供一个字节。
如果有人来到这里遇到类似问题:
是的,它应该按我的预期工作。
我使用的是损坏的面包板! (如果没有连接pin是收不到消息的...)
我有一个简单的电路,有一个 ESP8266 和一个 Arduino Nano,通过串行通信。
为了测试这种通信,我发送了一个简单的 "TURN ON" 字符串,Arduino 应该会打开 LED。
这是 Arduino 代码:
void setup() {
Serial.begin(9600);
pinMode(3, OUTPUT);
}
void loop() {
if(Serial.available() > 0)
{
String command = "";
while(Serial.available())
{
command += (char)Serial.read();
delay(1);
if (command == "T"){
while(Serial.available())
{
command += (char)Serial.read();
delay(1);
}
}else{
command = "";
}
}
if(command == "TURN ON") {
digitalWrite(3, HIGH);
}
if(command == "TURN OFF") {
digitalWrite(3, LOW);
}
}
delay(500);
}
这很好用。
现在,我想用 Atmega328p 替换 Arduino。
我有基本电路:
加上 LED,TX 和 RX 引脚连接到 ESP8266。
如果我将相同的代码上传到 Atmega328p,它不起作用,所以我想我遗漏了一些非常重要的东西(比如 UART 配置或其他东西)但我不知道那是什么
我猜你在Atmega328p上使用了外部编程器,而且是新鲜的Atmega328p。
如果我的假设是正确的,那么您的 Atmega328p 中的熔丝位设置为使用内部 1MHz 时钟,这就是问题所在。
您可以采取什么措施来解决此问题: 将编程器连接到 Atmega328p 转到工具>板,板中的 select Arduino Uno。 转到工具>程序员 select 您正在使用的程序员。 转到工具和 select 烧录引导加载程序。
然后您可以将您的代码上传到 Atmega328p,它应该会按照您期望的方式开始工作。
希望对您有所帮助。
您使用 Serial API 的方式对字节的计时非常敏感。根据接收到的字节的时间,您可能只是回到循环的顶部并将 command
设置为空字符串,这意味着您的程序忘记了它之前看到的字节。您很幸运,这段代码在一个处理器上运行,在另一个处理器上失败也就不足为奇了。
你暂时将自己限制在一个字节的命令上如何? 'T' 可以打开 LED,'S' 可以关闭它。要实现多字节命令,您可能需要一个小型状态机,并且您需要一次从 UART 以一种不依赖于时间的方式向它提供一个字节。
如果有人来到这里遇到类似问题:
是的,它应该按我的预期工作。
我使用的是损坏的面包板! (如果没有连接pin是收不到消息的...)