rs485自动收发通信程序

#32驱动RS485,没有反应,硬件电路设计的是自动收发的电路,有没有人知道,该如何配置这种情况的串口?

USART_SendData(USART3,0x0d);
    while(USART_GetFlagStatus(USART3,USART_FLAG_TXE) == RESET);

void usart_485_init(void)
{    
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef   NVIC_InitStructure;
    GPIO_InitTypeDef   GPIO_InitStructure;
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        //打开USART1的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
    
    /*USART3_TX -> PB10 , USART3_RX -> PB11 ,  PB10,低电平进入发送模式,高电平进入接收模式
    当TX高电平,mos管导通,RE和DE引脚接地,进入接收模式。当TX低电平,mos管截止,RE和DE引脚接高电平,进入发送模式*/
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed     = GPIO_Speed_50MHz;    
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_IN_FLOATING;
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_11;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    GPIO_PinRemapConfig(GPIO_PartialRemap_USART3,ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel                         = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority     = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority             = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                     = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    USART_DeInit(USART3);
    USART_InitStructure.USART_BaudRate                 = 115200;
    USART_InitStructure.USART_WordLength             = USART_WordLength_8b;
    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_Tx|USART_Mode_Rx;
    USART_Init(USART3,&USART_InitStructure);
    
    //USART_ClearFlag(USART3,USART_IT_RXNE);    //清除中断标志
    USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);    //设置中断方式
    USART_Cmd(USART3,ENABLE);    //使能终端    
}

使用485转USB发送无反应

img

参考GPT和自己的思路,如果你使用的是RS485串口通信,那么你需要在硬件上进行一些配置,以确保正确地收发数据。下面是一些可能需要注意的配置:

配置RS485芯片的控制引脚
RS485芯片通常具有几个控制引脚,例如使能/禁用、发送使能和接收使能等。你需要根据你的硬件电路设计,配置这些引脚的状态,以确保正确地收发数据。

配置串口波特率
在使用RS485通信时,你需要确保发送端和接收端使用相同的波特率。在配置串口时,你需要设置正确的波特率以确保数据能够正确传输。

配置串口模式
在使用RS485通信时,你需要选择正确的串口模式,以确保数据能够正确传输。一些常见的串口模式包括:异步模式、同步模式、单工模式和半双工模式等。你需要根据你的硬件电路设计,选择正确的串口模式。

配置RS485芯片的传输模式
RS485芯片通常有两种传输模式:半双工和全双工。在半双工模式下,芯片只能发送或接收数据,而不能同时进行发送和接收。在全双工模式下,芯片可以同时发送和接收数据。你需要根据你的硬件电路设计,选择正确的传输模式。

配置RS485芯片的电气特性
在使用RS485通信时,你需要配置RS485芯片的电气特性,以确保数据能够正确传输。这些电气特性包括:驱动电流、输入电阻、输出电平等。你需要根据你的硬件电路设计,选择正确的电气特性。

总之,如果你的RS485通信没有反应,你需要检查上述配置是否正确。你可以通过使用串口调试工具来测试你的RS485通信。如果你的硬件电路设计正确,你应该能够正确地收发数据。

你没有在代码中设置RE和DE引脚的输出模式,这可能导致驱动RS485芯片的引脚没有正确地配置。你应该添加以下代码,将GPIO_Pin_10和GPIO_Pin_11的模式都设置为推挽输出模式:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_RE | GPIO_Pin_DE;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

在添加上述代码后,你可以使用以下方法来发送数据:

// 将RE和DE引脚设置为发送模式
GPIO_ResetBits(GPIOB, GPIO_Pin_RE | GPIO_Pin_DE);

// 发送数据
USART_SendData(USART3, data);

// 等待发送完成
while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);

// 将RE和DE引脚设置为接收模式
GPIO_SetBits(GPIOB, GPIO_Pin_RE | GPIO_Pin_DE);

以下答案基于ChatGPT与GISer Liu编写:

针对这个问题,我需要进一步了解你的代码和硬件环境,以便确定可能存在的问题。以下是一些可能需要检查的方面:

  1. 电缆连接是否正确,以及电缆是否正常工作。可以使用示波器或者逻辑分析仪来检查信号传输是否正常。
  2. 串口初始化配置是否正确。特别是GPIO引脚的配置,如发送使能控制引脚和接收使能控制引脚是否正确配置为GPIO输出和GPIO输入模式。
  3. 是否需要配置RS485模式的控制寄存器,以设置发送模式或接收模式。这通常需要对特定的MCU寄存器进行配置。
  4. 是否需要在发送数据前,先进行RS485模式的控制,以设置为发送模式。如果控制寄存器的配置正确,那么你可以通过GPIO控制发送使能控制引脚,将其设置为高电平(接收模式)或低电平(发送模式)。

