RS485自动方向切换模式

RS485通信的时候,再应用程序中,可以进行对485设置为自动方向切换模式。防止由于我们手动切换引脚时,存在的时间问题,因为我们手动切换的时候,每次写串口的时候,都要将引脚拉高或拉低来切换成写模式,调用完写串口的函数后,就要去进行延时一段时间,确保数据在底层硬件层传输完毕了,然后将引脚拉高或拉低在切换到读状态,这样由于你计算的时间的误差性于你拉高拉低引脚的时间误差性都会导致485的通信不稳定。所以我们如果采用485的自动方向切换模式,将会将这个通信误差缩小,当每次写串口时,他自己就会切换为写状态,写完后,又自动切换为读状态。

在arm linux上的485自动切换的应用程序操作如下解释:

打开串口的方法,与设置串口的属性等,更正常我们在应用程序中使用串口一样,一样的方式进行打开串口就可以。

打开串口之后,我们要进行下一面一部,设置一个关于RS485自动方向模式切换要用的结构体和几个宏,这个结构体将来在填充好后,用ioctl函数写入到所打开的串口文件描述符中即可。

#define TIOCGRS485      0x542E

#define TIOCSRS485      0x542F

struct my_serial_rs485    //关于485自动方向切换模式要设置的内容的结构体。

{

unsigned long 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)

unsigned long delay_rts_before_send; /* Delay before send (milliseconds) */

unsigned long delay_rts_after_send; /* Delay after send (milliseconds) */

unsigned long padding[5]; /* Memory is cheap, new structs

are a royal PITA .. */

};

int main(void)

{

struct my_serial_rs485 rs485conf;

bool flag = false;

flag = g_com1.open_com(Serial_COM_10, O_RDWR | O_NOCTTY);    //打开串口,当然这个串口类是要你自己去封装的

if ( !flag )

{

printf("open com 10 is failed.\n");

_exit(-1);

}

/**************458config 的填充***********************************************/

/* Enable RS485 mode: */

rs485conf.flags |= SER_RS485_ENABLED;    //设置使能485

/* Set logical level for RTS pin equal to 1 when sending: */

rs485conf.flags |= SER_RS485_RTS_ON_SEND;    //设置rts,当逻辑电平为高的时候,为发送

//rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;

/* set logical level for RTS pin equal to 0 after sending: */

rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);    //设置rts,当发送完后逻辑电平为低

//rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);

/****************************************************************************/

//485的使用

pthread_mutex_lock(&mutex_net1);

len = cclinet1.Recv_from_Net(recv_buffer, MAX_BUF_LEN);    //从网络中读取数据,len表示读取到的长度

pthread_mutex_unlock(&mutex_net1);

rs_485_wait_time = 10 * len / baudrate_list[g_info.baud]  * 1000;   //ms    //根据len的长度和波特率算出输出这么个len长度的字节的时间需要多少ms

/**********************************自动切换485******************/

pthread_mutex_lock(&mutex_com1);

rs485conf.delay_rts_after_send = rs_485_wait_time;    //将计算出的发送len长度字节的时间,填充到结构体的成员中,表示发送完串口数据后延时一段时间

if (ioctl (g_com1.m_fd, TIOCSRS485, &rs485conf) < 0)    //将填充的结构体写入到文件描述符中

{

/* Error handling.*/

printf("ioctl TIOCSRS485 error.\n");

}

pthread_mutex_unlock(&mutex_com1);

