随时向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;
}
}
}
我正在开发一个嵌入式系统,其微控制器是 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;
}
}
}