C# SerialPort未接收任何数据
我正在开发需要与COM端口交互的程序 通过从这个问答中学习,我的代码就是这样C# SerialPort未接收任何数据,c#,serial-port,C#,Serial Port,我正在开发需要与COM端口交互的程序 通过从这个问答中学习,我的代码就是这样 namespace ConsoleApplication1 { class Program { static SerialPort ComPort; public static void OnSerialDataReceived(object sender, SerialDataReceivedEventArgs args) { string data =
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事件从未被触发
我的程序规范是:
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;
}
}
我不确定我是否会遇到好运或厄运,因为这个新类可能会引发fireDataReceived
事件,该事件来自仍在运行的旧控制台应用程序。这对我来说是个奇迹,我不知道这是怎么发生的
让我告诉你们更多的细节,以便你们能给我更好的方法的建议
DataReceived
事件从第一个项目接收,同时运行两个项目有谁能给我一些建议,告诉我如何将这两个项目合并为一个项目吗?我从未与VSPE合作过,所以我不确定这是否会导致问题。我以前使用过COM端口,我查找过我的代码。唯一的主要区别是声明事件的方式。你有:
ComPort.DataReceived += OnSerialDataReceived;
我是这样的:
ComPort.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived);
OnSerialDataReceived是您的事件处理程序。我不确定这是否会有什么不同,但你可以试试。我希望这有帮助 我从未使用过VSPE,因此我不确定这是否会导致问题。我以前使用过COM端口,我查找过我的代码。唯一的主要区别是声明事件的方式。你有:
ComPort.DataReceived += OnSerialDataReceived;
ComPort.Handshake = Handshake.None;
我是这样的:
ComPort.DataReceived += new SerialDataReceivedEventHandler(OnSerialDataReceived);
OnSerialDataReceived是您的事件处理程序。我不确定这是否会有什么不同,但你可以试试。我希望这有帮助
ComPort.Handshake = Handshake.None;
问题不是DataReceived事件没有触发,而是串行端口没有接收任何数据。很少有串行设备完全不用握手。如果将其设置为“无”,则驱动程序将不会打开DTR(数据终端就绪)和RTS(发送请求)信号。串行端口设备将其解释为“机器已关闭(DTR)”或“机器未准备好接收数据(RTS)”。所以它不会发送任何信息,也不会触发DataReceived事件
如果确实不需要,则将DTREnable和RTSEnable属性设置为true。但您可能希望HandShake.RequestToSend,因为设备似乎在关注握手信号
如果仍然有问题,请使用其他串行端口程序,如Putty或HyperTerminal,以确保连接和通信参数良好,设备响应良好。SysInternals的PortMon实用程序提供了驱动程序交互的低级视图,因此您可以比较好与坏
问题不是DataReceived事件没有触发,而是串行端口没有接收任何数据。很少有串行设备完全不用握手。如果将其设置为“无”,则驱动程序将不会打开DTR(数据终端就绪)和RTS(发送请求)信号。串行端口设备将其解释为“机器已关闭(DTR)”或“机器未准备好接收数据(RTS)”。所以它不会发送任何信息,也不会触发DataReceived事件
如果确实不需要,则将DTREnable和RTSEnable属性设置为true。但您可能希望HandShake.RequestToSend,因为设备似乎在关注握手信号
如果仍然有问题,请使用其他串行端口程序,如Putty或HyperTerminal,以确保连接和通信参数良好,设备响应良好。SysInternals的PortMon实用程序提供了驱动程序交互的低级视图,因此您可以比较好与坏。我也遇到了类似的问题。在一个图形应用程序(C#win表单)中,我有一个类,它封装了一个
SerialPort
组件。DataReceived
事件只触发了一次,但随后收到的任何数据都没有触发任何事件。我通过调用主体形式Closed
事件函数中的Close
方法解决了这个问题。
不知道为什么这会改变什么,但现在它起作用了。我也遇到了类似的问题。在一个图形应用程序(C#win表单)中,我有一个类,它封装了一个
SerialPort
组件。DataReceived
事件只触发了一次,但随后收到的任何数据都没有触发任何事件。我通过调用主体形式Closed
事件函数中的Close
方法解决了这个问题。
不知道为什么这会改变什么,但现在它工作了。IIRC
DataReceived
在接收到行分隔符后被激发。你能确认设备确实发送了多行吗?@leppie:IIRC,它在收到超过(或至少)个ReceivedBytesThreshold
字节后触发。所以问题是:1。您正在接收多少字节?2.您是否使用其他终端应用程序成功读取了此数据?@Groo:谢谢,这似乎更直观:)ComPort.DataReceived+=new SerialDataReceivedEventHandler(OnSerialDataReceived)@赛巴尔:你的评论有什么意义?IIRCDataReceived
在收到行分隔符后被触发。你能确认设备确实在发送多条线路吗?@leppie:IIRC,它会触发一个