串行,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条件。 思考?硬件或软件相关,我正在检查我能想到的一切。     
已邀请:
一切听起来都是正确的,但你的观察表明他们不是。 既然你已经声明要从多个线程发送,我要做的第一件事就是在调用串行对象实例之前,将所有发送请求发送到一个位置的某种机制。当然,你说你已经确保你有线程安全,但是通过一个位置序列化这些调用将有助于加强(并使代码更易于维护/扩展)。 接下来,我可能会在串行lib中添加一些临时处理,以便在您完成Tx时在调试器中专门设置事件或中断,但TxDone事件在某个边界时间内不会触发。串口lib总是有可能存在一个错误(相信我,该代码的作者远非绝对可靠),其中一些竞争条件正在逐渐消失。     
谢谢大家的回复。我们发现这实际上似乎与硬件有关。我担心我不能提供比这更多的信息,但我感谢所有提供可能的解决方案或故障排除步骤的人。     

要回复问题请先登录注册