gpt4 book ai didi

c# - 是什么导致 Mono 下的 SerialPort.Write 出现偶发错误?

转载 作者:太空宇宙 更新时间:2023-11-04 13:03:22 24 4
gpt4 key购买 nike

我在 Mono 下使用从 Linux 到 Arduino Nano 的 USB 连接 (FTDI)。这主要是有效的,但过了一会儿,我在一个看似随机的时间得到了一个试图写入 SerialPort 的 TimeoutException。显然(参见 the FIXME 和相关的 bug report ),Write 中的任何错误都会导致 TimeoutException,并且没有时间延迟,所以我认为可以公平地假设它实际上不是超时,而只是一个错误。

单声道代码:

// FIXME: this reports every write error as timeout
if (write_serial (fd, buffer, offset, count, write_timeout) < 0)
throw new TimeoutException("The operation has timed-out");

Here (请参阅 write_serial)是正在调用的 Mono 包装器,它似乎将“轮询”或“写入”的任何错误结果转换为简单的 -1 错误结果。

单声道助手:

int
write_serial (int fd, guchar *buffer, int offset, int count, int timeout)
{
struct pollfd pinfo;
guint32 n;

pinfo.fd = fd;
pinfo.events = POLLOUT;
pinfo.revents = POLLOUT;

n = count;

while (n > 0)
{
ssize_t t;

if (timeout != 0) {
int c;

while ((c = poll (&pinfo, 1, timeout)) == -1 && errno == EINTR)
;
if (c == -1)
return -1;
}

do {
t = write (fd, buffer + offset, n);
} while (t == -1 && errno == EINTR);

if (t < 0)
return -1;

offset += t;
n -= t;
}

return 0;
}

我从 Windows/.NET 到同一台设备并使用相同的写入代码进行通信没有遇到任何问题(您将在下面看到)。

这让我有点不知所措,不知道如何在不编写一些我希望能够重现与我当前代码相同的 IO 模式和时序的大量 C 测试的情况下进行诊断。有端口嗅探器,但那只会捕获数据,而不是诊断和错误。有没有办法在 Linux 内核中捕获和记录 IO 错误?

我的代码非常简单。这是相关的片段:

    _port = new SerialPort(portName, Configuration.BaudRate);
_port.NewLine = "\n";
_port.ReadTimeout = Configuration.StartupCommandTimeout; // 7000ms
_port.WriteTimeout = Configuration.StartupCommandTimeout;
_port.Open();

_port.WriteLine(command);

这总是发生在远离主线程的地方,尽管可能并不总是发生在构建、读取和写入端口的同一线程上。

使用 Mono 版本 3.2.8,虽然下面的代码来自 Master,但似乎没有改变。我在 ARM 上运行 Ubuntu 15.10。

最佳答案

在我的控制系统中,我有很多线程同时执行。通过为串行端口提供服务的参与者(本质上是线程)增加线程优先级 (ThreadPriority.AboveNormal),我似乎已经最小化或可能消除了这个问题。也许 Linux 比 Windows 对串口服务饥饿问题更敏感,或者是硬件不同。

关于c# - 是什么导致 Mono 下的 SerialPort.Write 出现偶发错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com