.NET SerialPort DataReceived 活动不起作用

我有一个测试应用程序 WPF 评估活动通信 serial port /与调查相比 serial port/. 问题是事件 DataReceived, 似乎这根本不起作用。

我有一个非常简单的形式 WPF 从 TextBox 要输入用户, TextBlock 用于输出和按钮写入输入 serial port.

这是代码:


public partial class Window1 : Window
{
SerialPort port;

public Window1//
{
InitializeComponent//;

port = new SerialPort/"COM2", 9600, Parity.None, 8, StopBits.One/;
port.DataReceived +=
new SerialDataReceivedEventHandler/port_DataReceived/;
port.Open//;
}

void port_DataReceived/object sender, SerialDataReceivedEventArgs e/
{
Debug.Print/"receiving!"/;
string data = port.ReadExisting//;
Debug.Print/data/;
outputText.Text = data;
}

private void Button_Click/object sender, RoutedEventArgs e/
{
Debug.Print/"sending: " + inputText.Text/;
port.WriteLine/inputText.Text/;
}
}


所以,这里是复杂的因素:

我工作的笔记本电脑没有串行端口,所以我使用一部分调用的软件 Virtual Serial Port Emulator 用于设置 COM2. VSPE 过去完全工作,并不清楚为什么它只与课程一起工作 SerialPort .NET, 但我提到它以防万一。

当我在表单上按一个按钮发送数据时,我的超声窗口 /连接到 COM2/ 表示数据转。 是的,我关掉程序 hyperterminal, 当我想检查我的表单的能力来读取端口。

在连接事件之前,我试图打开端口。 没有变化。

我在这里阅读了另一个帖子,其他人有类似的问题。 这些信息都没有帮助我。

EDIT

:

这是控制台版本 /改变了。
http://mark.michaelis.net/Blog ... .aspx
/:


class Program
{
static SerialPort port;

static void Main/string[] args/
{
port = new SerialPort/"COM2", 9600, Parity.None, 8, StopBits.One/;
port.DataReceived +=
new SerialDataReceivedEventHandler/port_DataReceived/;
port.Open//;

string text;
do
{
text = Console.ReadLine//;
port.Write/text + "\r\n"/;
}
while /text.ToLower// != "q"/;
}

public static void port_DataReceived/object sender,
SerialDataReceivedEventArgs args/
{
string text = port.ReadExisting//;
Console.WriteLine/"received: " + text/;
}
}


它应该消除任何问题,这是一个问题流 /我认为/. 这也不起作用。 再次, Hyperterminal 报告通过端口发送的数据,但控制台应用程序似乎无法启动事件 DataReceived.

EDIT #2:

我意识到我有两个应同时发送和接收的两个单独的应用程序 serial port, 因此,我决定尝试同时运行它们......

如果我键入控制台应用程序,则会触发事件 WPF app DataReceived 预期的流误差错误 /我知道如何应对/.

如果我在应用程序中键入 WPF, 它由Dataredived Console应用程序事件触发,它重复数据。

我假设问题在于我使用软件的某个地方 VSPE, 配置为处理一个 serial port 入口和退出。 而且因为课堂上的一些奇怪 SerialPort 一份副本 a serial port 不能同时发件人和收件人。 无论如何,我认为它是决定的。
已邀请:

小姐请别说爱

赞同来自:

port.DtrEnable = true;


它为我解决了问题,旗帜 DataTransmitReady 它没有打开,所以没有获得数据。

三叔

赞同来自:

我肯定不能说,但雕刻可能有问题。 WPF 以不同方式处理流,以及对虚拟端口的调查,我认为是异步的。 你试过用吗? Windows Forms 或者控制台应用程序,以证明它可以全部工作?

快网

赞同来自:

我使用完全相同的安装,它现在工作得很好,但我必须解决很多问题到达那里。

这就是为什么我的初始声明看起来像这样:


comControl = new SerialPort//;

//This is important - determine your min nb of bytes at which you will fire your event, mine is 9
comControl.ReceivedBytesThreshold = 9;

//register the event handlers
comControl.DataReceived += new SerialDataReceivedEventHandler/OnReceive/;
comControl.PinChanged += new SerialPinChangedEventHandler/OnPinChanged/;


我分开了方法 open port 和 close port, 经常检查端口是否已关闭 com.


public bool OpenPort//
{
try
{
//must keep it open to maintain connection /CTS/
if /!comControl.IsOpen/
{
comControl.Open//;
comControl.RtsEnable = true;
}
}
catch /Exception e/
{
//error handling here
}
}


