gpt4 book ai didi

c# - 同时读写arduino

转载 作者:太空宇宙 更新时间:2023-11-03 13:40:04 26 4
gpt4 key购买 nike

我有一种情况,我从传感器(连接到 arduino)读取值,这些值存储在 mysql 数据库中,然后显示在网页上。同时从网页读取继电器值,存储在 mysql 上,然后写入 arduino。我可以分别做,但不能同时做。我附上了一些代码来展示我想要完成的事情。我认为这与串行可用性有关

/*----( SETUP: RUNS ONCE )----*/
void setup() {
Serial.begin(115200);
sensors.begin(); //Get DS18B20 temperatures
sensors.setResolution(probe1, 10); //set resolution to 10bit
sensors.setResolution(probe2, 10); //set resolution to 10bit
Wire.begin(); // Start the Wire (I2C communications)
RTC.begin(); // Start the RTC Chip

digitalWrite(Relay_1, RELAY_OFF); //Relays
digitalWrite(Relay_2, RELAY_OFF);

pinMode(Relay_1, OUTPUT); //Set relays as outputs
pinMode(Relay_2, OUTPUT);
}
/*--(end setup )---*/

/****** LOOP: RUNS CONSTANTLY ******/
void loop() {
ReadSensors();
delay(1000);
ReadRelays();
}

/****** Read Sensors ******/
void ReadSensors()
{
DateTime now = RTC.now(); //Get time from RTC
photolevel = analogRead(photopin); //Read light level

sensors.requestTemperatures();
dallas1 = sensors.getTempC(probe1);
dallas2 = sensors.getTempC(probe2);

dtostrf(photolevel, 1, 0, photo1);
dtostrf(dallas1, 1, 2, temp1);
dtostrf(dallas2, 1, 2, temp2);

String tempAsString1 = String(photo1);
String tempAsString2 = String(temp1);
String tempAsString3 = String(temp2);

Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(" ");
Serial.println(tempAsString1 + " " + tempAsString2 + " " + tempAsString3);
Serial.flush();
}

void ReadRelays()
{
Serial.flush();
// Read all serial data available, as fast as possible
while(Serial.available() > 0)
{
char inChar = Serial.read();
if(inChar == SOP)
{
index = 0;
inData[index] = '\0';
started = true;
ended = false;
}
else if(inChar == EOP)
{
ended = true;
break;
}
else
{
if(index < 79)
{
inData[index] = inChar;
index++;
inData[index] = '\0';
}
}
}

if(started && ended)
{
// The end of packet marker arrived. Process the packet
if (strlen(inData) > 0)
{
char *token = strtok(inData, ",");
if(token)
{
index = 0;
array[index] = atoi(token);
while (token = strtok(NULL, ","))
{
array[index++] = atoi(token);
}
}
}

Serial.println(array[0]);
Serial.println(array[1]);

// Reset for the next packet
started = false;
ended = false;
index = 0;
inData[index] = '\0';
}
}

如有任何建议,我们将不胜感激?

最佳答案

“同时”做几件事的关键是要了解 Arduino 只有一个内核。因此它只会一个接一个地处理东西。现在假设您想同时执行三个函数“action1()”、“action2()”和“action3()”。为了实现这一点,您必须确保

  1. 可以尽可能快地执行所有操作,最好是亚毫秒
  2. 它们都没有“阻塞”

然后像这样把它们连续起来就达到了预期的效果

void loop() {
action1();
action2();
action3();
}

这就是“协同多任务处理”的基本思想。因此,所有操作都必须使用 delay() 或阻塞等待。例如

  while(Serial.available() == 0);

是阻塞等待,必须避免。如果任何操作是一组冗长且复杂的计算,事情就会变得更加复杂。假设 action1() 需要 1s 来处理。然后 action1() 必须被拆分成执行速度足够快的片段。在“状态机”的帮助下,这些片段仍然可以保存在 action1() 中。例如

void action1() {
static uint8_t state = 0;

switch (state) {
case 1: sub_action1_1(); break;
case 2: sub_action1_2(); break;
case 3: sub_action1_2(); break;
default: state = 0; return;
}
++state;
}

当然,子 Action 必须执行得足够快。另一个经常遇到的问题是如何等待而不阻塞。这是通过存储所需的延迟来实现的。例如。像这样

void action1() {
static uint8_t state = 0;
static unsigned long start_millis = 0;

switch (state) {
case 1: sub_action(); break;

case 2: // this starts the delay
start_millis = millis();
break;

case 3: // this checks if the delay has elapsed
if (millis() - start_millis < 1000) {
// if it did not yet elapse ensure that the state will not progress to the next step
return;
}
// if the delay has elapsed proceed to next state
break;

case 4: next_sub_action(); break;

default: state = 0; return;
}
++state;
}

当然这只是基本原理。在“真实”的实现中,您可以根据需要改变它。

另一个经常需要的事情是有一个主循环来做一些事情和一个更高频率的“循环”来做一些其他事情。这通常通过所谓的定时器中断来执行。这是更先进的,但通常也更有效。中断的棘手之处在于它们往往更难调试。我的博客中有一些记录在案的示例。

blinking several LEDs with different frequencies. VU Meter experiment (scroll down!)

关于c# - 同时读写arduino,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17460323/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com