我正在开发一种嵌入式系统,其微控制器是Arduino芯片(Arduino Nano ATmega328P)。
我可以使用FTDI电缆连接到它,使用串行终端读取其输出。现在我想以相反的方式与它进行通信,即发送消息或代码以改变其全局参数。
我知道如果我写一些代码,Arduino什么都不做,只能听串口,我就可以这样做。但我希望能够随时发送消息,即使它正在做其他事情。发送消息可能会触发中断,然后Arduino将执行并行脚本,它会在一段时间内侦听串口...
我可以这样做,还是Arduino无法实现?
谢谢:)
答案 0 :(得分:0)
据我所知(可能是错的),你不能“多线程”一个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;
}
}
}