ESP32使用ARDUINO 对RS485 的DE/RE#流向控制

  • 概述
  • 编程方法
    • 方法一
    • 方法二
  • 总结

概述

原来一直用74HC04配合SP3485做RS485输出模块,对SP3485模块的DE/RE#端不控制。线路图如下:

但这次因为线路板尺寸紧张,并且有多余的点可以控制DE/RE#, 就选择了如下的线路:

现在来说一下编程遇到的困惑和解决问题的思路。

编程方法

方法一

当要向外部输出数据数据时,采用delay(10) 的方式,才能让串口的数据输出到外部接口。

比如我使用了RX2,TX2作为RS485的输出模块。程序应该这样,不然不能输出数据。

    if ( Serial.available()){uint8_t x = Serial.read();if ( x == 's' ){char sendBuff[] = "Send message to RS485";digitalWrite(DE_485, HIGH);Serial2.println(sendBuff);delay(10);digitalWrite(DE_485, LOW);Serial.println("Message sneded to RS485");}}

程序说明:如果在digitalWrite(DE_485, HIGH)后不延时10ms的话无法在串口2上输出信息。在程序中添加这个delay(10)后可以正常输出了。还没有试,大量的数据可能要延长这个延时时间。

方法二

采用中断的方式。
中断程序:

void IRAM_ATTR isrDown()    // edge falling
{digitalWrite(DE_485, HIGH);
}void IRAM_ATTR isrRDown()   // edge riging
{digitalWrite(DE_485, LOW);
}

在setup中将中断程序分配给特定的端子:

    attachInterrupt(17, isrDown, FALLING);attachInterrupt(16, isrRDown, RISING);

17是TX2,16是RX2,分别是串口2对应的TX和RX。这时,程序就像RS232或USB普通串口一样发送和接收就可以了。

    if ( Serial.available()){uint8_t x = Serial.read();if ( x == 's' ){char sendBuff[] = "Send message to RS485";Serial2.println(sendBuff);Serial.println("Message sneded to RS485");}}

总结

从程序可以看出,Arduino还是有操作系统的特点,在代码上看Serial2.println(sendBuff)在后台是运行的,当我们发送这个指令时,后台按波特率不断的执行,这条语句后面如果直接执行digitalWrite(DE_485, LOW), 会使数据发送不出去。采用中断形式是一种尝试。或许在频繁操作的RS485时会不会健康运行有待于验证,也希望网友提宝贵意见。

使用ESP8266的模块发现Arduino编程时在使用SoftwareSerial库时有:

    /// Transmit control pin.void setTransmitEnablePin(int8_t txEnablePin);

可以用这个函数来定义DE485输出点。但在使用过程中发现,当波特率较高时,出错的机率比较高,200ms发送一次,一晚上出现了200多次的收发故障。选用的波特率时57600. 说明在高波特率情况下不稳定。

