在atmega328p上复制Arduino的串行通信

时间:2018-05-21 06:42:54

标签: arduino atmega serial-communication

我有一个简单的电路,有一个ESP8266和一个Arduino Nano,通过Serial进行通信。

为了测试这种通信,我发送一个简单的"开启"字符串和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。

我有基本电路: enter image description here

加上LED,TX和RX引脚连接到ESP8266。

如果我将相同的代码上传到Atmega328p,它不起作用,所以我想我错过了一些非常重要的东西(比如UART配置或其他东西),但我不知道那是什么是

3 个答案:

答案 0 :(得分:1)

我猜你已经使用了一个带有Atmega328p的外部程序员,而且它是一款全新的Atmega328p。

如果我的假设是正确的,那么Atmega328p中的保险丝位将设置为使用内部1MHz时钟,这就会导致问题。

你可以做些什么来解决这个问题: 将编程器连接到Atmega328p 转到工具>板,在板中选择Arduino Uno。 转到工具>程序员选择您正在使用的程序员。 转到工具并选择Burn bootloader。

然后您可以将代码上传到Atmega328p,它应该按照您期望的方式开始工作。

我希望这会有所帮助。

答案 1 :(得分:1)

如果有人带着类似问题来到这里:

是的,它应该按我的意图运作。

我正在使用损坏的面包板! (如果引脚未连接,则无法收到消息...)

答案 2 :(得分:0)

使用串行API的方式对字节的时间非常敏感。根据接收的字节的时间,您可能只返回到循环的顶部并将command设置为空字符串,这意味着您的程序会忘记它之前看到的字节数。你很幸运,这个代码在一个处理器上工作,并且它在另一个处理器上失败并不奇怪。

现在你如何限制自己使用单字节命令? “T”可以打开LED,“S”可以将其关闭。要实现多字节命令,您可能需要一个小型状态机,并且您需要一次一个地从UART中提供字节,其方式不依赖于时序。