RS485:设备的 ioctl 不合适

2023-12-21

我使用以下代码访问 RS485 从站,但收到错误:

读取 ioctl 端口 (25) 时出错:设备的 ioctl 不合适

我的代码如下:

#include <linux/serial.h>
#include <sys/ioctl.h>


    int fd = open ("/dev/ttyUSB0", O_RDWR);
    if (fd < 0) {
        printf("Error Opening\n");
        exit(0);
    }

    struct serial_rs485 rs485conf;

    /* Enable RS485 mode: */
    rs485conf.flags |= SER_RS485_ENABLED;

    /* Set logical level for RTS pin equal to 1 when sending: */
    rs485conf.flags |= SER_RS485_RTS_ON_SEND;

    /* set logical level for RTS pin equal to 0 after sending: */
    rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);

    /* Set rts delay before send, if needed: */
    rs485conf.delay_rts_before_send = 0;

    /* Set rts delay after send, if needed: */
    rs485conf.delay_rts_after_send = 0;

    /* Set this flag if you want to receive data even whilst sending data */
    rs485conf.flags |= SER_RS485_RX_DURING_TX;

    if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) {
        fprintf( stderr, "Error reading ioctl port (%d): %s\n",  errno, strerror( errno ));
        exit(0);
    }

    //TODO read and write

    /* Close the device when finished: */
    if (close (fd) < 0) {
        fprintf( stderr, "Error closing device connection (%d): %s\n",  errno, strerror( errno ));
    }

我从以下位置获取了源代码https://www.kernel.org/doc/Documentation/serial/serial-rs485.txt https://www.kernel.org/doc/Documentation/serial/serial-rs485.txt。我正在树莓派上开发我的应用程序,并使用 Quad RS232-HS 芯片连接到 FTDI USB 串行设备。错误的根源可能是什么?\

当USB连接USB设备时,输出为

dmesg

如下:

[16865.640038] usb 3-2: new high-speed USB device number 10 using xhci_hcd
[16865.780365] usb 3-2: New USB device found, idVendor=0403, idProduct=6011
[16865.780367] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[16865.780369] usb 3-2: Product: Quad RS232-HS
[16865.780370] usb 3-2: Manufacturer: FTDI
[16866.377940] usbcore: registered new interface driver usbserial
[16866.377969] usbcore: registered new interface driver usbserial_generic
[16866.377994] usbserial: USB Serial support registered for generic
[16866.384018] usbcore: registered new interface driver ftdi_sio
[16866.384045] usbserial: USB Serial support registered for FTDI USB Serial Device
[16866.384203] ftdi_sio 3-2:1.0: FTDI USB Serial Device converter detected
[16866.384247] usb 3-2: Detected FT4232H
[16866.384373] usb 3-2: FTDI USB Serial Device converter now attached to ttyUSB0
[16866.384399] ftdi_sio 3-2:1.1: FTDI USB Serial Device converter detected
[16866.384431] usb 3-2: Detected FT4232H
[16866.384727] usb 3-2: FTDI USB Serial Device converter now attached to ttyUSB1
[16866.384751] ftdi_sio 3-2:1.2: FTDI USB Serial Device converter detected
[16866.384786] usb 3-2: Detected FT4232H
[16866.384897] usb 3-2: FTDI USB Serial Device converter now attached to ttyUSB2
[16866.384917] ftdi_sio 3-2:1.3: FTDI USB Serial Device converter detected
[16866.384950] usb 3-2: Detected FT4232H
[16866.385385] usb 3-2: FTDI USB Serial Device converter now attached to ttyUSB3

我认为,从硬件方面详细阐述罗德尼的答案可能会为将来面临类似问题的其他人增加一些价值。

