.net compact 2.0 for Windows CE 6.0中的dataReceived事件仅适用于串行通信

时间:2010-09-09 02:30:33

标签: 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);
        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上键入了更多的密钥,这些密钥与Windows CE设备串行通信。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

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

包含Sleep(500),因为只要第一个字节写入缓冲区就会引发事件。通过一些试验/错误,并且知道我们阅读的信息从未超过特定的长度,我们知道它们将在事件的500ms内(实际上很久以前)完全写入。

有点击中/未命中,我非常乐意看到来自串行专家的'正确'解决方案!

代码:

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();
    }
}