首页 > 解决方案 > 如何防止串行通信中的“数据延迟”(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);
}

标签: c#formsarduinoserial-port

解决方案


推荐阅读