根据你的代码,我看到你已经配置了USART3的GPIO和USART模式,并且已经启用了接收中断。但是在发送数据之前,没有看到配置RS485模式的控制。我建议你先检查一下硬件电路设计是否正确,特别是接收使能控制引脚和发送使能控制引脚的接线是否正确。然后,你可以尝试在发送数据之前设置RS485控制寄存器,将发送使能控制引脚设置为低电平(发送模式),以确保发送数据被正确传输。


该回答内容部分引用GPT,GPT_Pro更好的解决问题
RS485自动收发通信程序的配置,需要考虑以下几个方面:

  1. 硬件电路:RS485自动收发电路设计要求,比如数字信号的调制解调、电压和驱动等;
  2. 硬件设备:需要使用专门的RS485接口的硬件,并注意它的工作模式(如主机模式、从机模式、双工模式等);
  3. 软件设置:包括协议栈的配置、波特率和数据格式的设置、流量控制和数据传输等;
  4. 数据流量控制:要考虑使用RS485总线时的数据流量控制问题,这意味着必须使用双向的通信。

下面是一个典型的RS485通信程序的C语言代码实例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>  //POSIX中断控制模块

int main(int argc, char const *argv[])
{
  int fd;                                //文件标识符
  int nread;                             //读取字节数量 
  char buff[512];                        //存储读取数据
  struct termios options;                //串口相关参数

  if (argc != 2) {                       //参数校验
    printf("Usage: %s /dev/ttyS0(or ttyUSB0)\n",argv[0]);
    exit(1);
  }

  fd = open(argv[1], O_RDWR | O_NOCTTY | O_NDELAY);   //打开串口文件

  if (fd == -1) {                        //错误处理 
    perror("Open Serial Port Error!\n");  
    exit(1);  
  }  

  tcgetattr(fd, &options);               //获取串口当前相关参数

  //设置串口波特率和数据格式  
  cfsetispeed(&options, B115200);        //波特率 115200  
  cfsetospeed(&options, B115200);        //波特率 115200  

  //8N1,8个数据位,无校验位,1个停止位  
  options.c_cflag &= ~PARENB;            //无校验位  
  options.c_cflag &= ~CSTOPB;            //1位停止位  
  options.c_cflag &= ~CSIZE;  
  options.c_cflag |= CS8;                //8位数据位  

  //关闭流量控制  
  options.c_cflag &= ~CRTSCTS;           //关闭RTS/CTS 流量控制  

  //关闭软件流量控制  
  options.c_iflag &= ~(IXON | IXOFF | IXANY);  

  options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);     //选择原生输入

  tcflush(fd, TCIFLUSH);                //将当前未完成的写入或读出数据取消掉

  tcsetattr(fd, TCSANOW, &options);     //将新的配置立即生效

  while (1) {                           //读取数据循环

    nread = read(fd, buff, 512);        //读取数据

    if (nread > 0) {                    //正常读取到数据时处理

      printf("read data success: %s\n", buff);

      write(fd, buff, nread);           //将读取到的数据回传

    } else {                            //未读取到数据时处理

      printf("read data failed!\n");      

    }

    sleep(1);                           //休眠1s

  }

  close(fd);                            //关闭文件

  return 0;
}

如果回答有帮助,望采纳。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
在使用RS485通信时,需要确保发送方和接收方在同一个通信模式下。这个通信模式通常由RS485芯片的自动收发控制电路决定,所以需要在硬件电路设计时将这个控制电路设计好。如果硬件电路已经设计好,而你仍然没有得到任何响应,那么问题可能出在你的代码上。
-
首先,你需要配置串口的波特率、数据位、校验位和停止位等参数,以确保发送方和接收方在同样的通信参数下进行通信。其次,你需要在发送数据之前等待USART_FLAG_TXE标志位被置位,表示发送寄存器已经准备好了可以发送数据。最后,你需要等待接收方回应,并且检查接收到的数据是否正确。
-
在你的代码中,你只发送了一个0x0d字符,这可能不足以与接收方建立通信。你需要根据通信协议的要求,发送正确的数据以与接收方进行通信。同时,你也需要在代码中处理接收到的数据,以确保你能够正确地接收和解析接收方发送的数据。
-
总之,确保硬件电路正确设计,根据通信协议要求发送正确的数据,正确配置串口参数,等待USART_FLAG_TXE标志位被置位并正确处理接收到的数据,这些步骤都是必要的,以确保你的RS485通信正常工作。