linux485串口发送状态,RS485自动方向切换模式
RS485通信的时候,再应用程序中,可以进行对485设置为自动方向切换模式。防止由于我们手动切换引脚时,存在的时间问题,因为我们手动切换的时候,每次写串口的时候,都要将引脚拉高或拉低来切换成写模式,调用完写串口的函数后,就要去进行延时一段时间,确保数据在底层硬件层传输完毕了,然后将引脚拉高或拉低在切换到读状态,这样由于你计算的时间的误差性于你拉高拉低引脚的时间误差性都会导致485的通信不稳定。所以我们如果采用485的自动方向切换模式,将会将这个通信误差缩小,当每次写串口时,他自己就会切换为写状态,写完后,又自动切换为读状态。
在arm linux上的485自动切换的应用程序操作如下解释:
打开串口的方法,与设置串口的属性等,更正常我们在应用程序中使用串口一样,一样的方式进行打开串口就可以。
打开串口之后,我们要进行下一面一部,设置一个关于RS485自动方向模式切换要用的结构体和几个宏,这个结构体将来在填充好后,用ioctl函数写入到所打开的串口文件描述符中即可。
#define TIOCGRS485 0x542E
#define TIOCSRS485 0x542F
struct my_serial_rs485 //关于485自动方向切换模式要设置的内容的结构体。
{
unsigned longflags;/* 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 longdelay_rts_before_send;/* Delay before send (milliseconds) */
unsigned longdelay_rts_after_send;/* Delay after send (milliseconds) */
unsigned longpadding[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的自动切换模式的使用,却大致就是如此了。
linux485串口发送状态,RS485自动方向切换模式相关推荐
- RS485方向切换的几种方案及优劣势分析
关注.星标公众号,不错过精彩内容 来源:创易栈 RS485作为常见的总线之一,几乎每个工控设备都在用,我们也对其熟悉不过了.我们都知道RS485双半双工通信,其CPU内部的根源是串口通信,串口通信是区 ...
- GD32F130之USART自带的RS485方向切换功能
关于RS485收发器的基本使用 在使用单片机实现串口RS485通信时,需要外接一个TTL转RS485的收发器芯片,例如SP3485和MAX3485.由于RS485使用的是单数据通道,差分信号传输方式, ...
- 【STC单片机学习】第十三课:串口通信和RS485
[朱老师课程总结 侵删] 第一部分.章节目录 1.13.1.通信有关的常见概念 1.13.2.什么是串行通信 1.13.3.51单片机的串行通信 1.13.4.STC51的串行通信相关寄存器1 1.1 ...
- STM32串口的使用(原理、结构体、库函数、串口发送字符(串)、重定向printf串口发送、串口中断接收控制灯)
参考:串口的结构体 重定向printf串口发送stm32等博文 作者:点灯小哥 发布时间: 2021-03-06 21:46:33 网址:https://blog.csdn.net/weixin_46 ...
- 三、E906移植----FPGA生成可用的比特流并实现串口发送
三.E906移植----FPGA生成可用的比特流并实现串口发送 书接上回,第二篇把基本工程搭建了起来,跑了下综合看了看.本文就开始具体的修改了,连蒙带猜,修修补补,最终完成了板上串口发送"H ...
- MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据
MJKDZ PS2手柄控制OskarBot小车(一):Arduino串口发送数据 [目录] - 1.无线通信模块设置 - 1.1 设置参数 - 1.2 调试步骤 - 2.按键与通信格式 - 2.1 P ...
- USART串口协议和USART串口外设(USART串口发送串口发送和接收)
1.通信接口 A.基本概念 • 通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 异步:需要双方约定一个频率 B.数据通信方 ...
- 【STM32学习】——串口通信协议STM32-USART外设数据帧/输入数据策略/波特率发生器串口发送/接受实操
文章目录 前言 一.串口通信 1.通信接口 2.串口通信 (1)串口简介 (2)串口硬件电路 (3)串口软件部分 二.STM32的USART外设 1.USART简介 2.图示详解 三.细节问题 1.数 ...
- 单片机串口发送数据很慢?这种方法帮助你提高!
大家好,我是张巧龙,本文介绍如何使用带FIFO的串口来减少接收中断次数,通过一种自定义通讯协议格式,给出帧打包方法:之后介绍一种特殊的串口数据发送方法,可在避免使用串口发送中断的情况下,提高系统的响应 ...
最新文章
- php中的抽象类(abstract class)和接口(interface)
- mxnet 常用层,卷积激活损失
- 如何使用Python制作一个会动的地球仪?
- 验证二叉搜索数—leetcode98
- 【Nutch2.2.1源代码分析之5】索引的基本流程
- 什么时候会是用treeset?_flex:1 到底代表什么?
- 利用iTextSharp对PDF进行签名(E-signing PDF documents with iTextSharp)--推荐
- 小波变换和motion信号处理(二)
- 游戏中植入广告的例子
- 测试工程之测试计划之里程碑计划
- c语言结构体投票系统,结构体之投票系统
- 联想计算机管理员权限设置,联想电脑windows10管理员权限开启的4种方法
- 文曲星猜数游戏c语言带结果,文曲星猜数游戏 C实现
- 获取和设置默认打印机
- 在excel/wps中如何实现批量翻译
- easyExcel导入导出(列锁定单元格、表头合并、导出类型限制、锁定单元格增加底色、设置密码、隐藏列等)
- 商业银行经营特点与三性原则:安全性、流动性、盈利性
- ARFoundation之路-环境配置(iOS)之二
- 基于STM32音频解码MP3——vs1053
- Android TextView 如何判断是否已经省略