RS485是半双工,RS422是全双工。
A接A,B接B,不要交叉。
RS485标准是4根线,定义如下:
RO: Receiver Output: If A > B by 200mV, RO will be high;If A < B by 200mV, RO will be low.2
/RE: 接收器输出使能。当RE为低电平时,RO有效;当RE为高电平时,RO为高阻状态。
RI: Driver Input. A low on DI forces output Y low and output Z high.
Similarly, a high on DI forces output Y high and output Z low.
DE: DI enable(enable input(read)).
实际上接三根线就可以了。RO/RE用一根线。
但在工程实践中,一般都只有D+/D-或A/B两根线,如何实现双工通信呢?答案就是:通过不同的命令码来区分。
举例:
读温控器开关: 01(addr) 03(type:read) 0001(reg-addr) 0001(读长度) D5CA(CRC16)
写温控器开关: 01(addr) 06(type:write) 0001(reg-addr) 0001(写的值) 19CA (CRC16)
调试中碰到的问题:
问题1:
先是:received invalid response to Modbus query
之后很快变成:message time out
原因:485标准定义是5v电平,485设备供电用DC-5V,但STM32用的是DC-3.3V。这样通信就不可靠。
解决:没有换接口电平转换芯片,只是把上下拉电阻去掉了。
问题2:
STM32一次只能接收一个字节!!
原因:STM32接收中断是比较关键的,解决了中断接收的问题,就可以接收多个字节。
一些调试过程的打印:
FreeRTOS 7.6.0 for STM32F030
Build date: Aug 4 2017 15:08:22
The current time is : 08:08:08
The current alarm is : 08:08:50
rs485 send[8]:
010300000001840A
uart2 recv[5]:
01 83 02 C0 F1 //
rs485 send[]:
010300010001D5CA
uart2 recv[7]:
01 03 02 00 01 79 84
rs485 read val=0x0001=1
holleywell,ret=1
关键字:STM32 RS485 调试过程
引用地址:
STM32的RS485调试过程记录
推荐阅读最新更新时间:2024-11-11 15:38
STM32 自定义延时函数
在stm32调试过程中加入一个延时,有两种方式:一种是纯计数方式,另一种是使用系统计数器的方式。 现使用系统计数器产生中断的方式实现,查阅STM32的编程手册可知,STM32有一个24bit的系统计时器,并有STK_CTRL、STK_LOAD、STK_VAL、STK_CALIB寄存器供读写配置。 而CORTEX_M3有提供了一些函数可以供我们调用来控制这几个寄存器。 在编写延时函数时需要的库函数: /** brief System Tick Configuration details Initializes the System Timer and its interrupt, and sta
[单片机]
STM32 驱动无线NRF24L01 完成串口数据传输
2401 一个简单的SPI 接口的 2.4G 射频模块 淘宝价20¥,DIY 的17¥ ,算是廉价。 这个版本的稳定修正 http://ntn314.blog.163.com/blog/static/16174358420106211118944/ 接口CMOS电平3.3V STM32 可直接连接。接受完成 发送完成 出错 都有IRQ 低电平中断产生。程序中 我将其连接至一IO口在外部中断中处里各类事件 但也发现这种处理方式并不是特别灵活,或许直接判断更加灵活。 NRF20L01一次可以传输 1~32个字节比较灵活。最初我是根据字符串长来不停的转换每次传输的长度,这样做十分麻烦最后用截取有效串长的方法实现效果很好。
[单片机]
stm32+uln2003驱动步进电机程序(28BYJ-48)
今天,接到一个任务,采用stm32驱动步进电机,已经有了驱动模块了。所以不再采用PWM方式,直接用软件编写。 我也是初学,仅供参考。 1、管脚接线 // IN4: PC9 d // IN3: PC8 c // IN2: PC7 b // IN1: PC6 a 电源接开发板电源。地接地(简直是废话)。 2、定义正转反转数组 uint16_t phasecw ={0x0200,0x0100,0x0080,0x0040};// D-C-B-A uint16_t phaseccw ={0x0040,0x0080,0x0100,0x0200};// A-B-C-D 说明一下,数组里面的值,就是对应的GPIO口的地址。根据自己
[单片机]
STM32 FSMC总线深入研究
由于CPU与FPGA通信的需要,以及对8080总线的熟悉,首选采用了STM32的FSMC总线,作为片间通信接口。FSMC能达到16MHz的写入速度,理论上能写20fps的1024*768的图片哈哈。(当然实际上是不可能的,就算是DMA传输,数据源也跟不上,实际上刷模拟的图片每秒10fps,刷的很high)当然这不是本篇的要点,这里主要研究STM32的FSMC接口,将速度提升到极限。 1. FSMC协议分析 如下为ILI9325的8080接口的协议 CS(片选信号):低电平片选有效,高电平失能(默认为高:失能) RS(数据寄存器):低电平写寄存器,高电平写数据(默认为高:写数据)FSMC默认为低。。。。 RD(读信号)
[单片机]
stm32 字符发送函数注意点
一、发送函数 void UART2_Put_Char(u8 data) { USART_SendData(USART2, (uint16_t) data); while(USART_GetFlagStatus(USART2, USART_FLAG_TC)!= SET) delay_10us(1); } 二、说明 1、上述代码中while循环功能是查询是否发送完成,如果没有完成则延时; 2、也就是说在进行字符串发送时,发送第二个字符时一定要注意第一个字符是否发送完成,我之前是没有这种意识的。虽然没有出过问题,但是以后要注意。
[单片机]
STM32堆和栈(Heap & Stack)及SRAM存储使用
编译一个程序,出现下面的信息: 明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间。让我们打开map文件: 可以看到每个文件所使用的SRAM大小,比如delay文件使用了4个字节,地址从0x20000014到0x20000017。其中可以看到HEAP和STACK占了大头,分别占了0x00000200和0x00000400的空间。STACK的起始地址是0x20000360,大小是0x00000400,那么最后的地址是0x20000760,刚好等于1888=0x760字节。于是我们就知道SRAM空间用来存放了什么东西了:1、各个文件中
[单片机]
STM32仿真器ST-Link仿真
本仿真器是ST-Link ST仿真有硬件和软件仿真两种,一个是在硬件上跑,一个是软件模拟,前者真实性高,后者某些方面精确,比如计算延迟,我今天分享硬件仿真。 就是在开始的DEBUG选项出选右边的 选择好之后,进入仿真界面 进入仿真界面 有用的也就下面这一行有用 我主要讲这几个最左边RST是复位, 第二个是程序运行,第三个是停止程序运行, 四到七是程序一步一步执行的不同方式, 第八个是定位到光标程序处, 后面几个是一些逻辑窗口 这三个对应的是命令输入窗口,汇编窗口(汇编里面包含地址),标识符窗口(用来展示程序里面所有的的函数和成员变量,可以通过这里找到需要观察的变量,然后添加到窗口中,观察程序运行中变量的变化,方便调试程序)
[单片机]
STM32CubeMX | 37 - 使用RS485总线进行双板通信(SP3485)
本篇详细的记录了如何使用STM32CubeMX配置 STM32F407ZGT6 使用 RS485 总线与另一个开发板之间通信。 0. RS485总线协议简述 RS485总线的特点及应用场合 RS-485 通讯协议由 RS-232 协议改进而来,将物理层改为了差分信号进行传输,所以具备抗干扰能力强、传输距离远的特点,广泛应用于噪声干扰较大的工业控制环境中。 RS485总线的物理层 RS485总线网络拓扑结构如图: 其中RS485收发器的作用是将普通TTL电平信号转换为差分信号,即总线每个时刻表达的逻辑由485-A和485-B的电平共同决定,属于半双工通信,判断逻辑为:当 AB 两线间的电压差为 -6V~-2V 时表示逻辑
[单片机]