OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13933|回复: 23

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第二十九章 485实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-17 23:00:39 | 显示全部楼层 |阅读模式


第二十九章 485 实验 

本章我们将向大家介绍如何使用STM32的串口实现485通信(半双工)。在本章中,我们将使用STM32的串口2来实现两块开发板之间的485通信,并将结果显示在TFTLCD模块上。本章分为如下几个部分:

29.1 485 简介

29.2 硬件设计

29.3 软件设计

29.4 下载验证 

29.1 485 简介

485(一般称作RS485/EIA-485)是隶属于OSI模型物理层的电气特性规定为2线,半双工,多点通信的标准。它的电气特性和RS-232大不一样。用缆线两端的电压差值来表示传递信号。RS485仅仅规定了接受端和发送端的电气特性。它没有规定或推荐任何数据协议。

RS485的特点包括:

1)              接口电平低,不易损坏芯片。RS485的电气特性:逻辑“1”以两线间的电压差为+(2~6)V

表示;逻辑“0”以两线间的电压差为-(2~6)V表示。接口信号电平比RS232降低了,不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL 电路连接。

2)              传输速率高。10米时,RS485的数据最高传输速率可达35Mbps,在1200m时,传输

       速度可达100Kbps

3)              抗干扰能力强。RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力

增强,即抗噪声干扰性好。

4)              传输距离远,支持节点多。RS485总线最长可以传输1200m以上(速率≤100Kbps

一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。

RS485推荐使用在点对点网络中,线型,总线型,不能是星型,环型网络。理想情况下RS485需要2个匹配电阻,其阻值要求等于传输电缆的特性阻抗(一般为120Ω)。没有特性阻抗的话,当所有的设备都静止或者没有能量的时候就会产生噪声,而且线移需要双端的电压差。没有终接电阻的话,会使得较快速的发送端产生多个数据信号的边缘,导致数据传输出错。485推荐的连接方式如图29.1.2所示:

29.1.2 RS485连接

       在上面的连接中,如果需要添加匹配电阻,我们一般在总线的起止端加入,也就是主机和设备4上面各加一个120Ω的匹配电阻。

由于RS485具有传输距离远、传输速度快、支持节点多和抗干扰能力更强等特点,所以RS485有很广泛的应用。

战舰STM32开发板采用SP3485作为收发器,该芯片支持3.3V供电,最大传输速度可达10Mbps,支持多达32个节点,并且有输出短路保护。该芯片的框图如图29.1.2所示:


29.1.2 SP3485框图

       图中AB总线接口,用于连接485总线。RO是接收输出端,DI是发送数据收入端,RE是接收使能信号(低电平有效),DE是发送使能信号(高电平有效)。

本章,我们通过该芯片连接STM32的串口2,实现两个开发板之间的485通信。本章将实现这样的功能:通过连接两个战舰STM32开发板的RS485接口,然后由KEY0控制发送,当按下一个开发板的KEY0的时候,就发送5个数据给另外一个开发板,并在两个开发板上分别显示发送的值和接收到的值。

本章,我们只需要配置好串口2,就可以实现正常的485通信了,串口2的配置和串口1基本类似,只是串口的时钟来自APB1,最大频率为36Mhz

29.2 硬件设计

本章要用到的硬件资源如下:

1)  指示灯DS0

2)  KEY0按键

3) TFTLCD模块

4) 串口2

5) RS485收发芯片SP3485

前面3个之前都已经详细介绍过了,这里我们介绍SP3485和串口2的连接关系,如图29.2.1所示:

29.2.1 STM32SP3485连接电路图

       从上图可以看出:STM32的串口2通过P9端口设置,连接到SP3485,通过STM32PG9控制SP3485的收发,当PG9=0的时候,为接收模式;当PG9=1的时候,为发送模式。这里注意,我们要设置好开发板上P9排针的连接,通过跳线帽将PA2PA3分别连接到485T485R上面,如图29.2.2所示:

29.2.2 硬件连接示意图

       最后,我们用2根导线将两个开发板RS485端子的AABB连接起来。这里注意不要接反了(AB),接反了会导致通讯异常!!

