Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是什么导致SerialPort中出现零星错误。在Mono下写入?_C#_Linux_Mono_Serial Port_Timeoutexception - Fatal编程技术网

C# 是什么导致SerialPort中出现零星错误。在Mono下写入?

C# 是什么导致SerialPort中出现零星错误。在Mono下写入?,c#,linux,mono,serial-port,timeoutexception,C#,Linux,Mono,Serial Port,Timeoutexception,我正在使用从Linux到Mono下的Arduino Nano的USB连接(FTDI)。这基本上是可行的,但过了一段时间,在一个看似随机的时间,我得到了一个试图写入SerialPort的TimeoutException。显然(请参阅并关联),写入中的任何错误都会导致TimeoutException,并且没有时间延迟,因此我认为可以公平地假设它实际上不是超时,而只是一个错误 单声道编码: // FIXME: this reports every write error as timeout if (

我正在使用从Linux到Mono下的Arduino Nano的USB连接(FTDI)。这基本上是可行的,但过了一段时间,在一个看似随机的时间,我得到了一个试图写入SerialPort的TimeoutException。显然(请参阅并关联),写入中的任何错误都会导致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");
这总是发生在远离主线程的地方,尽管可能并不总是发生在构建、读取和写入端口的同一线程上


使用Mono版本3.2.8,尽管下面的代码来自Master,似乎没有改变。我在ARM上运行Ubuntu15.10

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

出于好奇,您发送给tty的波特率是多少?@RubertN,9600 N,8,1坚持使用Arduino的默认值,因为它们满足了我的需要。接下来,我将使用一个类似的软件堆栈,但是使用一个不同的板(RPi2而不是Odroid XU4)。我几乎准备好了。啊……好吧……不是速度问题……我使用了很多32位ARM板(如STM32-FO等),在波特率较低的情况下,单声道串行堆栈从来没有出现过问题,但在Linux/ARM arch上从来没有出现过,仅x86_64。用于高速tty(即567k+baud/1.7uS,我们有一个第三方C库,用作Mono的串行。C对于非阻塞速度来说简直是一团糟…$RobertN,所以你在Mono中将自己的P/Invoke层构建成了C的串行包装层?如果我不顾一切,我可能会尝试,但为了得到一个更好的错误,似乎付出了很多努力。是的,我们的P/Invoke屁股在第三方$$$linux串行库上,我们不打算从头开始编写,当您谈论1uS串行时间时,必须手动调整c。您可以在linux/arm安装程序上编译mono,还是安装二进制PKG(?),因为我可能有一些serial.c(和匹配的c#)更新,您可以尝试。
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;
}
    _port = new SerialPort(portName, Configuration.BaudRate);
    _port.NewLine = "\n";
    _port.ReadTimeout = Configuration.StartupCommandTimeout; // 7000ms
    _port.WriteTimeout = Configuration.StartupCommandTimeout;
    _port.Open();

    _port.WriteLine(command);