/********************之后就可以像操作232的串口一样去操作485的串口了。因为在每次要写数据时,会自动切换为写模式,并延时比较准确的时间后去自动切换为读模式。

return 0;

}

由于程序是在工程开发中的一部分拿出来的,来做485记录的,并不完整,但关于485的自动切换模式的使用,却大致就是如此了。

				
时间: 2025-01-20 04:00:58

RS485自动方向切换模式的相关文章

利用QJM实现HDFS自动主从切换(HA Automatic Failover)源码详析

最近研究了下NameNode HA Automatic Failover方面的东西,当Active NN因为异常或其他原因不能正常提供服务时,处于Standby状态的NN就可以自动切换为Active状态,从而到达真正的高可用 NN HA Automatic Failover架构图 为了实现自动切换,需要依赖ZooKeeper和ZKFC组件,ZooKeeper主要用来记录NN的相关状态信息,zkfc组件以单独的JVM进程的形式运行在NN所在的节点上.下面首先分析下NN的启动流程,NN对象在实例化过

JS案例练习:图片切换+切换模式

先附图: CSS样式部分: <style> *{margin: 0; padding: 0} body{font-family:'Microsoft YaHei';} .menu{margin:20px auto 0; width:550px; text-align: center;} .menu h4{font-weight:normal; line-height:50px;} #xh{margin: auto 30px;} #sx{margin: auto 30px;} #tab{widt

自动配置/切换/查看JDK环境变量

最近老是需要几个版本的JDK切换工作,于是网上收集资料整理,自己写了一个:自动配置/切换/查看JDK环境变量的批处理脚本.顺带3个JDK版本分别是:jdk1.6.0_43,jdk1.7.0_80,jdk1.8.0_131,大家就不用自己辛辛苦苦的去安装jdk了,直接拿来就能用. 一,JDK环境变量自动配置.bat @echo off set home=%JAVA_HOME% if defined home ( echo 删除现有的JAVA_HOME环境变量 wmic ENVIRONMENT wh

如果浏览器自动调用quirks模式打开的话

(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-03-21) 则肯定你的html的声明,没有写好. 今天遇到几个,前面莫名其妙的多了个空格(在网页上看源码是多空格,复制到netbeans中打开,显示的是一个小横线,很短的.) 此短线很短,像是个点,复制下来,在记事本和word中都无法粘贴显示的,但是在netbeans中显示是一个小横点.可能是格式问题. 再次修正:(2015.5.26抢救百度文章时添加) 不单是声明的问题,如果你的html代码中有不规范的地方,让ie误

Mycat在MySQL主从模式(1主1从)下读写分离和及自动切换模式的验证

实验环境 两台Centos7  MySQL5.7.12 IP地址为:192.168.10.36  192.168.10.37 一台Centos7 Mycat IP地址为:192.168.10.31 一:安装mysql,如下图所示(这里采用yum安装): 二:配置MYSQL,以及建立MYSQL主从 1:初始化密码,由于我没在/root目录下找到第一次启动的随机密码,所以我只能用如下操作 vi /etc/my.cnf mysqd 字段添加 #skip-grant-tables 然后重启mysql  

DataGuard failover dg role自动切换模式测试

1,在脚本中代入create db flash backup point for recover dg 2,测试前主备库状态(备库现角色验证,主库监听状态-->有意stop) 主要验证思路, 脚本从备库对dg主库连接性做测试,若主库连接性有问题(监听,网络,.....),自动切换备库角色到主库角色; 执行验证测试脚本过程 验证角色自动切换结果(我们在测试前已经刻意停止了dg主库中的监听及db Service) 部分代码 主库状态监测脚本 根据主库状态监测脚本获取的数据,执行dg主备的自动切断 <

linux(centos)如何启动自动进入文本模式

vi /etc/inittab里面的 id:5:initdefault: 将5改为3后,reboot! 图形模式与文字模式的切换方式: Linux预设提供了六个命令窗口终端机让我们来登录.默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 - tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们.如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl + Alt + F2 ~ F6来进入其中一个命令窗口界面.当你进入命令窗口界

android之屏幕方向切换

今天看到andoird屏幕的切换,因为在游戏中切换横向时非常正常的一件事. 首先如果我们不想切换方向那么我们可以在androidmainfest.xml中对activity的属性进行添加. android:sreenOrientation 属性值 portrait表示垂直 landscape表示水平 但是我不想这么做,我添加水平和垂直按钮实现屏幕的切换. 添加两个按钮,在监听函数中实现 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION

redis配置读写分离以及利用哨兵sentinel进行自动主从切换

redis利用哨兵(sentinel)进行主从切换,断断续续,自己终于通过配置验证了一下该功能,其中遇到过一些的问题,也是耗费了大量的时间才解决,接下来分享下配置的过程以及遇到的问题和解决方法.希望对各位有所帮助. 首先说一下实验环境: redis软件:redis-3.2.1(安装在虚拟机的linux系统中) 宿主主机:window8.1 x64 secureCRT:宿主主机安装此软件来操作linux,这只是个人喜欢,大家可以不装. 对于redis在linux如何安装这里不进行说明,不懂的朋友可