我正在尝试使用串行端口通过 /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 代码,我认为最后一个可能证明是最简单的路线,但即便如此,我还是想了解这里出了什么问题。