29.3 软件设计

打开上一章的工程,首先在HARDWARE文件夹下新建一个RS485的文件夹,然后新建一个rs485.crs485.h的文件保存在RS485文件夹下,并将RS485文件夹加入头文件包含路径。

打开rs485.c文件,输入如下代码:

#include "sys.h"               

#include "rs485.h" 

#include "delay.h"

#ifdef EN_USART2_RX     //如果使能了接收        

//接收缓存区       

u8 RS485_RX_BUF[64];     //接收缓冲,最大64个字节.

//接收到的数据长度

u8 RS485_RX_CNT=0;  

void USART2_IRQHandler(void)

{

       u8 res;        

       if(USART2->SR&(1<<5))//接收到数据

       {    

              res=USART2->DR;                      

              if(RS485_RX_CNT<64)

              {

                     RS485_RX_BUF[RS485_RX_CNT]=res;            //记录接收到的值

                     RS485_RX_CNT++;                                         //接收数据增加1

              }

       }                                                                           

}

#endif                                                                   

//初始化IO 串口2

//pclk1CLK1时钟频率(Mhz)

//bound:波特率       

void RS485_Init(u32 pclk1,u32 bound)

{     

       float temp;

       u16 mantissa;

       u16 fraction;     

       temp=(float)(pclk1*1000000)/(bound*16);  //得到USARTDIV

       mantissa=temp;                                       //得到整数部分

       fraction=(temp-mantissa)*16;                    //得到小数部分    

    mantissa<<=4;

       mantissa+=fraction;

       RCC->APB2ENR|=1<<8;                        //使能PORTG口时钟 

      GPIOG->CRH&=0XFFFFFF0F;                //IO状态设置

       GPIOG->CRH|=0X00000030;                    //IO状态设置    

       RCC->APB2ENR|=1<<2;                        //使能PORTA口时钟 

       GPIOA->CRL&=0XFFFF00FF;                 //IO状态设置

       GPIOA->CRL|=0X00008B00;                    //IO状态设置  

       RCC->APB1ENR|=1<<17;                       //使能串口时钟             

       RCC->APB1RSTR|=1<<17;                     //复位串口2

       RCC->APB1RSTR&=~(1<<17);                 //停止复位             

       //波特率设置

      USART2->BRR=mantissa;                         // 波特率设置      

       USART2->CR1|=0X200C;                        //1位停止,无校验位.

#ifdef EN_USART2_RX                                  //如果使能了接收

       //使能接收中断

       USART2->CR1|=1<<8;                           //PE中断使能

       USART2->CR1|=1<<5;                           //接收缓冲区非空中断使能            

       MY_NVIC_Init(3,3,USART2_IRQChannel,2);//2,最低优先级

#endif

       RS485_TX_EN=0;                                    //默认为接收模式 

}

//RS485发送len个字节.

//buf:发送区首地址

//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)

void RS485_Send_Data(u8 *buf,u8 len)

{

       u8 t;

       RS485_TX_EN=1;                                    //设置为发送模式

      for(t=0;t<len;t++)                                     //循环发送数据

       {

              while((USART2->SR&0X40)==0);      //等待发送结束             

              USART2->DR=buf[t];

       }    

       while((USART2->SR&0X40)==0);             //等待发送结束    

       RS485_RX_CNT=0;       

       RS485_TX_EN=0;                                    //设置为接收模式 

}

//RS485查询接收到的数据

//buf:接收缓存首地址

//len:读到的数据长度

void RS485_Receive_Data(u8 *buf,u8 *len)

{

       u8 rxlen=RS485_RX_CNT;

       u8 i=0;

       *len=0;                 //默认为0

       delay_ms(10);        //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束

       if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了

       {

              for(i=0;i<rxlen;i++) buf=RS485_RX_BUF;              

              *len=RS485_RX_CNT;         //记录本次数据长度

              RS485_RX_CNT=0;             //清零

       }

}

