从 VS WPF 到 Arduino 通过串行通信时的奇怪行为
Strange behaviour when communicating over serial from VS WPF to Arduino
基本概述。由于 WPF 应用程序,我正在从 Arduino 发送串行数据。到目前为止,这一切都运行良好。今天我在 Arduino 代码中实现了一个循环,在串口中寻找 "Y" (ascii 89),如果收到它就会离开循环,然后 returns 回到我所说的离线模式并停止发送关于数据,通过在线 = false.
现在奇怪的是...
在这个循环之前它工作正常所以它一定是在它离开 'online loop'.
[=54= 后尝试重新发送新数据]
它在 Arduino 串行监视器上完美运行,这表明这是一个 WPF 问题,尽管上传部分的代码没有更改。
这两个程序的代码都非常大,所以我会在提供所有必要信息的同时尽量保持简洁。
void loop() {
// Check to see if the testbench is in offline mode and run the respective code.
if (Online == false) {
OfflineMode();
}
// Check to see if the testbench is in online mode and run the respective code.
if (Online == true) {
OnlineMode();
}
}
void OfflineMode() {
while (Serial.available())
processlncomingByte(Serial.read());
}
然后我有开关盒来处理传入的设置 - 我知道这工作正常,因为它也会在 Arduino 重置后上传。
void processlncomingByte (const byte c) {
if (isdigit (c)) {
currentValue *= 10;
currentValue += c - '0';
} else {
// end of digit
// The end of the number signals a state change
handlePreviousState ();
// set the new state, if we recognize it
switch (c) {
case 'A':
state = GOT_A;
break;
etc...
在线模式
void OnlineMode() {
CheckForStop();
SendSerialData();
}
void CheckForStop() {
//Serial.println("...");
if (Serial.available() > 0) {
//Serial.println("getting something");
ch = (char)Serial.read();
inputString = ch;
if (ch == 89) {
//Serial.end();
Online = false;
//Serial.begin(9600);
exit;
//return;
}
} else
delay(5);
}
SendSerialData() 仅包含一系列 serial.print
,输出为一个大字符串供 WPF 处理。
Here is a screenshot of the serial monitor working
正如您从上面的 link 看到的那样,监视器吐出大量数据,当我发送 Y 时停止,最后我向 'question' 发送 Q 是否 Arduino 准备好接收设置,S 表示是。太棒了!
但是,正如您从下面的 link 中看到的那样,WPF 中并非如此。抱歉,我目前只能上传 2 张图片,所以不得不合并它们。
Combo of screenshots
这是它目前陷入的循环
private bool checkArduinoisReady() {
Stopwatch Uploadtimer = new Stopwatch();
if (!myPort.IsOpen)
return false;
// Debug.Print("port is ready to be opened");
string tempdata;
Uploadtimer.Start();
myPort.DiscardInBuffer();
Start:
myPort.WriteLine("Q" + Environment.NewLine);
Debug.Print("sent Q");
tempdata = myPort.ReadExisting();
Debug.Print("tempdata_" + tempdata.ToString());
if (Uploadtimer.ElapsedMilliseconds > 5000)
return false;
if (tempdata.Contains("S"))
return true;
else
goto Start;
}
在单独的页面上,这就是我停止传入数据的方式。
private void StopTest(object sender, RoutedEventArgs e) {
MessageBoxResult StopConfirm = MessageBox.Show("Are you sure you want to stop the test?", "Stop the test", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (StopConfirm == MessageBoxResult.Yes) {
Timer.Stop();
Debug.Print("Timer Stopped");
myPort.DiscardInBuffer();
Start:
for (int i = 0; i < 100; i++) {
myPort.WriteLine("Y");
}
string tempData = myPort.ReadExisting();
Debug.Print("Checking...");
Debug.Print("tempData_" + tempData);
if (string.IsNullOrWhiteSpace(tempData)) {
Debug.Print("Its null!!");
comments_textbox.Text = comments_textbox.Text + "Test Aborted";
MessageBoxResult SaveCurrentData = MessageBox.Show("Would you like to save the data collected up until this point?", "Save", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (SaveCurrentData == MessageBoxResult.Yes) {
SaveFile();
}
if (SaveCurrentData == MessageBoxResult.No) {
myPort.Close();
NavigationService.Navigate(new Uri("testSettings.xaml", UriKind.RelativeOrAbsolute));
}
} else {
Debug.Print("Still going...");
goto Start;
}
}
}
对我来说最大的绊脚石是为什么这可以在串行监视器上工作,但不能在应用程序中工作。一旦我重置 Arduino,它也能正常工作。我也在 Arduino 中尝试过 resetFunc()
但这也没有帮助。
提前致谢。
事实证明,我的开关盒中仍然有一个 resetFunc(),它阻止串行监视器继续发送数据!
基本概述。由于 WPF 应用程序,我正在从 Arduino 发送串行数据。到目前为止,这一切都运行良好。今天我在 Arduino 代码中实现了一个循环,在串口中寻找 "Y" (ascii 89),如果收到它就会离开循环,然后 returns 回到我所说的离线模式并停止发送关于数据,通过在线 = false.
现在奇怪的是...
在这个循环之前它工作正常所以它一定是在它离开 'online loop'.
[=54= 后尝试重新发送新数据]它在 Arduino 串行监视器上完美运行,这表明这是一个 WPF 问题,尽管上传部分的代码没有更改。
这两个程序的代码都非常大,所以我会在提供所有必要信息的同时尽量保持简洁。
void loop() {
// Check to see if the testbench is in offline mode and run the respective code.
if (Online == false) {
OfflineMode();
}
// Check to see if the testbench is in online mode and run the respective code.
if (Online == true) {
OnlineMode();
}
}
void OfflineMode() {
while (Serial.available())
processlncomingByte(Serial.read());
}
然后我有开关盒来处理传入的设置 - 我知道这工作正常,因为它也会在 Arduino 重置后上传。
void processlncomingByte (const byte c) {
if (isdigit (c)) {
currentValue *= 10;
currentValue += c - '0';
} else {
// end of digit
// The end of the number signals a state change
handlePreviousState ();
// set the new state, if we recognize it
switch (c) {
case 'A':
state = GOT_A;
break;
etc...
在线模式
void OnlineMode() {
CheckForStop();
SendSerialData();
}
void CheckForStop() {
//Serial.println("...");
if (Serial.available() > 0) {
//Serial.println("getting something");
ch = (char)Serial.read();
inputString = ch;
if (ch == 89) {
//Serial.end();
Online = false;
//Serial.begin(9600);
exit;
//return;
}
} else
delay(5);
}
SendSerialData() 仅包含一系列 serial.print
,输出为一个大字符串供 WPF 处理。
Here is a screenshot of the serial monitor working
正如您从上面的 link 看到的那样,监视器吐出大量数据,当我发送 Y 时停止,最后我向 'question' 发送 Q 是否 Arduino 准备好接收设置,S 表示是。太棒了!
但是,正如您从下面的 link 中看到的那样,WPF 中并非如此。抱歉,我目前只能上传 2 张图片,所以不得不合并它们。
Combo of screenshots
这是它目前陷入的循环
private bool checkArduinoisReady() {
Stopwatch Uploadtimer = new Stopwatch();
if (!myPort.IsOpen)
return false;
// Debug.Print("port is ready to be opened");
string tempdata;
Uploadtimer.Start();
myPort.DiscardInBuffer();
Start:
myPort.WriteLine("Q" + Environment.NewLine);
Debug.Print("sent Q");
tempdata = myPort.ReadExisting();
Debug.Print("tempdata_" + tempdata.ToString());
if (Uploadtimer.ElapsedMilliseconds > 5000)
return false;
if (tempdata.Contains("S"))
return true;
else
goto Start;
}
在单独的页面上,这就是我停止传入数据的方式。
private void StopTest(object sender, RoutedEventArgs e) {
MessageBoxResult StopConfirm = MessageBox.Show("Are you sure you want to stop the test?", "Stop the test", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (StopConfirm == MessageBoxResult.Yes) {
Timer.Stop();
Debug.Print("Timer Stopped");
myPort.DiscardInBuffer();
Start:
for (int i = 0; i < 100; i++) {
myPort.WriteLine("Y");
}
string tempData = myPort.ReadExisting();
Debug.Print("Checking...");
Debug.Print("tempData_" + tempData);
if (string.IsNullOrWhiteSpace(tempData)) {
Debug.Print("Its null!!");
comments_textbox.Text = comments_textbox.Text + "Test Aborted";
MessageBoxResult SaveCurrentData = MessageBox.Show("Would you like to save the data collected up until this point?", "Save", MessageBoxButton.YesNo, MessageBoxImage.Question);
if (SaveCurrentData == MessageBoxResult.Yes) {
SaveFile();
}
if (SaveCurrentData == MessageBoxResult.No) {
myPort.Close();
NavigationService.Navigate(new Uri("testSettings.xaml", UriKind.RelativeOrAbsolute));
}
} else {
Debug.Print("Still going...");
goto Start;
}
}
}
对我来说最大的绊脚石是为什么这可以在串行监视器上工作,但不能在应用程序中工作。一旦我重置 Arduino,它也能正常工作。我也在 Arduino 中尝试过 resetFunc()
但这也没有帮助。
提前致谢。
事实证明,我的开关盒中仍然有一个 resetFunc(),它阻止串行监视器继续发送数据!