虽然我来这里是为了寻找线程问题的答案(为什么我得到了一个ioctl尝试在 pyserial 上激活 RS485 模式时出错(我实际上是从 pyModbus 调用的)我找到了上面问题的答案。简单明了,并提供比罗德尼更简短的答案:你不能。您将无法在 FTDI 上激活 RS485 模式,因为没有功能使用 RTS 信号作为 RS485 芯片的驱动使能。

某些设备,例如使用atmel_串行驱动程序确实实现了此功能,但您不会发现那么多。深入研究这个问题,您会发现人们说您可以基于支持 RS485 模式的驱动程序之一编写自己的驱动程序(例如,请参阅:自动更改 RS-485 通信的 RTS https://stackoverflow.com/questions/25250731/automatically-changing-rts-for-rs-485-communication,但在我看来他们是错误的)

现在您有了坏消息,您可以问自己为什么需要使用 RS485 模式?我想像我一样,您正在尝试使用两线 RS485 设置在两个设备之间建立半双工链路(这在许多具有主从配置的工业设备中非常频繁,其中一侧发送数据请求,另一方及时响应,就像使用 Modbus 一样)。

如果您正在寻找软件解决方案,您仍然可以在开始传输之前和完成传输之后手动将 RTS 信号设置为高电平和低电平。该解决方案适用于测试,并且在大多数环境中只是为了好玩(至少在我尝试过的环境中,它甚至可以在 Raspberry Pi 上使用 Python 使用 GPIO 线来控制驱动器启用/〜读取启用信号),但我不会使用它如果你想获得良好的可靠性。对于任何非实时操作系统,都不能保证您将获得正确的计时,并且某些设备非常挑剔,并且会报告timeout错误。如果您可以自由选择巴士的两侧(如果您有两个以上的车站,则选择全部),您可以随时增加tiemout到处都希望有最好的结果。

好消息是,正如 Rodney 所说,在 FTDI 芯片上,引脚 13 上有 TXDEN 信号,因此您可以立即使用它。不幸的是,最便宜的 USB 转串口 适配器 PCB 板上无法轻松访问该信号。我的 Sparkfun 主板就是这样。如果您不愿意接受将电缆直接连接到 SMD IC 的挑战,您可以执行我所做的操作:从 FTDI 下载 mprog 3.5,连接到 EPROM,在 I/O Controls 下选择 TXDEN 而不是 TXLED,然后单击“保存”进行写入更新固件到芯片。然后,您可以轻松地将电缆连接到 LED 焊盘并将其用作驱动启用/~读取启用信号(参见图片,示波器快照显示它工作良好)。

修改后的 FTDI 板,TXLED 上带有 TXDEN 信号 https://i.stack.imgur.com/A21Fq.jpg

修改后电路的示波器捕获:蓝色是 TX,黄色是 TXDEN https://i.stack.imgur.com/otZw2.jpg

最后,如果您不幸遇到其他没有此选项 (TXDEN) 的芯片,例如 PL2303,您可以始终采用老方法并使用 555 定时器构建硬件 TXDEN(请参阅此处:http://www.embeddedsys.com/subpages/resources/images/documents/microsys_art_RS485.pdf http://www.embeddedsys.com/subpages/resources/images/documents/microsys_art_RS485.pdf)。我测试了这个电路,它工作正常,至少在 9600 bps 下(请注意,我必须使用 39K 电阻器而不是 3.9K,我认为这是一个拼写错误,但我可能是错的,我没有详细说明,我只是需要一些快速而肮脏的东西来与我的 FTDI 配对。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RS485:设备的 ioctl 不合适 的相关文章

  • C#中如何检测字符串是否为货币

    通常当我需要转换时currency string 如 1200 55 z 或 1 249 到十进制值我这样做 if currencyString Contains z decimal value Decimal Parse dataToCh
  • 测试 hdf5/c++ 中的组是否存在

    我正在打开一个现有的 HDF5 文件来附加数据 我想向那个叫做的小组保证 A存在以供后续访问 我正在寻找一种简单的方法来创建 A有条件地 如果不存在则创建并返回新组 或者返回现有组 一种方法是测试 A存在 我怎样才能高效地做到这一点 根据
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 处理 LINQ sum 表达式中的 null

    我正在使用 LINQ 查询来查找列的总和 并且在少数情况下该值有可能为空 我现在使用的查询是 int score dbContext domainmaps Where p gt p SchoolId schoolid Sum v gt v
  • 使用 C# 使用应用程序密码登录 Office 365 SMTP

    在我们的 Office 365 公司帐户中实施两步身份验证之前 我的 C WPF 程序已成功进行身份验证并发送邮件 我使用了 SmtpClient 库 但现在我必须找到另一个解决方案 因为它不再起作用 我找不到任何使用 O365 应用程序密
  • 身份未映射异常

    System Security Principal IdentityNotMappedException 无法转换部分或全部身份引用 该错误仅在应用程序注册后出现一次 当 SecurityIdentifier 无法映射时 例如 返回 Ide
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • 捕获当前正在播放的声音

    是否可以捕获计算机上当前播放的声音 如果能够将其保存为 mp3 就好了 但我认为这样做会存在一些法律问题 所以 wav 也可以 我环顾四周 有人建议使用虚拟音频线之类的东西 在 C 中捕获声音输出 https stackoverflow c
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • 在生产者-消费者情况下使用条件变量

    我正在尝试了解条件变量以及如何在生产者 消费者情况下使用它 我有一个队列 其中一个线程将数字推入队列 而另一个线程从队列中弹出数字 当生产线程放置一些数据时 我想使用条件变量向消费线程发出信号 问题是有时 或大多数时候 它只将最多两个项目推
  • C#:如何使用 SHOpenFolderAndSelectItems [重复]

    这个问题在这里已经有答案了 有人可以举例说明如何使用 shell 函数吗SH打开文件夹并选择项目 http msdn microsoft com en us library bb762232 VS 85 aspx来自 C 我不太明白如何使用
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 编写专门用于类及其子类的函数模板

    我正在尝试编写一个函数模板 一个版本应该用于不满足另一版本标准的所有类型 当参数是给定类的基类或该类本身时 应使用另一个版本 我尝试过超载Base 但是当类派生自Base 他们使用通用的 而不是特定的 我也尝试过这种 SFINAE 方法 s
  • C# - 为什么我需要初始化 [Out] 参数

    我有几个从本机 dll 导入的方法 使用以下语法 internal static class DllClass DllImport Example dll EntryPoint ExampleFunction public static e
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 宏观评价[重复]

    这个问题在这里已经有答案了 可能的重复 未定义的行为和序列点 https stackoverflow com questions 4176328 undefined behavior and sequence points 我无法理解以下宏
  • 有没有办法让 VS2010 在我的方法中扩展或收缩 try 块?

    我的代码有很多 try catch finally 块 与我在 VS2010 中的方法不同 除了添加区域之外 我无法在开发时扩展或收缩这些区域来隐藏内容 try vm R vm Qu vm T vm D vm Fil vm Type vm
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • 如何使复选框不可选择?

    我想知道你是怎么做的CheckBox在c 中无法选择 我认为这会是类似 SetSelectable false 之类的东西 但我似乎看不到该方法 I found CanSelect但这似乎是只读属性 您可以设置自动检查 http msdn

随机推荐

  • Android – 如何加载共享库?

    我创建了最简单的 EXECUTABLE 和 SHARED LIBRARY 如果不更改 LD LIBRARY PATH 则不会加载 SHARED LIBRARY hello hello link image 1995 failed to li
  • cv::Mat 到 QImage 转换

    我发现了非常相似的主题 如何将 opencv cv Mat 转换为 qimage https stackoverflow com questions 5026965 how to convert an opencv cvmat to qim
  • bash脚本循环多个变量

    我正在尝试写类似以下内容 for i in a z j in 1 26 do echo dev sd i 1 disk j ext4 noatime 1 1 gt gt test done 当然 这不是正确的语法 有人可以帮助我使用正确的语
  • 在运行时从 iOS 上的本机方法创建委托

    这是一个MonoTouch 专用问题 我目前正在开发一个 OpenGL 的包装器 它与 OpenTK 等包装器有很大不同 该包装器用于实现更快的 OpenGL 开发 方法不是这样声明的 void glGenTextures Int32 n
  • 创建一个php函数来返回mysql结果

    我试图创建一个函数 它将返回一个 mysql 查询 然后我可以循环遍历并处理结果 但它似乎不起作用 我什至可能没有以正确的方式这样做 function GetAccounts username require dbconn php resu
  • 无法在 Kafka 中使用来自远程计算机的消息

    我在我的一台机器上创建了一个kafka主题 其IP为192 168 25 50 主题名称为test poc 然后通过使用 kafka console Producer 我生成了如下消息 kafka console producer brok
  • 装有 iOS 6 AVAudioPlayer 的 iPhone 4S 可以工作,但没有声音

    我创建了一个简单的音频应用程序来播放 mp3 文件 它在模拟器 iOS 5 和 6 和 iPod3GS iOS 5 1 上运行没有问题 但是当我在 iPhone4S iOS 6 上尝试时 它似乎可以工作 但没有任何声音 audioPlaye
  • Pharo 有 CAS 吗?

    在学习Python时 我发现了SymPy模块 它实际上是一个完整的计算机代数系统 CAS 你可以用它来解决数学中的符号问题 比如微分方程 多项式等等 现在我正在学习 Pharo 我想知道是否有一种方法可以在 Pharo 中进行符号数学运算
  • ctrl+space 键绑定不适用于 Sublime Text 3 中的注释

    安装 Sublime Text 3 Build 3059 后 我尝试像过去一样配置一些按键绑定 所以我在 首选项 按键绑定 用户 中配置了这个 keys ctrl space command toggle comment args bloc
  • 在 SwiftUI 中绘制动画路径描边

    要为过去的路径设置动画 我可以这样做 let pathLayer CAShapeLayer let pathAnimation CABasicAnimation keyPath strokeEnd pathLayer path path c
  • 获取输入框中选定的文本

    是否可以使用 jQuery 或 vanilla JavaScript 获取网站输入框中选定的文本 我尝试过var selectedText window getSelection toString 但这段代码只能获取 a 中的文本段落并且不
  • 检查今天的日期是否在其他两个日期之间[重复]

    这个问题在这里已经有答案了 我想检查今天的日期是否在一个时期的开始日期和结束日期之间 冬天 夏天 春天等 如果今天的日期介于冬季期间 它会将 season 变量设置为哪个时期 但目前它只给我 01 01 我不明白为什么 感谢帮助 seaso
  • 如何使用 requirejs 分解部分淘汰视图模型

    我目前正在开发一个应用程序 由于功能太多 该应用程序正在不断扩展 这里我将提供一些示例代码以供理解 function test var self this Define Properties self TaskSection ko obse
  • iOS 12 不支持部分 PWA 的离线功能

    iOS 12 Safari 不支持某些 PWA 渐进式 Web 应用程序 的离线功能 Safari 似乎没有正确缓存这些网络应用程序中的资源 例如 以下 PWA 无法在 iOS 12 和 12 1 中离线工作 但它们在 Android 或
  • 输入字段的大小可以设置为百分比值吗?

    我无法创建一个居中且覆盖浏览器窗口宽度 80 的输入字段
  • 使用 scipy.misc.imread 时出错:AttributeError: __float__

    我正在使用 scipy misc imread 将 png 文件转换为浮点数数组 scipy misc imread rawImagePath astype scipy float 其中 rawImagePath 是文件的完整路径 这在绝大
  • C++ 库渲染 ODF 文档?

    我无法找到任何开源库来使用 C 渲染 ODF 文档 我发现 ODKit 支持 Java 和 AODL for NET C 有谁有任何想法或为我提供任何指示 我找到了一个Qt源来解析PDF http qt apps org content s
  • 获取 SoapBody 元素值

    这是我从服务器得到的响应 虽然我可以接受MM7Version元素值 我无法获取Status元素值 它返回 null SoapMeesage XML 响应
  • 服务 Firestore 不可用

    我正在尝试使用纯 JavaScript 连接到我的 firestore 我现在想加快速度并跑步 索引 js import app from firebase js import getFirestore from https www gst
  • RS485:设备的 ioctl 不合适

    我使用以下代码访问 RS485 从站 但收到错误 读取 ioctl 端口 25 时出错 设备的 ioctl 不合适 我的代码如下 include