问题描述
我正在尝试使用PIR传感器(检测到运动时发送邮件)和VL53l0X传感器将数据发送到C#接口,但是无法在Interface中正确分离数据。 VL53L0X仅读取一次数据。我想连续读取数据。 任何人都可以帮助我解决这个问题。谢谢
#include <VL53L0X.h>
#include <Wire.h>
VL53L0X sensor;
#define PIR 2
bool durum = 0;
void setup() {
pinMode(PIR,INPUT);
Serial.begin(9600);
attachInterrupt(0,hareket,RISING);
Wire.begin();
sensor.setTimeout(500);
if (!sensor.init())
{
Serial.println("Failed to detect and initialize sensor!");
while (1) {}
}
sensor.startContinuous();
}
void loop() {
Serial.print(sensor.readRangeContinuousMillimeters());
if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
Serial.println();
}
void hareket()
{
durum = digitalRead(PIR); //Sensör durumu oku
Serial.print("/");
Serial.println(durum); //Sensör durumunu gönder
Serial.print("/");
delay(100);
}
private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
data = serialPort1.ReadLine();
this.Invoke(new EventHandler(displayData_event));
SmtpClient SmtpServer = new SmtpClient();
SmtpServer.Credentials = new NetworkCredential();
SmtpServer.Port = 587;
SmtpServer.Host = "smtp.gmail.com";
SmtpServer.EnableSsl = true;
MailMessage mail = new MailMessage();
mail.To.Add("");
mail.From = new MailAddress("","Arduino - PIR ");
mail.Subject = "Hareket Algılandı!";
mail.Body = "Ortamda hareket algılandı!";
SmtpServer.Send(mail);
Control.CheckForIllegalCrossthreadCalls = false;
}
private void displayData_event(object sender,EventArgs e)
{
label16.Text = data;
}
解决方法
ISR处理程序hareket
会阻止其他ISR处理程序,例如,一个用于millis()
以及delay()
的处理程序。
ISR处理程序应尽可能短,以免丢失中断。
常见的解决方案是设置标志变量(必须是易失的)并在主循环中对其进行处理
如注释中所述,序列号似乎还不错(“尽可能短”规则除外)。它在2014年已修复(我们必须希望所有主板/备用内核都使用该固定代码)。