C#/ GTK#串口读取问题

时间:2015-01-03 18:09:49

标签: c# gtk#

所以我试图从C#/ Gtk#中的串口对象读取实时数据。我有一个产品可以通过RF与计算机进行通信,每次获得命令时它都会发送回ACK。如果我使用AccessPort并每500ms自动发送一个命令,我得到我的ACK。我已经运行了几个小时的AccessPort,并且能够将每个命令与ACK匹配,所以我知道这在物理上是有效的。

我在C#/ Gtk#中编写了一个小程序,它以X ms的速度从串口发送数据,并有一个委托线程,它读取串口以查找返回的任何字节。我的问题是,无论我如何编写串行读取方法,它实际上都不会捕获我知道的所有字节。

到目前为止,这是我所拥有的“最轻”的代码:

    private void readSerial(){
    byte readByte = 0x00;

    Gtk.Application.Invoke (delegate {
        try {
            readByte = (byte)serialPort.ReadByte();
            Console.WriteLine(readByte.ToString("X2"));
        } catch (System.ArgumentException sae) {
            Console.WriteLine(sae.Message);
        }
    });
}

我已将该方法分配给main函数中的一个线程:

    writeThread = new Thread (writeSerial);
    readThread = new Thread (readSerial);

我按下连接按钮时会启动它,以及writeThread。 writeThread工作正常,因为我可以看到产品每X ms执行一次正确的指令(目前我在500ms测试)。 ACK应该每隔X ms + 35 ms *模块ID到达计算机,因此如果我的最终产品的模块ID为2,则响应将延迟70ms,因此计算机应该在570ms或X + 70ms处看到它。 / p>

有更好的方法吗?我是做错事吗?

我玩过的其他一些代码是从串口读取0x0E字节并将字节存储到缓冲区中,这也错过了我知道的很多字节。

有人可以提供一些帮助吗?我知道readSerial方法实际上正在启动,因为我确实在控制台上看到0x00弹出,这是正确的,因为0x00分散在我正在寻找的数据中。

1 个答案:

答案 0 :(得分:0)

想出来!

我不确定究竟是什么问题,但是当我删除了委托并且只是在该方法中使用了一段时间(真实)时,它运行良好。