此部分代码总共4个函数,其中RS485_Init函数为485通信初始化函数,其实基本上就是在配置串口2,只是把PG9也顺带配置了,用于控制SP3485的收发。同时如果使能中断接收的话,会执行串口2的中断接收配置。USART2_IRQHandler函数用于中断接收来自485总线的数据,将其存放在RS485_RX_BUF里面。最后RS485_Send_DataRS485_Receive_Data这两个函数用来发送数据到485总线和读取从485总线收到的数据,都比较简单。

保存rs485.c,并把该文件加入HARDWARE组下面,然后我们打开rs485.h在里面输入如下代码:

#ifndef __RS485_H

#define __RS485_H                   

#include "sys.h"                                                             

extern u8 RS485_RX_BUF[64];                 //接收缓冲,最大64个字节

extern u8 RS485_RX_CNT;                     //接收到的数据长度

//模式控制

#define RS485_TX_EN        PGout(9)        //485模式控制.0,接收;1,发送.

//如果想串口中断接收,请不要注释以下宏定义

#define EN_USART2_RX    1                   //0,不接收;1,接收.                                           

void RS485_Init(u32 pclk2,u32 bound);

void RS485_Send_Data(u8 *buf,u8 len);

void RS485_Receive_Data(u8 *buf,u8 *len);            

#endif       

在这里,我们开启了串口2的中断接收,保存rs485.h。最后,我们在test.c里面,修改main函数如下:

int main(void)

{           

       u8 key; u8 cnt=0;

       u8 i=0,t=0;    

       u8 rs485buf[5];

      Stm32_Clock_Init(9);    //系统时钟设置

       uart_init(72,9600);      //串口初始化为9600

       delay_init(72);                  //延时初始化

       LED_Init();                 //初始化与LED连接的硬件接口

       LCD_Init();                  //初始化LCD

       usmart_dev.init(72);      //初始化USMART       

       KEY_Init();                  //按键初始化             

       RS485_Init(36,9600);    //初始化RS485

      POINT_COLOR=RED;  //设置字体为红色

       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   

       LCD_ShowString(60,70,200,16,16,"RS485 TEST"); 

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/9");      

       LCD_ShowString(60,130,200,16,16,"KEY0:Send");  //显示提示信息    

      POINT_COLOR=BLUE;                                          //设置字体为蓝色   

       LCD_ShowString(60,150,200,16,16,"Count:");          //显示当前计数值 

       LCD_ShowString(60,170,200,16,16,"Send Data:");    //提示发送的数据 

       LCD_ShowString(60,210,200,16,16,"Receive Data:");       //提示接收到的数据

       while(1)

       {

              key=KEY_Scan(0);

              if(key==KEY_RIGHT)//KEY0按下,发送一次数据

              {

                     for(i=0;i<5;i++)

                     {

                            rs485buf=cnt+i;//填充发送缓冲区

                            LCD_ShowxNum(60+i*32,190,rs485buf,3,16,0X80);    //显示数据

                    }

                     RS485_Send_Data(rs485buf,5);//发送5个字节                                                                     }           

              RS485_Receive_Data(rs485buf,&key);

              if(key)//接收到有数据

              {

                     if(key>5)key=5;//最大是5个数据.

                    for(i=0;i<key;i++)LCD_ShowxNum(60+i*32,230,rs485buf,3,16,0X80);

                     //显示数据

             }

              t++;

              delay_ms(10);

              if(t==20)

              {

                     LED0=!LED0;//提示系统正在运行    

                     t=0; cnt++;                  

                     LCD_ShowxNum(60+48,150,cnt,3,16,0X80);     //显示数据

              }              

       }

}

此部分代码,我们主要关注下RS485_Init(36,9600),这里用的是36,而不是72,是因为APB1的时钟是36Mhz,故是36,而串口1的时钟来自APB2,是72Mhz的时钟,所以这里和串口1的设置是有点区别的。cnt是一个累加数,一旦KEY_RIGHTKEY0)按下,就以这个数位基准连续发送5个数据。当485总线收到数据的时候,就将收到的数据直接显示在LCD屏幕上。

29.4 下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上(注意要2个开发板都下载这个代码哦),得到如图29.4.1所示:



