SerialPort没有收到任何数据

我正在开发需要与COM端口交互的程序。

通过从以下问答中了解到:.NET SerialPort

DataReceived事件未触发,我使代码像这样。

namespace ConsoleApplication1

{

class Program

{

static SerialPort ComPort;

public static void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs args)

{

string data = ComPort.ReadExisting();

Console.Write(data.Replace("\r", "\n"));

}

static void Main(string[] args)

{

string port = "COM4";

int baud = 9600;

if (args.Length >= 1)

{

port = args[0];

}

if (args.Length >= 2)

{

baud = int.Parse(args[1]);

}

InitializeComPort(port, baud);

string text;

do

{

String[] mystring = System.IO.Ports.SerialPort.GetPortNames();

text = Console.ReadLine();

int STX = 0x2;

int ETX = 0x3;

ComPort.Write(Char.ConvertFromUtf32(STX) + text + Char.ConvertFromUtf32(ETX));

} while (text.ToLower() != "q");

}

private static void InitializeComPort(string port, int baud)

{

ComPort = new SerialPort(port, baud);

ComPort.PortName = port;

ComPort.BaudRate = baud;

ComPort.Parity = Parity.None;

ComPort.StopBits = StopBits.One;

ComPort.DataBits = 8;

ComPort.ReceivedBytesThreshold = 9;

ComPort.RtsEnable = true;

ComPort.DtrEnable = true;

ComPort.Handshake = System.IO.Ports.Handshake.XOnXOff;

ComPort.DataReceived += OnSerialDataReceived;

OpenPort(ComPort);

}

public static void OpenPort(SerialPort ComPort)

{

try

{

if (!ComPort.IsOpen)

{

ComPort.Open();

}

}

catch (Exception e)

{

throw e;

}

}

}

}

我的问题是DataReceived事件永远不会触发。

我的程序规格为:

  1. 只需.net控制台编程
  2. 我从http://www.eterlogic.com使用VSPE
  3. 我的计算机已经有COM1和COM2端口。
  4. 我使用VSPE创建了COM2和COM4。
  5. 我从mystring数组(COM1,COM2,COM3,COM4)获取输出结果

但是我仍然不知道为什么DataReceived事件没有被触发。


更新

不幸的是,我仍然无法DataReceived以任何方式触发事件。

因此,我希望能够解决问题,从而创建了一个新项目。

在这个新项目[只是控制台应用程序],我创建了一个类…

public class MyTest

{

public SerialPort SPCOM4;

public MyTest()

{

SPCOM4 = new SerialPort();

if(this.SerialPortOpen(SPCOM4, "4"))

{

this.SendToPort(SPCOM4, "com test...");

}

}

private bool SerialPortOpen(System.IO.Ports.SerialPort objCom, string portName)

{

bool blnOpenStatus = false;

try

{

objCom.PortName = "COM" + portName;

objCom.BaudRate = 9600;

objCom.DataBits = 8;

int SerParity = 2;

int SerStop = 0;

switch (SerParity)

{

case 0:

objCom.Parity = System.IO.Ports.Parity.Even;

break;

case 1:

objCom.Parity = System.IO.Ports.Parity.Odd;

break;

case 2:

objCom.Parity = System.IO.Ports.Parity.None;

break;

case 3:

objCom.Parity = System.IO.Ports.Parity.Mark;

break;

}

switch (SerStop)

{

case 0:

objCom.StopBits = System.IO.Ports.StopBits.One;

break;

case 1:

objCom.StopBits = System.IO.Ports.StopBits.Two;

break;

}

objCom.RtsEnable = false;

objCom.DtrEnable = false;

objCom.Handshake = System.IO.Ports.Handshake.XOnXOff;

objCom.Open();

blnOpenStatus = true;

}

catch (Exception ex)

{

throw ex;

}

return blnOpenStatus;

}

private bool SendToPort(System.IO.Ports.SerialPort objCom, string strText)

{

try

{

int STX = 0x2;

int ETX = 0x3;

if (objCom.IsOpen && strText != "")

{

objCom.Write(Char.ConvertFromUtf32(STX) + strText + Char.ConvertFromUtf32(ETX));

}

}

catch (Exception ex)

{

throw ex;

}

return true;

}

}

我不确定我会遇到好运还是不幸,因为这个新类可能会引起火灾DataReceived事件,该事件来自仍在运行的旧版控制台应用程序。我不知道这是怎么回事,这对我来说是个奇迹。

让我告诉您更多细节,以便您可以提出更好的建议。

  1. 最后,我创建了2个控制台项目。
  2. 第一个项目是我昨天作为问题发布的课程。
  3. 第二个项目是名为MyTest的类DataReceived,当两个项目同时运行时,它可以从第一个项目引发火灾事件。

谁能给我建议,我如何将这两个项目合并为一个项目?

回答:

    ComPort.Handshake = Handshake.None;

问题不在于没有触发DataReceived事件,而是串口没有接收任何数据。很少有完全不使用握手的串行设备。如果将其设置为None,则驱动程序将不会打开DTR(数据终端就绪)和RTS(请求发送)信号。哪个串行端口设备解释为“计算机已关闭(DTR)”或“计算机尚未准备好接收数据(RTS)”。因此,它将不会发送任何内容,并且不会触发您的DataReceived事件。

如果您 真的

想要无,则将DTREnable和RTSEnable属性设置为true。但是您可能需要HandShake.RequestToSend,因为设备似乎正在注意握手信号。

如果仍然有问题,请使用其他串口程序(例如Putty或HyperTerminal)来确保连接和通信参数良好并且设备可以响应。SysInternals的PortMon实用程序提供了驱动程序交互的低级视图,因此您可以比较好坏。

以上是 SerialPort没有收到任何数据 的全部内容, 来源链接: utcz.com/qa/408712.html

回到顶部