学习于:野火stm32视频教程

CAN是用在汽车总线中,RS485是用在工业现场环境中。特定是传输距离远,抗干扰能力强

485由232协议改进而来,协议层不变,只是改进了物理层,因此保留了串口通讯协议应用简单的特点。

节点之间的连接示意图如下所示:

即A接A,B接B。

A,B出来的是差分信号,这样差距比较大,所以才会有前面说的特点:抗干扰能力强、传输距离远。

一般来说,封装好的485是这样的:

也就是把电阻也加入进去,然后流出两根线 A和B。

这里注意:使用485收发器后,全双工变成了半双工。这样的话编程方式就会有所改变

下面是一个简单的比较:

注意:差分、距离、多设备互相通讯

RS-485 网络只有一对差分信号线,它使用差分信号来表达逻辑,当 AB 两线间的电压差 为-6V~-2V 时表示逻辑 1,当电压差为+2V~+6V 表示逻辑 0,在同一时刻只能表达一个信 号,所以它的通讯是半双工形式的

火哥这里是A与A相连,B与B相连就OK了。没有接相互的GND

然后来看芯片的使用方法:

先看芯片的输入,即单片机这边只需要控制三个引脚,两个是txd,rxd, 还有一个引脚CS控制半双工的收发。编写程序的思路就是要发送数据的时候,把CS置为高电平,然后通过串口发送数据。发送完数据之后,马上把引脚置为低电平,这样就时刻处于接收数据的状态了。(这里记得配置这个cs引脚为推挽输出模式啊,还有开启时钟之类的,就像配置led这样,还有就是控制CS引脚的电平变化的时候,需要加上一定的延时,不然数据可能还未发送出去,然后你就改变引脚状态,那么数据就可能会发送失败之类的

这是火哥的设计。

下面这个是max485的输入:

输入高电平发送数据,低电平接收数据。

而我们实验板中使用的是ADM2687E 。其实都差不多,也就是一个485收发器。

然后是芯片的输出,由前面的示意图也可以知道只有A,B两根线。

下面是max485的示意图:

5V <--->C/4-5V 这是单片机这边的接线,5v是给芯片供电的。

RX <--->485_R

TX <--->485_D

DE/RE <--->PD11 这个就是前面提到的控制接收的CS端

输出的右边的 1,2对应的就是A,B两线了。

实物如下:

然后我先是进行开发板和电脑的通信,这里由于电脑没有485芯片,所以买了个USB转RS485的模块。接线就是单独引出485的A,B两根线即可,如下:(下面只接了两根线)

然后是程序: 值得注意的就是下面这个了

和串口发送差不多,不过就是发送前和发送后加上一些小操作。

完整代码可以去论坛找火哥的F429的固件库例程里的RS485通讯实验代码,这里就不重复上传了。

例程里的是单片机与单片机之间的485通信,而我这里是单片机的电脑的485通信,都是一样的。例程的主要功能就是发送0到256到电脑中,然后把电脑发送过来的数据通过另一个串口打印到电脑上。

下面是实验现象:

下面是485的串口

观察可以得知,这个软件是使用了一种中文编码方式,但是不可以选。估计可能是系统的GBK编码吧,反正我们得知了 数据是正常发送到电脑中(0-9 a-z A-Z....) 这里注意,有时候会不断地出现乱码,这个可以考虑 https://zhidao.baidu.com/question/1603714115854778027.html 这里说最好是共地,可是我共地后还是有这种乱码出现,然后怀疑可能是杜邦线连接的问题,但是由于器件问题,这里就暂时不考虑这个乱码先了。

然后是电脑发送数据到单片机,这里由于一开始的程序里是要达到250个字节才打印出来,所以比较尴尬,后面进行了修改,收到5个字节就打印出来。

下面是单片机的串口:

下面是16进制显示:

控制返回:

最后的正常输出:

下面是另一次485通信的记录:

先是开发板:

接线如下:

接电脑的是usb转485模块。

这里经过实验,接A,B两根线即可,接gnd也没啥影响,按理说是最好接三根线。可是我用了两根线没出现啥问题。

然后是程序:

然后是现象:

下面是32的调试串口的输出:

下面是usb转485的模块的串口:

发送的是0-ff的16进制数据。 这里接收了两次数据,一次用16进制显示,一次用串口的默认编码进行显示,按理说是平台默认的gbk编码。、

然后又试了另一根usb转485的接口线,

接线如下:

结果如下:

一切ok。

然后是到实验板和电脑的485通讯了:(前面是野火的开发板,现在是自制的实验板)

在这里极力吐槽一下:这个swd下载方式的时候,感觉需要一个规范啊,不然那几根线的连接顺序都是按自己的意愿设置,这样就都是自己杜邦线连接,总是容易松动,就很难受,每次下载到按着线。。。

首先来看我们的实验板:

PC6对应的是标号为TXD2,PC7对应的是RXD2 ,PC8对应的就是控制485收发的信号了 。注意,这里并不是32的串口2,这只是altium designer里的一个网络标号而已。

RXD2接的是ADM2687E的RXD,TXD2同理。

ADM2687E的输出的A接的是9孔的7脚,B接的是8脚。

(注意,这里的9孔串口集成了232和485转换芯片,所以可同时进行两种方式的传输)

参考: STM32官方手册 中的 STM32F4xx中文数据手册.PDF

PC6对应的是串口6的TX端,PC7对应的是串口6的RX端。这里才是单片机的串口号。

上图在第18页

这里要注意他们的时钟信号。串口1和串口6都是挂载在APB2上的,其它的串口都是挂载在APB1上的。 这里容易写错!在stm32f4xx.rcc.h文件中又定义,如下:

然后开始修改代码:

首先,修改按键的GPIO。这里使用实验板的K1按键,对应PH10. 按下按键即为低电平。

由于火哥封装地很好了,所以很多时候我们只需要修改头文件即可,但是不知道为啥这里设置了另一个按键,估计火哥也是复制过来地,所以这里直接删除,避免和实验板电路冲突。

感觉开着分屏模式来修改比较好,推荐一下。(把文件拉过去选择verical即可)

然后是led,这里就不需要led了,所以直接删除led部分。

接着是修改串口文件,由于调试的串口都是实验的串口1,所以这里就不进行修改了,而且前面也调试过了,success。 所以现在是修改前面提到的485的串口以及控制线

这里先简单介绍一下使用的485收发器: ADM2687E

引脚说明:

介绍这个的原因是要知道半双工的它什么时候收,什么时候发:

极力吐槽这个9孔中同时集合232和485两种方式的通讯,根本不方便调试,拿杜邦线接是最难受的,很不稳定。也不方便拔出来。

这里犯了一个很大的错误:

在 stm32f4xx_usart.c 文件中调用printf函数,这样就导致了printf函数的反复调用,然后就程序死了,相当于系统崩溃这样。。非常尴尬。。。现象就是串口功能无效。

然后修改之后进行调试:

一直停留在reset当中,说明485串口的数据并未发送出去。。

说明:此时发送数据寄存器不为空。

基础:使用 USART_GetFlagStatus函数来获取USART 事件标志来实现发送完成功能等待,它接收两个参数,一个是 USART,一个是事件标志。 这里我们循环检测发送数据寄存器为空这个标志,当跳出 while 循环时说明发送数据寄存 器为空这个事实。

然后拔掉接线485,发现情况一致,说明此时可能是485的A,B两线接触不良或者接错了。或者是之前就有问题了。可以参考: https://zhuanlan.zhihu.com/p/65329921 进行解决。即是时钟线得配置问题。

然后又遇到一个问题:如下图

即发送数据不正确,接收数据也不正确。 或者说根本就没接收或发送,而这只是电平得晃动导致得单码输出。

类似如下:

串口转485得指示灯:

右边绿灯为发,左边黄灯为收。

左边为没接usb转485的正确情况,右边是实验板情况。由此可见,还是串口6的配置有问题,还极有可能是中断方面的问题。

即每按一次按键,就会产生一次接收中断。然后调试按键里面运行的程序。

去掉这两个之后,有:

也就是说,是rx_en和txen引起的串口6中断。按理说应该是串口6接收到数据的时候产生接收中断的。

很明显,没有_485_RX_EN()就不会触发串口6中断的。

然后,这说明 没有 _485_TX_EN(); 就不会触发。

两个都在就触发了串口6的接收中断。

啊啊

开机后总会自动触发接收中断。

换了一个re引脚就不会触发串口6的中断了。

所以,现在结果就是: 串口6 pc6,pc7引脚接485收发器的收发引脚,pc8接控制引脚.但是现在pc8可以的置位复位可以引起串口6的接收中断,并且返回的数据为0.

然后我就换了一个引脚:既然pc8可以引起接收数据的中断,那么,我就把它改为串口的接收引脚。

实物连接图如下:(232用于调试,485用于通信,dap还用杜邦线接,难以想象这有多坑比,每次下载都按着线头,还不一定找得到设备)

程序如下:(这里已经不是大家所认识的串口6了)

#define _485_USART                             USART6
#define _485_USART_CLK                         RCC_APB2Periph_USART6
#define _485_USART_BAUDRATE                    115200#define _485_USART_RX_GPIO_PORT                GPIOC
#define _485_USART_RX_GPIO_CLK                 RCC_AHB1Periph_GPIOC
#define _485_USART_RX_PIN                      GPIO_Pin_8
#define _485_USART_RX_AF                       GPIO_AF_USART6
#define _485_USART_RX_SOURCE                   GPIO_PinSource8#define _485_USART_TX_GPIO_PORT                GPIOC
#define _485_USART_TX_GPIO_CLK                 RCC_AHB1Periph_GPIOC
#define _485_USART_TX_PIN                      GPIO_Pin_6
#define _485_USART_TX_AF                       GPIO_AF_USART6
#define _485_USART_TX_SOURCE                   GPIO_PinSource6#define _485_RE_GPIO_PORT         GPIOC
#define _485_RE_GPIO_CLK            RCC_AHB1Periph_GPIOC
#define _485_RE_PIN                     GPIO_Pin_7#define _485_INT_IRQ                      USART6_IRQn
#define _485_IRQHandler                         USART6_IRQHandler

下面是主程序:

下面是485串口:

下面是232串口:

不过有一个问题就是开机后总是会自动按下按键,然后触发数据发送。连续三次。然后是这里不能通过485接收数据。只能发送数据。

猜测:莫非这里是由于tx引脚配置正确,也就是pc6是正确的,然后pc7也是正确的收发控制端。就pc8不是接收引脚,所以才导致了这个问题?

然后试了另一种配置pc5为rx,pc6为tx,pc7为控制端。

不能发送数据也不能接收数据,说明我们脱离pc8的猜想是错的。

然后另一种尝试:rx-pc6,tx-pc8, ec-pc7 现象如下:

情况和第一种一样,也就是说第一和第三种情况一样,能向485发送数据,但是不能接收485发送过来的数据,也就是不能引起串口6中断。

然后是第四种配置:pc7为rx,pc8为tx,pc6为en

结果就是485这边收到的数据都是0 。和前面一样的情况。

值得注意的是这里一开始会进入接收中断。。

然后再尝试另一种配置:pc6-rx pc 7-tx pc8-en

每按一次都可以进入接收中断。

8--7--6

往485发送或者接收都是返回一个0

7-6-8

现在是只要8和6在txd和rxd的引脚上,那么就能向485模块发送数据。但是不能接收数据。那个使能引脚是什么都无所谓。简直心态爆炸。。。

然后发现:

把这两个引脚都不需要,还是可以向485发送数据,心态更加爆炸了。

啊啊

写着升级固件的板子是需要升级4g模块的固件的。所以4g模块不能使用,但是其它模块都能正常使用。 没有写的则是可以使用全部功能。

485通讯线是几芯的_RS485协议 电脑与stm32单片机通信 keil编程 在485的硬件错误中徘徊...相关推荐

  1. 485通讯线是几芯的_rs485总线是啥线?rs485总线是几芯线

    RS-485是串行数据接口规范,由电子工业协会拟定并发布的,1983年在RS-422根底上拟定了RS-485规范,添加了多点.双向通讯才调,即容许多个发送器联接到同一条总线上,一同添加了发送器的驱动才 ...

  2. 485通讯线是几芯的_485总线,通讯线的连接

    1 . 485 总线应采用什么样的通讯线 必须采用国际上通行的屏蔽双绞线. 我们推荐用的屏蔽双绞线的型号为 RVSP2*0.5 (二芯屏 蔽双绞线, 每芯由 16 股的 0.2mm 的导线组成) . ...

  3. 485通讯线是几芯的_小令老师说门禁| 为什么485门禁必然会取代韦根?

    韦根和485(RS485)是两种不同的通讯协议.通讯协议解决的是通讯双方数据如何传输和如何控制的问题.对于门禁而言,指的是读头和控制器之间的通讯. 传统门禁很多采用韦根通讯方式,而现在485更为普及, ...

  4. 简单使用示波器485通讯抓波形

    串口通讯经常要用到示波器抓波形分析数据,很多人都熟悉232通讯抓波形,但是不清楚要怎么给485抓包,其实很简单 首先先准备一个120欧和一个33欧的电阻(没有阻值一样的可以使用阻值差不多的) 然后按下 ...

  5. java 485通讯_CAKJ-963U3-KT带485通讯上下限报警智能型仪表

    W(100℃)大差值<12mK,W(231928℃)大差值<18mK,W(419527℃)大差值<25mK,④全新出厂的二等金属管标准铂电阻WZPB-9和修理后的温度计在上限温度(或 ...

  6. 485通讯的校验和_组态王与西门子S71200PLC无线Modbus通讯

    组态王软件与S7-1200无线Modbus通信方案 本方案是组态软件与西门子S7-1200进行无线MODBUS 通信的实现方法.此方案可以作为西门子S7-1200与组态软件的无线MODBUS 通信实例 ...

  7. 三菱触摸屏通讯错误_三菱触摸屏插上通讯线直接黑屏,老司机手把手教你解决触摸屏黑屏...

    三菱触摸屏大多数情况下,是插上通讯线后不会黑屏的,然后今天却遇到触摸屏插上通讯线就直接黑屏.我试过好多次,没有办法就请教三菱触摸屏做得比久的老司机们,跟他们一说.他们用排除法叫我一步步去排查解决,今天 ...

  8. 常见的通讯协议总结(USART、IIC、SPI、485、CAN)

    目录 一.通讯的基本概念 1.串行通讯 2.并行通讯 3.串行通讯与并行通讯对比 4.传输模式(单工.半双工.全双工) 二.USART-串口通讯 1.物理层 2.协议层 (1)波特率 (2)起始和停止 ...

  9. 485通讯协议在java中的应用

    485通讯协议在java中的应用(一) 前言 之前我博客中有提到,在javaWeb应用系统中进行串口通讯的实现. 博客地址:java串口通讯,可实现javaWeb页面同时控制多个串口,有demo 很多 ...

最新文章

  1. 文巾解题 1035. 不相交的线
  2. java swing 禁用鼠标事件_Java学习笔记:swing中树控件,设置树节点的图标,按钮美化,鼠标事件,禁止鼠标双击...
  3. 构建器模式:适用于代码,适用于测试
  4. 公网可用的RTMP、RTSP测试地址(更新于2021年3月)
  5. Nginx 禁止猜测路径上传恶意代码
  6. 54 岁的当当李国庆“杀入”区块链!
  7. 分析微信小程序生成二维码接口报错41030: invalid page hint
  8. 什么是市盈率(PE)?
  9. swagger工具编写接口文档
  10. 在ISE中设置字体大
  11. 详述numpy中的np.random.rand()、np.random.randn()、np.random.randint()、np.random.uniform()函数的用法
  12. 蓝桥杯 2014-4 大衍数列
  13. Docker三剑客之Docker compose多容器管理(nginx+haproxy实现负载均衡)
  14. VVC/H.266帧间模式(二):Merge mode with MVD (MMVD)
  15. sql语句查询最近七天 三十天 数据
  16. 如何在Mirth Connect中创建和调用自定义Java代码
  17. 微信公众号---报名系统
  18. CSS3 实现文字渐变色
  19. python学习笔记(六)——类的初始化(__init__)、类属性和类方法 和 对象
  20. 从意思准度和重叠性角度看待中文、…

热门文章

  1. 年度神作!这本Python 3.6的书刷爆朋友圈,网友:太香!
  2. 如何在 Raspberry Pi 上快速安装 Oracle Linux ?
  3. 首批共享单车死于 2019
  4. @程序员:别人身边的小姐姐是这样来的,你能学学吗
  5. 码农翻身之编程语言的巅峰
  6. Java 10 正式发布!时隔 6 月带来 109 项新特性
  7. 苹果收购Siri的八年,是成还是败?
  8. oracle执行策略是什么意思,郁闷的问题:oracle pl/sql 和 pro c中的执行策略
  9. java备忘录模式应用场景_Java描述设计模式(24):备忘录模式
  10. centos linux asp,CentOS 7.4 下 如何部署 AspNetCore 结合 consul