OpenEdv-开源电子网

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

为什么我的rs485转usb无法跟电脑的串口助手通信啊,我的电路板PA4为RS485控制输入输出

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2023-6-25
在线时间
0 小时
发表于 2023-6-25 16:26:02 | 显示全部楼层 |阅读模式
void RS485_Init(u32 bound)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
     NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD, ENABLE);//使能GPIOA,D时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                 //PD7端口配置
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;          //推挽输出
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;    //PA2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽
  GPIO_Init(GPIOA, &GPIO_InitStructure);
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);  

    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位

   
#ifdef EN_USART2_RX              //如果使能了接收
    USART_InitStructure.USART_BaudRate = bound;//波特率设置
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
    USART_InitStructure.USART_StopBits = USART_StopBits_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;//收发模式

  USART_Init(USART2, &USART_InitStructure); ; //初始化串口
  
    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
    NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断
   
  USART_Cmd(USART2, ENABLE);                    //使能串口

#endif

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

}

发送数据

void RS485_Send_Data(u8 *buf,u8 len)
{
    u8 t;

    RS485_TX_EN=1;            //设置为发送模式
      for(t=0;t<len;t++)        //循环发送数据
    {           
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);   
    USART_SendData(USART2,buf[t]);
    }     

    while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);        
    RS485_RX_CNT=0;      
    RS485_TX_EN=0;                //设置为接收模式   

}


主函数

int main(void)
{
    u8 i = 0, t = 0;
    u8 cnt = 0;
    u8 rs485buf[5];
  uint8_t data = 0xAA;
   
   
    delay_init();
    uart_init(115200);
    RS485_Init(115200);
    //LED_Init();
   
   
    while(1)
    {
        ;
        
        for ( i = 0; i < 5; i++)
        {
            rs485buf[i] = cnt + i;
        }
        RS485_Send_Data(rs485buf, 5);
        t++;
        delay_ms(10);
        if (t == 5)
        {
            LED0 = !LED0;        //提示数据正在发送
            t = 0;
            cnt++;
        }   
    }
}

经过调试,发现到USART_SendData(USART2,buf[t]);没有发送数据,是不是那些引脚配置错误啊













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

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2023-6-25
在线时间
0 小时
 楼主| 发表于 2023-6-25 16:27:16 | 显示全部楼层
RS485_TX_EN改为               #define RS485_TX_EN                PAout(4)       
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2020-10-21
在线时间
1 小时
发表于 2023-6-27 22:51:56 | 显示全部楼层
为什么你初始化了RS485,还要初始化一遍串口?
应该是MCU串口-RS485收发器-RS485转串口-上位机这样啊?
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2023-7-17
在线时间
2 小时
发表于 2023-7-31 15:08:57 | 显示全部楼层
485 不是直接当串口用吗?除了那个控制引脚
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 04:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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