美好的一天,
我已尝试从csharp上的xbee模块中读取一些字符串。
但我的代码一直告诉我串口到达事件处理程序时没有打开。任何帮助将非常感激。谢谢string display = myserial.ReadLine();
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();
}
}
}
答案 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();