首页 > 解决方案 > C# SerialPort 连续读取命令响应

问题描述

我有一个必须连续读取位置的类我能够读取位置但只能读取一次,那么我将如何连续发送命令并读回它的响应

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SharpRotor.Lib
{
    public class SharpRotorL
    {
        string PortName;
        int BaudRate;
        public SharpRotorL(string PortName, int BaudRate)
        {
            this.PortName = PortName;
            this.BaudRate = BaudRate;
        }
        SerialPort sp = new SerialPort();
        public void test()
        {

            sp.NewLine = "\r\n";
            sp.PortName = this.PortName;
            sp.BaudRate = this.BaudRate;
            sp.Parity = Parity.None;
            sp.DataBits = 8;
            sp.StopBits = StopBits.One;
            sp.Handshake = Handshake.None;
            sp.DtrEnable = true;
            sp.WriteBufferSize = 1024;

            string t = "";
            int timeout = 10000; //t: response msg
            try
            {
                if (!sp.IsOpen)
                    sp.Open();
                Thread.Sleep(200);
                sp.BaseStream.Flush();
                sp.WriteLine("C"); //Ex: cmd=C to get Position (+0001)
                sp.BaseStream.Flush();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            sp.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        }




        private void DataReceivedHandler(
                            object sender,
                            SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            Console.WriteLine("Data Received:");
            Console.Write(indata);
        }
    }
}

除了异步读取,我还想在读取位置数据的同时发回一些命令

不确定这是否可能,如果可能的话,我很想知道一种方法。

标签: c#asynchronousserial-port

解决方案


使用类应该可以实现这一点Timer。你很接近。请注意,您应该DataReceived在打开端口之前创建您的事件。

SerialPort sp;
Timer tm;
private void init_ports()
{
    //Setup our Serial Port
    sp = new SerialPort();
    sp.NewLine = "\r\n";
    sp.PortName = this.PortName;
    sp.BaudRate = this.BaudRate;
    sp.Parity = Parity.None;
    sp.DataBits = 8;
    sp.StopBits = StopBits.One;
    sp.Handshake = Handshake.None;
    sp.DtrEnable = true;
    sp.WriteBufferSize = 1024;
    sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);

    //Setup our Timer
    tm = new Timer();
    tm.Tick += new EventHandler(tm_Tick);
    tm.Interval = 1000; //in ms
    tm.Enabled = true;  //Start our timer
}

void tm_Tick(object sender, EventArgs e)
{
    if (!sp.IsOpen)
        sp.Open();

    sp.Write("C");
}

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string indata = sp.ReadExisting();
    Console.WriteLine("Data Received:");
    Console.Write(indata);
}

您应该能够调用init_ports,并且它应该每秒发送一次C命令。


推荐阅读