C# 只需单击一下,即可在串行端口上多次读取和写入数据

C# 只需单击一下,即可在串行端口上多次读取和写入数据,c#,serial-port,C#,Serial Port,我需要读写数据到一个串行端口,只需点击一个按钮 我的电脑上连接了一个传感器板,上面有一个微控制器 我只需单击一下即可完成以下操作: 向微控制器发送一些数据,如传感器的寄存器地址 读取控制器发回的数据 发送另一个传感器的地址 读取数据 等 之后,我必须对接收到的数据进行一些计算 如何通过单击按钮多次发送和读取数据 using System; using System.Collections.Generic; using System.ComponentModel; using System.D

我需要读写数据到一个串行端口,只需点击一个按钮

我的电脑上连接了一个传感器板,上面有一个微控制器

我只需单击一下即可完成以下操作:

  • 向微控制器发送一些数据,如传感器的寄存器地址
  • 读取控制器发回的数据
  • 发送另一个传感器的地址
  • 读取数据
之后,我必须对接收到的数据进行一些计算

如何通过单击按钮多次发送和读取数据

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            comboBox1.Items.AddRange(SerialPort.GetPortNames());
        }

        private void button1_Click(object sender, EventArgs e)
        {
            serialPort1.PortName = comboBox1.Text;
    serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
            serialPort1.Open();
            serialPort1.Write("$g helloboard!"); // A message sending to micro controller. After that micro controller send back a message. 
        }

        string str;

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int bytes = serialPort1.BytesToRead;
            byte[] buffer = new byte[bytes];
            serialPort1.Read(buffer, 0, bytes);

            System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
            str = enc.GetString(buffer);
        }
    }
}
一个简单的(肮脏的)解决方案是有这样的东西

    private bool data_received = true;
    private void button1_Click(object sender, EventArgs e)
    {
        while (true)
        {
            if (data_received)
            {
                data_received = false;
                serialPort1.Write("$get register 42");
            }
            System.Threading.Thread.Sleep(1);
        }
    }
并在您的回调中添加:

data_received = true;

这只是出于测试目的。这远不是一个好的解决方案,下一个任务是在后台线程中工作,这样您的GUI就不会被阻塞,当然还要定义一个中断while循环的条件。

我想用in-button1\u-Click读取和写入端口。作为第一个注释,订阅serialPort1是不正确的。单击按钮时收到的数据,因为每次点击按钮都会有新的订阅,而且永远不会取消订阅。您可以在构造函数中订阅该事件。从上面的示例中,我看到您向控制器发送了一个命令,并接收其响应。或者,您可以使用类似“command1;command2;command3”的分隔符组合所有命令,并将其写入控制器。在使用分隔符拆分字符串后,控制器应该能够接收该命令并获取命令。它可以逐个执行命令并发回响应。您可以使用
计时器
重复相同的过程。其他选项是在
线程
/
任务
中运行长时间运行的作业(打开com端口、写入内容、读取内容等),或者使用
异步/等待
直接从按钮点击处理程序调用作业。建议:将设备通信放在单独的类中(
IDisposable
),不要通过将其放在表单中来破坏逻辑。@SureshKumarVeluswamy那么我该如何阅读。请您稍微解释一下。我是C#的新手,我还要澄清一件事。发送$g helloboard后!命令如何处理接收到的数据。我知道收到的数据将存储在名为str的字符串中的serialPort1_DataReceived event中。我如何在private void button1_Click(object sender,EventArgs e)中访问此字符串,以便对其执行一些计算。提前谢谢。