gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:01 24 4
gpt4 key购买 nike

我正在尝试使用串行端口通过/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
}

和 bool 值 value是特定的 SerialSignal 是否被设置。

好像调用了两次,一次设置Dtr,一次Rts。

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

因为我有可用的 C 代码,所以我认为最后一个可能是最简单的方法,但即便如此我还是想了解这里的问题。

最佳答案

阅读您的评论后:是的,您可以毫无问题地调用 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
}
}
}

希望对你有帮助。

关于linux - 为什么 SerialPort.Open() 会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14652370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com