【问题标题】:how to read and send data via serial port in the same program in asp C#如何在asp C#中的同一程序中通过串口读取和发送数据
【发布时间】:2013-04-23 10:21:58
【问题描述】:

我已经将数据从 C# 发送到 Arduino,它的工作完美;但是当我尝试通过event handler 从传感器接收 C# 数据时,它必须保持端口打开以读取任何接收到的数据;所以我不能再通过串口发送数据了。

如何在 C# 和 Arduino 之间同时发送和接收数据

这是我接收数据的代码:

public static SerialPort port=
    new SerialPort("COM5", 9600, Parity.None, 8, StopBits.One);

protected void DataReceived(object sender, SerialDataReceivedEventArgs e) {
    SerialPort sp=(SerialPort)sender;
    indata=sp.ReadExisting();
    Functions f=new Functions();

    if(indata!="") {
        if(indata.Equals("bed_light_on\r\n")) {
            f.update_flag("bed_light", 1);
        }
    }
}

protected void Page_Load(object sender, EventArgs e) {
    indata="";
    port.Close();
    port.DataReceived+=new SerialDataReceivedEventHandler(DataReceived);

    if(!port.IsOpen)
        port.Open();
}

【问题讨论】:

  • 您是否尝试从 ASP.NET 应用程序执行此操作?
  • 要么需要使用单独的线程进行读写,要么使用异步操作。如果这确实是 ASP,那么您还有一个附加问题,即应用程序可能会意外启动和停止。
  • 此处显示了完整性检查。 ASP 代码在网络服务器上运行。通常在数据中心或服务器机房中。在一扇上锁的门后面,不允许任何 Arduinos 进入。

标签: c# serial-port arduino


【解决方案1】:

这是我写了 6 年的帮助类,可能会有所帮助。顺便说一句 - 你不能从 ASP 读取 COM 端口 :)

using System;
using System.Text;
using System.IO.Ports;

namespace MyNamespace
{
    public class COMSerialPort : IDisposable
    {
        private SerialPort FSerialPort;
        public Boolean Disposed { get; private set; }

        //---------------------------------------------------------------------
        public COMSerialPort(String portName, Int32 baudRate, Encoding encode)
        {
            FSerialPort = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);

            FSerialPort.NewLine = "\r";
            FSerialPort.Encoding = encode;
            Disposed = false;
        }
        //---------------------------------------------------------------------
        public COMSerialPort(String portName, Int32 baudRate) : this( portName, baudRate, Encoding.ASCII )
        {
        }
        //---------------------------------------------------------------------
        ~COMSerialPort()
        {
            Dispose(false);
        }
        //---------------------------------------------------------------------
        protected void Dispose(Boolean bDisposing)
        {
            lock (this)
            {
                if (!Disposed)
                {
                    Disposed = true;
                    GC.SuppressFinalize(this);

                    if (bDisposing)
                    {
                        if (FSerialPort != null)
                        {
                            Close();

                            FSerialPort.Dispose();
                            FSerialPort = null;
                        }
                    }
                }
            }
        }
        //---------------------------------------------------------------------
        public void Dispose()
        {
            Dispose(true);
        }
        //---------------------------------------------------------------------
        public void Open()
        {
            if (!FSerialPort.IsOpen) FSerialPort.Open();
        }
        //---------------------------------------------------------------------
        public void Close()
        {
            if (FSerialPort.IsOpen) FSerialPort.Close();
        }
        //---------------------------------------------------------------------
        public void WriteLine(String data)
        {
            if (FSerialPort.IsOpen) FSerialPort.WriteLine(data);
        }
        //---------------------------------------------------------------------
        public void Write(String data)
        {
            if (FSerialPort.IsOpen) FSerialPort.Write(data);
        }
        //---------------------------------------------------------------------
        public void Write(Byte[] data)
        {
            if (FSerialPort.IsOpen) FSerialPort.Write(data, 0, data.Length);
        }
        //---------------------------------------------------------------------
        public String ReadLine()
        {
            String rValue;
            if (FSerialPort.IsOpen)
                rValue = FSerialPort.ReadLine();
            else
                rValue = null;

            return rValue;
        }
        //---------------------------------------------------------------------
        public String Read(Int32 count)
        {
            String rValue = null;
            if (FSerialPort.IsOpen)
            {
                Char[] buffer = new Char[count];
                FSerialPort.Read(buffer, 0, count);

                StringBuilder sb = new StringBuilder();
                sb.Append(buffer);

                rValue = sb.ToString();
            }

            return rValue;
        }
        //---------------------------------------------------------------------
        public Byte[] ReadBytes(Int32 count)
        {
            Byte[] rValue = null;
            if (FSerialPort.IsOpen)
            {
                rValue = new Byte[count];
                FSerialPort.Read(rValue, 0, count);
            }

            return rValue;
        }
        //---------------------------------------------------------------------
        public Char ReadChar()
        {
            return (Char)FSerialPort.ReadChar();
        }
        //---------------------------------------------------------------------
        public Int32 ReadByte()
        {
            return FSerialPort.ReadByte();
        }
        //---------------------------------------------------------------------
        public SerialPort NativeObject
        {
            get { return FSerialPort; }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    • 2017-01-31
    相关资源
    最近更新 更多