当前位置: 首页 > 面试题库 >

自动更改用于RS-485通讯的RTS

索嘉石
2023-03-14
问题内容

我正在尝试在程序中设置半双工通信。我的RS485收发器使用RTS标志(TIOCM_RTS)在发送和接收之间来回切换。为了发送/接收数据,我需要手动更改RTS标志:

  1. 将“ RTS”设置为“高”。

  2. 发送数据。

  3. 将RTS设置为低。

    int setRTS(int level) {
    int status;
    ioctl(ser_port, TIOCMGET, &status);
    if(level) {
        status |= TIOCM_RTS;
    } else {
        status &= ~TIOCM_RTS;
    }
    ioctl(ser_port, TIOCMSET, &status);
    return 1;
    

    }

我的问题是:Linux内核不应该能够自动切换RTS吗?以及如何确保在调用setRTS(0)之前已发送数据


问题答案:

linux内核不应该能够自动切换RTS吗?

是的,从Linux 3.0开始就有用于此的内核框架。
include / uapi / asm-generic / ioctls.h中 有两个ioctl :

#define TIOCGRS485      0x542E
#define TIOCSRS485      0x542F

在RS-485模式下检索和配置tty串行端口驱动程序。
这些ioctl使用struct serial_rs485

 /*
  * Serial interface for controlling RS485 settings on chips with suitable
  * support. Set with TIOCSRS485 and get with TIOCGRS485 if supported by your
  * platform. The set function returns the new state, with any unsupported bits
  * reverted appropriately.
  */

 struct serial_rs485 {
         __u32   flags;                  /* RS485 feature flags */
 #define SER_RS485_ENABLED               (1 << 0)        /* If enabled */
 #define SER_RS485_RTS_ON_SEND           (1 << 1)        /* Logical level for
                                                            RTS pin when
                                                            sending */
 #define SER_RS485_RTS_AFTER_SEND        (1 << 2)        /* Logical level for
                                                            RTS pin after sent*/
 #define SER_RS485_RX_DURING_TX          (1 << 4)
         __u32   delay_rts_before_send;  /* Delay before send (milliseconds) */
         __u32   delay_rts_after_send;   /* Delay after send (milliseconds) */
         __u32   padding[5];             /* Memory is cheap, new structs
                                            are a royal PITA .. */
 };

我已经在Atmel和Etrax SoC上使用了此RS-485功能,但是在Linux UART / USART驱动程序中,这些ioctl的实现非常稀疏。
如果您的驱动程序没有,请考虑自己实施。您可以使用 drivers / tty / serial / atmel_serial.c中的实现
作为指南。另请阅读用于RS485的Linux内核文档。



 类似资料:
  • 连接类别: 方法进行连接,此方法附加一个鼠标lostfocus事件,并从数据库返回我想要的项目: 但是由于某种原因,在第二次尝试中,它将org.mysql更改为org.sqlite.JDBC JAVAsql。SQLException:无效的数据库地址:jdbc:mysql://192.168.0.222/risabel在org。sqlite。JDBC。createConnection(JDBC.j

  • 问题内容: 连接类别: 进行连接的方法,此方法附加了一个鼠标lostfocus事件,并从数据库中返回我想要的项目: 但是由于某种原因,在第二次尝试中,它将org.mysql更改为org.sqlite.JDBC java.sql.SQLException:无效的数据库地址: org.sqlite.JDBC.createConnection(JDBC.java:110)处的* jdbc:mysql:/

  • 我希望在Windows 2008上实现软件的自动化。自动化软件不必与Windows2008兼容(我可以使用远程桌面)。GUI有两个主要区域,左侧是嵌入图像列表,右侧是显示窗格。显示窗格显示所有嵌入的图像在屏幕上的位置(该程序用于构建人机界面[HMI's])。 我需要单击左侧列表中的每个嵌入图像,并从中提取一些数据。问题是;根据选择的主显示文件,嵌入的图像列表将具有不同的名称和不同的长度。 因此,自

  • 我有一个图像视图和一堆图像,但问题是我想一个接一个地显示图像视图中的所有图像,图像应该像gif动画一样每秒钟或每0.2秒改变一次。

  • 我正在编写一个Ruby脚本,设计用于从命令行运行。该脚本有一个相应的RSpec文件,用于验证其功能。文件夹结构为: 在顶级目录中运行rspec spec可以正常工作。来自<代码>的测试结果/显示spec/main\u script\u spec.rb文件。我希望避免每次更改主脚本文件或规范文件时都手动运行此操作。我所有的搜索结果都显示了像guard这样的东西(据我所知)都是为Rails应用程序设计

  • 问题内容: 在MySQL中,我有一个表,我想将值设置为 。这可能吗,这是什么查询语句? 问题答案: 您可以用来更改auto_increment初始值: 有关更多详细信息,请参见MySQL参考。