我正在尝试使用串口通过/ 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代码,我认为最后一个可能是最简单的路径,但即便如此,我也想了解这里有什么问题。
答案 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
}
}
}
希望能帮到你。