c# - SerialPort BaseStream BeginRead 从不调用回调
问题描述
我有一个我知道配置正确的 SerialPort 对象,因为我可以将数据发送到端口并且 DataReceived 事件已正确引发。但是,当我尝试如何更可靠地使用 SerialPort 类中提出的解决方案时,该解决方案建议使用对 BeginRead 的调用而不是 DataReceived 事件,我的异步回调从未被调用,并且对 BeginRead 的调用似乎“挂起”。
byte[] buffer = new byte[4096];
void KickoffRead()
{
_serialPort.BaseStream.BeginRead(buffer, 0, buffer.Length, delegate (IAsyncResult ar)
{
try
{
var actualLength = _serialPort.BaseStream.EndRead(ar);
var received = new byte[actualLength];
Buffer.BlockCopy(buffer, 0, received, 0, actualLength);
DataReceived?.Invoke(received);
}
catch (IOException)
{
// nothing yet
}
KickoffRead();
}, null);
}
KickoffRead();
我尝试在打开端口后立即调用 KickoffRead,从 DataReceived 事件和一个单独的线程调用 - 这些都没有任何区别。我还尝试将缓冲区大小更改为 1,认为它正在等待完整的缓冲区 - 不走运。此外,当我尝试停止调试器时,它会挂起并且必须强制终止。
我正在使用虚拟串行端口(免费虚拟串行端口软件)进行测试,但是当我使用 DataReceived 而不是 BeginRead 时效果很好,所以我认为这是问题的根源。
解决方案
推荐阅读
- javascript - 如何使用 sendkeys 生成增量版本号
- tensorflow - 使用 TensorFlow 或 PyTorch 的图像相似度
- html - 如何使用 puppetetteer 将抓取的数据添加到 html 中
- kubernetes - Kubernetes 可以在 Pod 之间共享单个 GPU 吗?
- css - 当 textarea 有值时更改标签颜色
- php - 使用时间计算变量
- sql - 如何将 NTILE 函数应用于 SQL 列
- ssl - Logstash 不接受自签名证书并引发 sslv3 警报握手失败
- java - 如何在java中的spring数据聚合中实现$size
- php - WordPress:将查询字符串附加到所有 URL