29.4.1 程序运行效果图

伴随DS0的不停闪烁,提示程序在运行。此时,我们按下KEY0就可以在另外一个开发板上面收到这个开发板发送的数据了。如图29.4.2所示:


29.4.2 RS485实验测试图片

       上图中,左侧的图片来自开发板A,发送了5个数据,右侧的图片来自开发板B,接收到了来自开发板A5个数据。

本章介绍的485总线时通过串口控制收发的,我们只需要将P9的跳线帽稍作改变,该实验就变成了一个RS232串口通信实验了,通过对接两个开发板的RS232接口,即可得到同样的实验现象,有兴趣的读者可以实验一下。

 

实验24 485实验.rar

126.04 KB, 下载次数: 1800

《STM32开发指南》第二十九章 485实验.rar

643.29 KB, 下载次数: 1845

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2014-5-29 20:17:59 | 显示全部楼层
原子哥,这个可以通过修改代码后,用一根USB线的DA+,DA-和A,B线相连,然后把USB接电脑,并利用串口调试助手像RS232一样实现发送和接收的功能吗?手头只有一块战舰开发板,做不了实验呀。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-5-29 22:30:17 | 显示全部楼层
回复【2楼】华南虎:
---------------------------------
 不能呢.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

111

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2013-5-28
在线时间
24 小时
发表于 2014-5-30 08:26:18 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
杯催,难怪我用电脑的USB接收发送不行。但是我看其他家的开发板可以用开发板的485跟电脑通讯,芯片也是一样的,这是为什么呢?求解。我的程序是在战舰上实验通过了的RS232程序去改的,在发送和接收那里加了PG9引脚高低电平(使能发送和接收),我怕是我接线接错(发送和接收线)了,把线A和B接DA+,DA-对调,两种可能都试了,都不行。
学习单片机编程贵在坚持,无论多难的问题都有不轻易放弃的原则,坚持着去解决它,相信你总会找到解决方法的。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-3-20
在线时间
0 小时
发表于 2014-8-21 11:50:36 | 显示全部楼层
这个代码有个问题,就是当执行到RS485_Send_Data();函数的时候,运行RS485_TX_EN=0;这条语句会向发送 0x00 。。。这是什么情况?!怎么样将这个多发送的0x00去掉呢?

回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2013-3-20
在线时间
0 小时
发表于 2014-8-21 11:56:44 | 显示全部楼层
即使前后延时也是一样的效果!
回复 支持 反对

使用道具 举报

1

主题

3

帖子

0

精华

新手入门

积分
27
金钱
27
注册时间
2014-8-18
在线时间
0 小时
发表于 2014-9-3 19:19:01 | 显示全部楼层
原子哥,一直想不明白,跳线帽连接为什么不是(USART2 RX)PA3和(USART2 TX)PA2 分别连接到485T和485R?不是一方的接收端连接另一方的发送端吗?求教啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2014-9-3 23:52:10 | 显示全部楼层
回复【7楼】sunshinegrass:
---------------------------------
这个看你如何看待引脚所面向的对象了。
比如STM32的RX,对STM32自己来说,是RX,但是对外部的芯片来说,却是应该接TX。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-1-11
在线时间
0 小时
发表于 2015-1-25 15:26:13 | 显示全部楼层
RO是接收输出端,DI是发送数据收入端
这句话不明白呢
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2015-1-11
在线时间
0 小时
发表于 2015-1-25 16:06:39 | 显示全部楼层
是否可以这样理解,RO对于STM32是接收,对外部芯片来说是输出
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2015-1-25 23:48:00 | 显示全部楼层
回复【10楼】51arm:
---------------------------------
这个你能正确做出效果就行.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2015-7-15
在线时间
0 小时
发表于 2015-7-22 08:40:05 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
mini开发板不能做这个实验吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2015-7-22 23:01:23 | 显示全部楼层
回复【12楼】ZeroHH:
---------------------------------
不能。除非你外加硬件。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-12-8
在线时间
0 小时
发表于 2015-9-14 20:20:54 | 显示全部楼层
RS485_Receive_Data(rs485buf,&key);

              if(key)//接收到有数据

              {

                     if(key>5)key=5;//最大是5个数据.

                    for(i=0;i<key;i++)LCD_ShowxNum(60+i*32,230,rs485buf,3,16,0X80);

                     //显示数据

             }
