OpenEdv-开源电子网

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

大佬们,为什么发过去数据接收不到啊

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2023-5-23
在线时间
22 小时
发表于 2023-8-12 16:47:16 | 显示全部楼层 |阅读模式
1金钱
#include "stm32f10x.h"
#include "rs485.h"
#include "delay.h"

void RCC_Configuration(void)  
{   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);  
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
}

void GPIO_Configuration(void)  
{  
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;             //CS_485
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //推挽输出
  GPIO_Init(GPIOD, &GPIO_InitStructure);   

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;             //管脚2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);                //TX初始化

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;             //管脚3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入        
  GPIO_Init(GPIOA, &GPIO_InitStructure);                //RX初始化
}

void USART_Configuration(void)//串口初始化函数
{
    //串口参数初始化  
    USART_InitTypeDef USART_InitStructure;               //串口设置恢复默认参数
    //初始化参数设置
    USART_InitStructure.USART_BaudRate = 9600;                  //波特率9600
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长8位
    USART_InitStructure.USART_StopBits = USART_StopBits_1;      //1位停止字节
    USART_InitStructure.USART_Parity = USART_Parity_No;         //无奇偶校验
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无流控制
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//打开Rx接收和Tx发送功能
    USART_Init(USART2,&USART_InitStructure);                   //初始化

    USART_ITConfig(USART2,USART_IT_TXE,ENABLE);                //允许串口1发送中断。
    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);               //允许串口1接收中断。
    USART_Cmd(USART2,ENABLE);                                  //启动串口
    USART_ClearFlag(USART2,USART_FLAG_TC);                     //发送完成标志位
}
void NVIC_Configuratio(void)//配置中断优先级  
{  
  NVIC_InitTypeDef NVIC_InitStructure;  

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  

  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;  
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  NVIC_Init(&NVIC_InitStructure);  
}

void USART2_IRQHandler(void)
{
  u8 RX_dat;

  if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)//USART_IT_RXNE:接收中断
  {
    RX_dat=USART_ReceiveData(USART2);   
    GPIO_SetBits(GPIOD,GPIO_Pin_7);
    delay_ms(1);

    USART_SendData(USART2,RX_dat);   
    while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET){} //发送数据寄存器空标志位
    delay_ms(2);
    GPIO_ResetBits(GPIOD,GPIO_Pin_7);
  }   
}
//===================================
#include "stm32f10x.h"
#include "rs485.h"


void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void NVIC_Configuratio(void);


int main()
{
    SystemInit();//72m

    RCC_Configuration();
    GPIO_Configuration();
    USART_Configuration();
    NVIC_Configuration();

    GPIO_ResetBits(GPIOD,GPIO_Pin_7);                                             
    while(1)
    {

    }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-8-14 11:15:57 | 显示全部楼层
485?
要注意它是半双工,注意收发切换,收与发要在时间上分开,两个设备不要同时发送。
就在while(1)里延时1000ms发送0xAA试试。
专治疑难杂症
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2023-5-23
在线时间
22 小时
 楼主| 发表于 2023-8-14 15:20:03 | 显示全部楼层
LcwSwust 发表于 2023-8-14 11:15
485?
要注意它是半双工,注意收发切换,收与发要在时间上分开,两个设备不要同时发送。
就在while(1)里延 ...

我试了 PD7是收发控制脚,当是收不到数据
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-8-14 15:25:03 | 显示全部楼层
7August 发表于 2023-8-14 15:20
我试了 PD7是收发控制脚,当是收不到数据

你咋知道收不到数据?
专治疑难杂症
回复

使用道具 举报

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2023-5-23
在线时间
22 小时
 楼主| 发表于 2023-8-14 18:27:50 | 显示全部楼层
LcwSwust 发表于 2023-8-14 11:15
485?
要注意它是半双工,注意收发切换,收与发要在时间上分开,两个设备不要同时发送。
就在while(1)里延 ...

这样子
int main()
{
    RS485_Init();
   
    GPIO_ResetBits(GPIOD,GPIO_Pin_7);  //收发控制
    while(1)
    {     
         if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==SET)
        {
            RX_Data=USART_ReceiveData(USART2);   
            Serial_SendByte(RX_Data);
        }
    }
}
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8206
金钱
8206
注册时间
2020-5-11
在线时间
3700 小时
发表于 2023-8-15 09:22:45 | 显示全部楼层
7August 发表于 2023-8-14 18:27
这样子
int main()
{

中断里把收到的数据取走了,主循环还能取到数据?
专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 02:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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