代码不能从串口读取

时间:2017-02-07 13:31:45

标签: c# serial-port xbee

美好的一天,

我已尝试从csharp上的xbee模块中读取一些字符串。 但我的代码一直告诉我串口到达事件处理程序时没有打开。任何帮助将非常感激。谢谢string display = myserial.ReadLine();

Operation Exception

using System;
using System.Management;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;
namespace ConsoleApplication2
{
    class Program
    {
        public static  SerialPort myserial = new SerialPort();
        public string display;
        static void Main(string[] args)
        {
            string[] ports = SerialPort.GetPortNames();
            foreach (string p in ports)
            {
                Console.WriteLine(p);
            }
            SerialPort myserial = new SerialPort();

            myserial.BaudRate = 9600;
            myserial.Parity = Parity.None;
            myserial.StopBits = StopBits.One;
            myserial.DataBits = 8;
            myserial.Handshake = Handshake.None;
            myserial.RtsEnable = true;
            myserial.DtrEnable = true;
            myserial.ReadTimeout = 100000;
            myserial.PortName = "COM3";
            myserial.ReadTimeout = 10000;
            myserial.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler);
            myserial.Open();
            if (myserial != null)
            {
                if (myserial.IsOpen)
                {
                    Console.WriteLine("connected");
                }
            }
            Console.ReadLine();
        }
   static void DataRecievedHandler(object sender, SerialDataReceivedEventArgs e)
        {
           string display = myserial.ReadLine();
        }

    }
} 

1 个答案:

答案 0 :(得分:0)

您的问题是您的代码含糊不清。 2具有相同名称的变量。

您在main之外声明的类变量:

class Program
{
    public static  SerialPort myserial = new SerialPort();

和main方法中的变量:

static void Main(string[] args)           
{
    SerialPort myserial = new SerialPort();

在方法内部,编译器将采用本地变量myserial。你打开它并注册活动:

myserial.DataReceived += new SerialDataReceivedEventHandler(DataRecievedHandler);

到目前为止一切都很好。但在Main方法之外,此SerialPort myserial确实存在。这意味着当您尝试在myserial方法中访问DataRecievedHandler时,编译器会“认为”您的意思是类级别的第一个变量!但是这个SerialPort从未被打开过!因此它会给你错误。

您可以使用事件中的sender对象来解决它。由于打开SerialPort会触发此事件:

static void DataRecievedHandler(object sender, SerialDataReceivedEventArgs e)
{  
    SerialPort port = sender as SerialPort;

    if(port != null)
    {    
        string display = port.ReadLine();
    }
}

注意:此变量display仅存在于DataRecievedHandler方法中。你不能在主要使用它。因为你再次声明它。这是一个局部变量,与您在类级别声明的变量不同!删除string,将使用类级别变量:

制作:

display = port.ReadLine();

<强> 2

您也可以通过简单地删除SerialPort myserial方法中Main变量的声明来解决它。可能会更简单;) 只需在Main方法中删除此行:

SerialPort myserial = new SerialPort();