最后,确保您的虚拟端口驱动程序 Com 正确安装并使用正确的端口,即插即用,为我的适配器播放是不够的。 如果要创建一种控件,这将允许您在执行期间选择可用的端口,则以下命令将为您提供可用的端口:


System.IO.Ports.SerialPort.GetPortNames//

帅驴

赞同来自:

我只能假设问题真的是与程序有关 Virtual Serial Port Emulator. 这是 NOT, 要说这个软件有问题: VSPE 到目前为止,对我来说非常好。 但我的代码之间存在一些冲突以及我如何设置连接器 VSPE.

窦买办

赞同来自:

当从表格开始这样的司机时,我也有类似的问题,虽然不是 VSPE, 只是普通人 SP.
我想这是模型的问题 STA, 由于转型到其在控制台应用中的夹杂物中足够固定。

快网

赞同来自:

我最近面对相同的奇怪问题,但只有一些机器。 如所知)

slowback,它可能是流媒体的问题,特别是如果您正在运行 .NET 4.0 或更晚。

在 .NET 4.0 事件处理程序在流中开始 ThreadPool, 在某些情况下,在发生这种情况之前可能会发生重大延迟。 /在我的代码中,完全努力 .NET 2.0, 在我们更新到的情况下,注意到问题 .NET 4.5. 事件处理程序经常在预期之后工作得多,有时完全没有工作!/

称呼
http://msdn.microsoft.com/en-u ... .aspx
对于完成线程的重大值,它强迫问题如此快速消失。 在我们申请的背景下
ThreadPool.SetMinThreads/2, 4/

这就足够了。 在观察到问题的机器上,默认值 /在呼叫中获得
http://msdn.microsoft.com/en-u ... .aspx
/ 是平等的 2.

龙天

赞同来自:

我也使用 VSPE! 它真的很棒..我有同样的问题,我通过制作两个港口来纠正她 com PAIR 在 VSPE 而不是简单地创建两个虚拟端口 com

帅驴

赞同来自:

两天前,我有同样的问题,这是一个很大的头痛,因为我今天需要提供这个应用程序。 所以......太过分了 googleashion 我建议这个问题在另一个,而不是我的代码中。

我的决定是

删除

防病毒 McAfee 和所有与之相关的。 当我看到杂志 McAfee, 他们有关于停止流的记录,我建议
SerialDataReceivedEventHandler//

在溪流中工作。

我希望这个决定将为您工作。 真挚地。

知食

赞同来自:

我使用虚拟驱动程序 Serial Port. 这个问题需要我的一整天。 最后,通过创建一对端口来纠正它。 一个端口发送消息,另一个端口收到消息而不是使用相同的端口发送和接收消息。 我认为这就是调制解调器仿真器的工作原理 Null.


Dim mySerialPort As SerialPort = New SerialPort/"COM1"/
Dim mySerialPort2 As SerialPort = New SerialPort/"COM2"/

Sub Main//
SerialPortCommunicate//
End Sub

Public Sub SerialPortCommunicate//
mySerialPort.BaudRate = 9600
mySerialPort.Parity = Parity.None
mySerialPort.StopBits = StopBits.One
mySerialPort.DataBits = 8
mySerialPort.Handshake = Handshake.None
mySerialPort.DtrEnable = True
mySerialPort.RtsEnable = True

mySerialPort2.BaudRate = 9600
mySerialPort2.Parity = Parity.None
mySerialPort2.StopBits = StopBits.One
mySerialPort2.DataBits = 8
mySerialPort2.Handshake = Handshake.None
mySerialPort2.DtrEnable = True
mySerialPort2.RtsEnable = True

AddHandler mySerialPort2.DataReceived, AddressOf DataReceivedHandler

mySerialPort.Open//
mySerialPort2.Open//

mySerialPort.Write/"Hello World"/

Console.WriteLine/"Press any key to continue..."/
Console.WriteLine//
Console.ReadKey//
mySerialPort.Close//
mySerialPort2.Close//
End Sub

Private Sub DataReceivedHandler/sender As Object, e As SerialDataReceivedEventArgs/
Dim sp As SerialPort = CType/sender, SerialPort/
Dim indata As String = sp.ReadExisting//
Console.WriteLine/"Data Received:"/
Console.Write/indata/
End Sub


结果:
获得的数据:
大家好
按任意键继续 ...

要回复问题请先登录注册