1

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

到目前为止,我已经使用 modprobe 让它显示为 USB0,chmod 允许在没有 root 权限的情况下进行读写,并且我有一个 C 库(称为 Gant 之类的东西),它实际上可以工作。

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

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但由于我不知道实际导致错误的原因,我必须非常幸运地通过尝试不同的组合对其进行排序。

从在mono的源代码中挖掘了一下,看起来被调用的函数会产生错误是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# 单声道项目中的一些 C 代码吗?

由于我有工作的 C 代码,我认为最后一个可能证明是最简单的路线,但即便如此,我还是想了解这里出了什么问题。

4

1 回答 1

1

阅读您的评论后:是的,您可以毫无问题地调用 C 代码,您会在此处找到大量示例。尽管如此,您也可以通过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
        }
    }
}

希望对你有帮助。

于 2013-02-06T10:08:37.303 回答