c# - 如何防止串行通信中的“数据延迟”(C# 形式 <-> Arduino)
问题描述
我拥有的代码可以工作,但我想确保它是健壮的,因为我记得过去(使用 python)编写过类似的代码,并注意到我收到的数据可能会有 3 或 4 分钟的历史,并且随着时间的推移会变得更老. 我想这与串行缓冲区有关,我应该不时“清除它”,最好的做法是什么?
C#表单代码:
using System;
using System.Windows.Forms;
using System.IO.Ports;
namespace SerialTest1
{
public partial class Form1 : Form
{
public SerialPort ArduinoSerial;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Timer MyTimer = new Timer();
MyTimer.Interval = (1000); // 1 sec
MyTimer.Tick += new EventHandler(SerialTimer_Tick);
MyTimer.Start();
Console.WriteLine("Form1_Loading....");
OpenSerialPort();
}
private void OpenSerialPort() // creating serial communication object
{
try
{
Console.WriteLine("OpenSerialPort: opening port.....");
ArduinoSerial = new SerialPort("COM7", 115200);//Set board COM
ArduinoSerial.Open();
ArduinoSerial.DataReceived += new SerialDataReceivedEventHandler(dataReceived);
}
catch (Exception ex)
{
Console.WriteLine("OpenSerialPort: Can not find port");
}
}
// write to arduino and restart Serial com if error like cable disconnected and reconnected
private void writeToArduino()
{
try
{
Console.WriteLine($"writeToArduino: writing msg to arduino");
ArduinoSerial.WriteLine("hello from pc");
}
catch (Exception ex)
{
Console.WriteLine("writeToArduino: Serial Error");
//MessageBox.Show("Serial Error: " + ex.ToString(), "ERROR");
if (!ArduinoSerial.IsOpen)
{
Console.WriteLine("writeToArduino: ArduinoSerial is close, opening it...");
OpenSerialPort();
}
}
}
private void SerialTimer_Tick(object sender, EventArgs e) // will write to arduino at each timer tick
{
writeToArduino();
}
private void dataReceived(object sender, SerialDataReceivedEventArgs e) // receiving datas from arduino
{
string SerialLine = ArduinoSerial.ReadLine();
Console.WriteLine($"dataReceived: Got serial line for arduino: {SerialLine}");
}
}
}
Arduino代码:
#include <TimeLib.h>
#include <Time.h>
//WINDOWS COMMUNICATION
String receivedString;
void setup(void) {
Serial.begin(115200);
}
void loop(void) {
static time_t lastMsg = 0;
static int counter = 1;
if (now() - lastMsg > 1) {
lastMsg = now();
Serial.print("msg ");
Serial.print(counter);
Serial.println("Hello from arduino");
counter++;
}
while (Serial.available() > 0) {
receivedString = Serial.readString();
Serial.println(receivedString);
}
delay(5);
}
解决方案
推荐阅读
- google-cloud-platform - 部署无服务器 GCP 时如何解决错误:“部署失败:RESOURCE_ERROR”(不推荐使用 GCF v1beta2 API)?
- python - 添加 tkinter 后在树视图中对项目进行排序
- python - 在python中,如果缺少参数的参数,该函数将起作用
- javascript - jQuery 防止在另一个页面上显示弹出窗口的可能性
- javascript - 如何在 React 和 Redux 中显示详细/特定页面?
- php - laravel 7. Url id 加密:payload 无效
- python - 在 R 脚本中导入 Python 引用的脚本
- maven - Talend:在例程中使用 Maven 依赖项
- css - 如何将两个表单元素并排显示?
- python - 从另一个数组中获取匹配的索引