串行,RS422,In C#,TxDone事件未触发,未接收数据
我正在编写一个使用OpenNETCF.IO.Serial(开源,请参阅此处的串行代码)的应用程序,用于在Windows CE 6.0设备上进行串行通信。此应用程序在Compact Framework 2.0中以C#编码。我不相信我将要描述的问题与这些细节具体相关,但在这方面我可能被证明是错误的。
我遇到的问题是,看似随机(读作:间歇性问题我无法可靠复制),数据将无法传输或被接收,直到设备本身重新启动。 Windows CE设备与运行完全不同的应用程序的系统进行通信。重新启动此其他系统并断开/重新连接通信电缆似乎无法解决此问题,只能重新启动Windows CE设备。
发生此问题的唯一迹象是缺少来自OpenNETCF触发的TxDone事件(在OpenNETCF.IO.Serial类中查找“TxDone();”,并且当我知道连接的事实时没有接收到数据系统正在发送数据。
在我们的串行通信中,可以发送和接收1 - 255(0x01 - 0xFF)中的任何字符值。空值被丢弃。
我的串行设置是38400波特,8个数据位,无奇偶校验,1个停止位(38400,8n1)。我已将输入和输出缓冲区大小设置为256个字节。每当我们收到1个或多个字符时就会发生DataReceived事件,并且当输出缓冲区中有1个或更多字节时发生传输,因为消息长度可变。
没有使用握手。由于这是RS422,因此仅使用4个信号:RX +,RX-,TX +,TX-。
我收到一个“DataReceived”事件,我从输入缓冲区中读取所有数据,并在我的代码中创建自己的缓冲区,以便在DataReceived事件之外的闲暇时解析它。当我收到命令消息时,我发回快速确认消息。当另一个系统从Windows CE设备收到命令消息时,它将发回快速确认消息。确认消息没有得到进一步的回复,因为它们的目的是简单的“是的,得到它”。
在我的代码中,我通过多个线程接收/传输,因此我使用lock关键字,因此我不会在多个线程上同时传输多个消息。通过代码进行双重检查表明我没有挂上任何锁。
在这一点上,我想知道我是否一直在忽略一些关于串行通信如何工作的明显问题,例如我是否需要设置一些变量或属性,而不是在非空时读取输入缓冲区并写入发送缓冲区。
我们欢迎任何见解,检查选项,建议,想法等。这是我几个月来一直在努力的事情,我希望我在这里得到的答案或评论有助于弄清楚这个问题。先感谢您。
编辑,2011年2月24日:
(1)我似乎只能在Windows CE设备正在与之通信的系统启动时重新创建错误,而不是每次启动。我也查看了信号,共模电压波动,但系统启动时发生的噪声幅度似乎与问题发生时无关,我看到25V峰峰值导致没有问题,当5V峰值时 - 重新出现问题的高峰期)。
问题听起来越来越多的硬件相关,但我正在试图找出可能导致我看到的症状的原因,因为没有硬件实际上看起来失败或关闭,至少在我能够达到的地方测量信号。我很抱歉,但我无法提供任何类型的硬件部件,所以请不要问使用的组件。
(2)根据@ ctacke的建议,我确保所有传输都在同一位置进行维护,我放入的线程安全基本如下:
lock(transmitLockObj)
{
try
{
comPort.Output = data;
}
[various catches and error handling for each]
}
(3)在大约300毫秒时间间隔(38400波特)发送和接收< 10字节的测试中获得UART OVERRUN错误。一旦出现错误,它将进入下一个循环迭代,并且不运行ReadFile,并且不运行TxDone事件(或任何其他行检查过程)。此外,关闭和重新打开端口不仅无法解决此问题,在设备仍在运行时重新启动软件也不会执行任何操作。只有硬件重启。
我的DataReceived事件如下:
try
{
byte[] input = comPort.Input; //set so Input gets FULL RX buffer
lock(bufferLockObj)
{
for (int i = 0; i < input.Length; i++)
{
_rxRawBuffer.Enqueue(input[i]);
//timer regularly checks this buffer and parses data elsewhere
//there, it is "lock(bufferLockObj){dataByte = _rxRawBuffer.Dequeue();}"
//so wait is kept short in DataReceived, while remaining safe
}
}
}
catch (Exception exc)
{
//[exception logging and handling]
//hasn't gotten here, so no point in showing
}
但是,当WriteFile调用确实在测试中第一次超时时,我开始得到UART OVERRUN错误。老实说,我看不到我的代码导致UART OVERRUN条件。
思考?硬件或软件相关,我正在检查我能想到的一切。
没有找到相关结果
已邀请:
2 个回复
铰齐插
届甸衬丝蚕