ESP32 ARDUINO RS485 DE/RE#流向控制编程相关推荐

  1. ESP32 Arduino Ticker定时库

    Ticker是ESP32 arduino的自带库,可以设置以固定时间间隔反复执行某个任务,特别适合以固定频率从传感器收集数据. 计时器本质上是一个计数器.让我们举一个简单的例子.如果给你一个可以从0到 ...

  2. ESP32作为服务器,使用网页控制LED小灯

    ESP32作为服务器,使用网页控制LED小灯 项目描述 ESP32-S开发板加入局域网,使用platformIO编写好ESP32的代码后,编译下载到ESP32中,访问ESP32的IP地址,使用网页控制 ...

  3. ESP32+arduino智能浇水系统

    一.ESP32+arduino智能浇水系统 随着人类居住条件的改善及对生态生活环境的关注,花卉养殖得到社会和人类个体的重视.这些具有生命特征的植物需 要科学合理的人工照顾.本研究提出了利用ESP WR ...

  4. Microsoft微软公司硬件控制编程技术介绍

    我是荔园微风,作为一名在IT界整整25年的老兵,最近遇到一个技术问题,就是公司同事问我,有没有什么好的硬件控制编程技术可以选,我说有啊,很多啊,比如linux嵌入式编程啊,比如纯粹的单片机C编程啦,再 ...

  5. 交叉路口红绿灯控制程序linux,PLC十字路口的交通灯控制编程实例!

    原标题:PLC十字路口的交通灯控制编程实例! 1. 控制要求 十字路口交通灯的运行如下图所示.当起动开关接通时,信号灯系统开始工作,且先南北红灯亮,东西绿灯亮.当起动开关断开时,所有的信号灯全部熄灭. ...

  6. 利用blinker,让arduino实现多路继电器状态控制和APP端状态反馈

    利用blinker,让arduino实现多路继电器状态控制和APP端状态反馈 有需要的朋友可以直接拷贝代码拿来使用,按钮是自锁按钮控制的,不是点动开关型的.这是经过许多人的经验总结和奉献才调通的程序, ...

  7. 免费领,自动化控制编程入门到开挂学习路径(附教程和软件工具)

    大家好,我是华山自控编程的朱老师,很多同学都在讨论上位机运动控制卡与机器视觉编程的问题,今天写了干货,希望可以帮助到你们! 一.入门上位机编程的疑问解答 1.自动化控制编程分哪几个方向? 答:自动化控 ...

  8. Arduino 好盈电调基本控制(PWM)

    Arduino 好盈电调 基本控制(PWM) 新手小白,寻找多个文档以及示例代码,都七七八八:最后碰见一个大致好使的,修改之后放上来 注意:在做测试的时候不要安装螺旋桨,否则会很危险!!! int P ...

  9. 【基于Arduino APDS9960 传感器的手势控制非接触式电梯】

    基于Arduino APDS9960 传感器的手势控制非接触式电梯 前言 所需组件 APDS9960 RGB & 手势传感器 电路原理图 代码说明 测试手势控制的非接触式升降机 完整代码 前言 ...

最新文章

  1. 注意!Linux glibc再曝漏洞,可导致Linux软件劫持
  2. 200813_C指针
  3. java 程序分析题_java程序入门50题分析:002
  4. 再试译ScottGu's Posts 之 VS2008之语言特性--查询语法--New Orcas Language Feature: Query Syntax...
  5. [蓝桥杯][算法训练VIP]乘积最大(动态规划)
  6. 一个有趣的问题,讨论讨论
  7. nginx配置前端反向代理
  8. mybatis_user_guide(4) Mapper XML 文件
  9. javafx2_JavaFX 2 GameTutorial第1部分
  10. Vista系统自带IIS 7.0设置技巧详解
  11. brew 安装软件能指定文件夹吗_Mac下Homebrew安装的软件放在什么地方
  12. 美团 | 搜索多业务商品排序探索与实践
  13. NYOJ.904 search(二分查找,快速排序,结构体运用)
  14. 秒杀各大网盘的不限速大文件传输工具
  15. opencv-------高斯滤波
  16. java爬取今日头条文章
  17. 轻量级工具emoji-java处理emoji表情字符
  18. 解决网易mumu启动失败问题
  19. html 增加选项,添加标签——给定标签选项
  20. java jni udt找不到so_移植UDT到Android平台

热门文章

  1. mysql sde_sde用sql实现erase_MySQL
  2. 【技术白皮书】第二章:OCR智能文字识别回顾——自然语言文本发展历程
  3. 《孙子兵法战场机变之九变篇》
  4. 【网络工程师精华篇】华为路由交换机基础命令!
  5. 马航MH370失联六周年:他们进了时光隧道,在另一个世界好好活着
  6. 航班系统C语言程序流程图,飞机订票系统(C语言代码及流程图)
  7. Python之字符串的基本操作(很详细)
  8. modelsim仿真库
  9. 古风风格DIV+CSS模板
  10. 第五讲 二维费用的背包问题 HD FATE(二维完全背包)