Serial port 用于Windows CE 6.0的.net compact 2.0中的dataReceived事件对于串行通信仅起一次作用

Serial port 用于Windows CE 6.0的.net compact 2.0中的dataReceived事件对于串行通信仅起一次作用,serial-port,compact-framework,windows-ce,c#-2.0,Serial Port,Compact Framework,Windows Ce,C# 2.0,我有一个简单的串口程序,用来读取串口并回显键入的字符。我可以通过使用计时器轮询接收到的序列号来让它正常工作,但我想改用dataReceived事件。由于某种原因,该事件将发生一次,但不会再次发生 SerialPort bsp; public Form1() { InitializeComponent(); bsp = new SerialPort("COM2", 2400, Parity.None, 8, StopBits.One);

我有一个简单的串口程序,用来读取串口并回显键入的字符。我可以通过使用计时器轮询接收到的序列号来让它正常工作,但我想改用dataReceived事件。由于某种原因,该事件将发生一次,但不会再次发生

    SerialPort bsp;
    public Form1()
    {
        InitializeComponent();
        bsp = new SerialPort("COM2", 2400, Parity.None, 8, StopBits.One);
        bsp.DataReceived +=new SerialDataReceivedEventHandler(whasup);
        System.Threading.Thread.Sleep(1000);
        bsp.Open();
    }
    void whasup(object sender, SerialDataReceivedEventArgs e)
    {
        char[] text = new char[100];
        int temp = bsp.BytesToRead;
        string j = temp.ToString();
        bsp.Read(text, 0, temp);
        bsp.Write(text, 0, temp);
    }

我曾尝试将其移植到PC上,效果很好,但在这个Windows CE设备上,它真的不想合作。我知道串行对象仍然处于打开状态,因为我有一个计时器正在运行,即使在Win CE设备停止回显其接收数据后,也会从中吐出文本。我还有一个计时器输出bsp.BytesToRead,当我在我的PC上输入更多的键时,我可以看到这个值在上升,这台PC可以与Windows CE设备串行通信。我遗漏了什么吗?

我们在
Read()
中遇到了类似的问题,但我们使用
ReadExisting()
来管理它,以始终读取整个缓冲区。这可能是允许引发下一个事件的事实

之所以包括
Sleep(500)
,是因为在将第一个字节写入缓冲区时会引发事件。通过一些尝试/错误,我们知道我们正在阅读的消息从未超过特定的长度,我们知道它们将在事件发生500毫秒内(事实上是很久以前)被完全写入

有点碰运气,我会非常高兴看到一个“正确”的解决方案从一个串行专家

守则:

private SerialPort port;
private object readLock = new object();

private SerialManager()
{
    port = new SerialPort(SerialPort, BaudRate, Parity.None, 8, StopBits.One);
    port.Handshake = Handshake.None;
    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
    port.Open();
}

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Lock to subsequent DataReceived events
    lock (readLock)
    {
        Thread.Sleep(500);
        string data = port.ReadExisting();
    }
}