485通讯线是几芯的_RS485协议 电脑与stm32单片机通信 keil编程 在485的硬件错误中徘徊...
学习于:野火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的硬件错误中徘徊...相关推荐
- 485通讯线是几芯的_rs485总线是啥线?rs485总线是几芯线
RS-485是串行数据接口规范,由电子工业协会拟定并发布的,1983年在RS-422根底上拟定了RS-485规范,添加了多点.双向通讯才调,即容许多个发送器联接到同一条总线上,一同添加了发送器的驱动才 ...
- 485通讯线是几芯的_485总线,通讯线的连接
1 . 485 总线应采用什么样的通讯线 必须采用国际上通行的屏蔽双绞线. 我们推荐用的屏蔽双绞线的型号为 RVSP2*0.5 (二芯屏 蔽双绞线, 每芯由 16 股的 0.2mm 的导线组成) . ...
- 485通讯线是几芯的_小令老师说门禁| 为什么485门禁必然会取代韦根?
韦根和485(RS485)是两种不同的通讯协议.通讯协议解决的是通讯双方数据如何传输和如何控制的问题.对于门禁而言,指的是读头和控制器之间的通讯. 传统门禁很多采用韦根通讯方式,而现在485更为普及, ...
- 简单使用示波器485通讯抓波形
串口通讯经常要用到示波器抓波形分析数据,很多人都熟悉232通讯抓波形,但是不清楚要怎么给485抓包,其实很简单 首先先准备一个120欧和一个33欧的电阻(没有阻值一样的可以使用阻值差不多的) 然后按下 ...
- java 485通讯_CAKJ-963U3-KT带485通讯上下限报警智能型仪表
W(100℃)大差值<12mK,W(231928℃)大差值<18mK,W(419527℃)大差值<25mK,④全新出厂的二等金属管标准铂电阻WZPB-9和修理后的温度计在上限温度(或 ...
- 485通讯的校验和_组态王与西门子S71200PLC无线Modbus通讯
组态王软件与S7-1200无线Modbus通信方案 本方案是组态软件与西门子S7-1200进行无线MODBUS 通信的实现方法.此方案可以作为西门子S7-1200与组态软件的无线MODBUS 通信实例 ...
- 三菱触摸屏通讯错误_三菱触摸屏插上通讯线直接黑屏,老司机手把手教你解决触摸屏黑屏...
三菱触摸屏大多数情况下,是插上通讯线后不会黑屏的,然后今天却遇到触摸屏插上通讯线就直接黑屏.我试过好多次,没有办法就请教三菱触摸屏做得比久的老司机们,跟他们一说.他们用排除法叫我一步步去排查解决,今天 ...
- 常见的通讯协议总结(USART、IIC、SPI、485、CAN)
目录 一.通讯的基本概念 1.串行通讯 2.并行通讯 3.串行通讯与并行通讯对比 4.传输模式(单工.半双工.全双工) 二.USART-串口通讯 1.物理层 2.协议层 (1)波特率 (2)起始和停止 ...
- 485通讯协议在java中的应用
485通讯协议在java中的应用(一) 前言 之前我博客中有提到,在javaWeb应用系统中进行串口通讯的实现. 博客地址:java串口通讯,可实现javaWeb页面同时控制多个串口,有demo 很多 ...
最新文章
- 文巾解题 1035. 不相交的线
- java swing 禁用鼠标事件_Java学习笔记:swing中树控件,设置树节点的图标,按钮美化,鼠标事件,禁止鼠标双击...
- 构建器模式:适用于代码,适用于测试
- 公网可用的RTMP、RTSP测试地址(更新于2021年3月)
- Nginx 禁止猜测路径上传恶意代码
- 54 岁的当当李国庆“杀入”区块链!
- 分析微信小程序生成二维码接口报错41030: invalid page hint
- 什么是市盈率(PE)?
- swagger工具编写接口文档
- 在ISE中设置字体大
- 详述numpy中的np.random.rand()、np.random.randn()、np.random.randint()、np.random.uniform()函数的用法
- 蓝桥杯 2014-4 大衍数列
- Docker三剑客之Docker compose多容器管理(nginx+haproxy实现负载均衡)
- VVC/H.266帧间模式(二):Merge mode with MVD (MMVD)
- sql语句查询最近七天 三十天 数据
- 如何在Mirth Connect中创建和调用自定义Java代码
- 微信公众号---报名系统
- CSS3 实现文字渐变色
- python学习笔记(六)——类的初始化(__init__)、类属性和类方法 和 对象
- 从意思准度和重叠性角度看待中文、…
热门文章
- 年度神作!这本Python 3.6的书刷爆朋友圈,网友:太香!
- 如何在 Raspberry Pi 上快速安装 Oracle Linux ?
- 首批共享单车死于 2019
- @程序员:别人身边的小姐姐是这样来的,你能学学吗
- 码农翻身之编程语言的巅峰
- Java 10 正式发布!时隔 6 月带来 109 项新特性
- 苹果收购Siri的八年,是成还是败?
- oracle执行策略是什么意思,郁闷的问题:oracle pl/sql 和 pro c中的执行策略
- java备忘录模式应用场景_Java描述设计模式(24):备忘录模式
- centos linux asp,CentOS 7.4 下 如何部署 AspNetCore 结合 consul