为什么SerialPort.Open()会失败?

时间:2013-02-01 18:04:38

标签: linux mono serial-port

我正在尝试使用串口通过/ dev / ttyUSB0与USB设备通信。

到目前为止,我已经使用modprobe将其显示为USB0,chmod允许读取和写入而不是root,并且我有一个C库(称为Gant之类)实际上有效。

但是,我想将它与最初在C#中为.Net开发的现有应用程序集成,但是(希望)很快将在Linux上使用mono运行。

C代码使用open("/dev/ttyUSB0")获取文件描述符,然后使用read()write()直接与USB设备通信。

据我所知,C#中的等价物就像是

SerialPort sp = new SerialPort("/dev/ttyUSB0");
sp.Open();

但是这会产生IOException: Invalid argument at System.IO.Ports.SerialPortStream.SetSignal (SerialSignal signal, Boolean value) [0x00000] in <filename unknown>:0

我为new SerialPort()尝试了不同的参数集,然后使用像sp.BaudRate = 115200之类的东西设置值,但由于我不知道实际导致错误的是什么,我必须非常幸运通过尝试不同的组合来对其进行排序。

从单声道的源代码中挖掘一下,看起来被调用的函数产生的错误是set_signal (fd, signal, value)

set_signal是一个外部的,声明如下:

[DllImport ("MonoPosixHelper", SetLastError = true)]
static extern int set_signal (int fd, SerialSignal signal, bool value);

据我了解,fd是一个文件描述符,如C代码,SerialSignal是一个枚举:

enum SerialSignal {
    None = 0,
    Cd = 1, // Carrier detect
    Cts = 2, // Clear to send
    Dsr = 4, // Data set ready
    Dtr = 8, // Data terminal ready
    Rts = 16 // Request to send
}

和布尔value是特定SerialSignal是否被设置。

它似乎被调用两次,一次设置Dtr,一次设置为Rts。

所以,毕竟我的问题仍然是为什么会失败?可能有DTR和RTS的设备特定设置我还不对吗?是否可以完全绕过单声道代码,并使用一些C外部(这是我认为单声道源无论如何,一旦它变得足够低)。我可以在C#mono项目中使用一些C代码吗?

由于我使用C代码,我认为最后一个可能是最简单的路径,但即便如此,我也想了解这里有什么问题。

1 个答案:

答案 0 :(得分:1)

阅读你的评论后:是的,你可以毫无问题地调用C代码,你会发现很多例子here。尽管如此,您还可以通过以下方式使用UnixStream类:

using System;
using Mono.Unix.Native;
using Mono.Unix;

namespace Test719
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            var fd = Syscall.open("/dev/ttyUSB0", OpenFlags.O_RDWR);
            var stream = new UnixStream(fd);

            stream.ReadByte(); // and so on
        }
    }
}

希望能帮到你。

相关问题