随时向Arduino发送数据

Send data to Arduino at any time

我正在开发一个嵌入式系统,其微控制器是 Arduino 芯片 (Arduino Nano ATmega328P)。

我可以使用 FTDI 电缆连接到它,以使用串行终端读取其输出。现在我想用另一种方式与它通信,即发送消息或代码以改变它的全局参数。

我知道如果我在 Arduino 除了监听串行端口什么都不做的地方编写一些代码,就可以这样做。但我希望能够随时向它发送消息,即使它正在做其他事情。向它发送一条消息可能会触发一个中断,然后 Arduino 将执行一个并行脚本,它会在其中侦听串行端口一段时间...

我能做到吗,还是 Arduino 做不到?

谢谢:)

据我所知(可能是错误的),你不能 "multi-thread" arduino(不知道有任何微控制器支持这个)。本质上,微控制器应该以与计算机不同的风格进行编码。您不能假设无限的资源和无限的线程。相反,这完全取决于您的主循环速度以及如何分配您的资源。 arduino 示例(无延迟闪烁)是如何使用计时器完成此操作的示例。基本上,您将所有进程放在它们自己的计时器中,以便它们在每个计时器间隔内执行一次,并在所有其他时间被跳过。假设 none 个进程在主循环中,这将允许在每个进程之后进行上下文切换,因为程序将循环返回主循环以寻找下一个任务计时器。如果你把所有的循环过程都放在这样的计时器上,然后把你的串行可用性检查放在另一个(相当高频率的)计时器中,并在你看到它的任何时候抓取串行,我相信它会给你你想要的结果。请记住,尽管串行读取和写入是一个相对较慢的过程,因此在读取或写入之后,您可能需要注意依赖于紧密频率调用的其他进程(例如读取麦克风以确定声音频率需要每次阅读连载时都会重置)。

--编辑 不管怎样,我今天真的在做这个,所以你开始吧:

*请注意,我不需要阅读传入的序列号,因此请您自行解决。 (但显示了在哪里完成)

boolean resetMicRecording = true;

unsigned long microphoneTimer = 0;
unsigned long microphonePeriod = 100; //us

unsigned long serialTimer = 0;
unsigned long serialPeriod = 500; //ms


void setup() {
  Serial.begin(9600);
}

void loop() {

  if (micros() - microphoneTimer >= microphonePeriod)
  {
    microphoneTimer = micros();
    //do microphone task
    if(resetMicRecording)//first time flag
    {
      //set inital recording stuff
      resetMicRecording = false;
    }
    else//consistent frequency sampling
    {
      //precision analog reading, logging, and processing if nec
    }
  }

  if (millis() - serialTimer >= serialPeriod)
  {
    serialTimer = millis();
    if(Serial.available()>0)
    {
      //read your incoming serial here

      //reset sensitive device timers to startup
      resetMicRecording = true;
    }
  }
}