C# / GTK#串行端口读取问题
本文关键字:读取 问题 串行端口 GTK# | 更新日期: 2023-09-27 18:35:59
所以我正在尝试从C#/Gtk#中的串行端口对象读取实时数据。 我有一个产品,它通过射频与计算机通信,每次它收到命令时,它都会发回一个 ACK。 如果我使用 AccessPort 并每 500 毫秒自动发送一个命令,我会得到我的 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);
}
});
}
我已将该方法分配给主函数中的线程:
writeThread = new Thread (writeSerial);
readThread = new Thread (readSerial);
当按下连接按钮以及 writeThread 时,我会启动它。 writeThread 工作正常,因为我可以看到产品每 X 毫秒执行一次正确的指令(目前我正在 500 毫秒处进行测试)。 ACK 应该每 X ms + 35 ms * 模块 ID 到达计算机,因此如果我的最终产品的模块 ID 为 2,则响应将延迟 70 毫秒,因此计算机应该在 570 毫秒或 X + 70 毫秒处看到它。
有没有更好的方法可以做到这一点? 我做错了什么?
我玩过的其他一些代码是从串行端口读取0x0E字节并将字节存储到缓冲区中,这也错过了很多我知道会回来的字节。
任何人都可以提供帮助吗? 我确实知道 readSerial 方法实际上正在启动,因为我确实在控制台上看到一个0x00弹出,这是正确的,因为0x00分散在我正在寻找的数据中。
想通了!
我不确定确切的问题是什么,但是当我删除委托并只是在该方法中使用了一段时间(真实)时,它工作正常。