代码之家  ›  专栏  ›  技术社区  ›  user7320967

随时向Arduino发送数据

  •  1
  • user7320967  · 技术社区  · 8 年前

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

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

    我知道,如果我编写一些代码,而Arduino只监听串行端口,那么就有可能做到这一点。但我希望能够在任何时候向它发送消息,即使它正在做其他事情。向其发送消息可能会触发一个中断,然后Arduino将执行一个并行脚本,在该脚本中侦听串行端口一段时间。。。

    我能做到这一点吗,还是说用Arduino就不可能了?

    谢谢:)

    1 回复  |  直到 8 年前
        1
  •  0
  •   Sneaky Polar Bear    8 年前

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

    --编辑 不管怎么说,我今天确实在做这件事,所以给你:

    *请注意,我不需要读取传入的序列号,所以将该位留给您来解决。(但显示了将在何处进行)

    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;
        }
      }
    }