原子哥这边的key不理解怎么回事儿?求解?>
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2014-12-8
在线时间
0 小时
发表于 2015-9-14 21:47:36 | 显示全部楼层
RS485_Receive_Data(rs485buf,&key);这个key怎么变成地址了呢??????
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2015-9-14 23:25:45 | 显示全部楼层
回复【15楼】南瓜wyy:
---------------------------------
因为参数是指针类型
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-3-9
在线时间
1 小时
发表于 2015-10-12 15:49:31 | 显示全部楼层
原子哥  求教一下  为什么我下载了这个485的程序  准备烧写到开发板的时候出现    error:flash download  failed  - “cortex-M3”  以前都不会这样 都可以烧啊???
学无止境
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-6-3
在线时间
8 小时
发表于 2015-11-6 09:03:41 | 显示全部楼层
回复【17楼】1343114655@qq.com:
---------------------------------
//RS485查询接收到的数据

//buf:接收缓存首地址

//len:读到的数据长度

void RS485_Receive_Data(u8 *buf,u8 *len)

{

       u8 rxlen=RS485_RX_CNT;

       u8 i=0;

       *len=0;                 //默认为0

       delay_ms(10);        //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束

       if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了

       {

              for(i=0;i<rxlen;i++) buf=RS485_RX_BUF;              

              *len=RS485_RX_CNT;         //记录本次数据长度

              RS485_RX_CNT=0;             //清零

       }

}您好,请问这段示例代码中“ if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了”这句话是什么意思,之前已经给rxlen赋值为RS485_RX_CNT了,他们俩肯定是相等的啊,怎么就能表示接收到了数据,且接收完成了,怎么都想不明白,求指导!>
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-6-3
在线时间
8 小时
发表于 2015-11-6 09:04:06 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
//RS485查询接收到的数据 

//buf:接收缓存首地址 

//len:读到的数据长度 

void RS485_Receive_Data(u8 *buf,u8 *len) 



       u8 rxlen=RS485_RX_CNT; 

       u8 i=0; 

       *len=0;                 //默认为0 

       delay_ms(10);        //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束 

       if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了 

       { 

              for(i=0;i<rxlen;i++) buf=RS485_RX_BUF;               

              *len=RS485_RX_CNT;         //记录本次数据长度 

              RS485_RX_CNT=0;             //清零 

       } 

}您好,请问这段示例代码中“ if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了”这句话是什么意思,之前已经给rxlen赋值为RS485_RX_CNT了,他们俩肯定是相等的啊,怎么就能表示接收到了数据,且接收完成了,怎么都想不明白,求指导!>
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
 楼主| 发表于 2015-11-9 23:18:55 | 显示全部楼层
回复【19楼】不说如果:
---------------------------------
rxlen为真,表示接收到了数据。
rxlen如果和RS485_RX_CNT相等,说明10ms时间内,没有收到任何数据,证明,发送端没有发数据了,也就是接收完成了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-6-3
在线时间
8 小时
发表于 2015-11-10 12:22:11 | 显示全部楼层
回复【20楼】正点原子:
---------------------------------
谢谢原子哥,明白了!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-1-11
在线时间
1 小时
发表于 2016-1-11 18:00:25 | 显示全部楼层
请问一下,我是探索者的板子。RS485是用PG8使能接收和发送,那换成RS232的话如何使能呢?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2015-1-5
在线时间
3 小时
发表于 2016-1-27 12:17:19 | 显示全部楼层
Sueeee 发表于 2016-1-11 18:00
请问一下,我是探索者的板子。RS485是用PG8使能接收和发送,那换成RS232的话如何使能呢?

232不需要使能
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-1-27
在线时间
0 小时
发表于 2016-1-27 22:27:57 | 显示全部楼层
RS485是用PG8使能接收和发送
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 07:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表