当前位置: 代码迷 >> 单片机 >> stm32 干rs485通信,MCU可以接收数据,但不能发数据?stm32 做rs485通信,MCU可以接收数据,但不能发数据
  详细解决方案

stm32 干rs485通信,MCU可以接收数据,但不能发数据?stm32 做rs485通信,MCU可以接收数据,但不能发数据

热度:138   发布时间:2016-04-28 14:55:10.0
stm32 做rs485通信,MCU可以接收数据,但不能发数据?stm32 做rs485通信,MCU可以接收数据,但不能发数据
   #include "stm32f10x_lib.h"
   #include"delay.h"

   /*
       RS485_TX----PC10-----USART3_TX
    RS485_RX---- PC11-----USART3_RX
    RS485_DIR----PC12
   */
#define RS485_DIR_TX   GPIO_SetBits(GPIOC, GPIO_Pin_12)
#define RS485_DIR_RX   GPIO_ResetBits(GPIOC, GPIO_Pin_12)


void  USART3_Configuration(void)
{
     USART_InitTypeDef USART_InitStruct;
     GPIO_InitTypeDef GPIO_InitStructure;

     GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);
     //RS485_DIR--PC12
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出;
     GPIO_Init(GPIOC, &GPIO_InitStructure);

     //RS485_TX--PC10
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
     GPIO_Init(GPIOC, &GPIO_InitStructure);

     //RS485_RX--PC11
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
     GPIO_Init(GPIOC, &GPIO_InitStructure);


     USART_StructInit(&USART_InitStruct);//将结构体设置为缺省状态
     USART_InitStruct.USART_BaudRate=9600;//波特率设置为9600
     USART_InitStruct.USART_WordLength=USART_WordLength_8b;//一帧数据的宽度设置为8bits
     USART_InitStruct.USART_StopBits=USART_StopBits_1;//在帧结尾传输1个停止位
     USART_InitStruct.USART_Parity=USART_Parity_No;//奇偶失能模式,无奇偶校验
     USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制失能
     USART_InitStruct.USART_Mode=USART_Mode_Tx |USART_Mode_Rx;    //使能发送/接收使能
     USART_Init(USART3, &USART_InitStruct);
     USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//打开串口3接受中断
     //USART_ITConfig(USART3, USART_IT_TXE, ENABLE);//打开串口1的中断响应函数
     USART_Cmd(USART3, ENABLE);//打开USART1
     
     USART_ClearFlag(USART1,USART_FLAG_TC);//清除发送完成标志位
     
     RS485_DIR_RX;
}

void USART485_SendChar(u8 data)
{
  RS485_DIR_TX;
  delay_ms(1);
  USART_SendData(USART3,data);
  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET);
  delay_ms(1);
  RS485_DIR_RX;
}
程序及电路图截图如下:




------解决方案--------------------
搞不懂你是串口1还是串口3啊,数据发到串口3上,你查串口1的状态干嘛呢

另外,这个也很好测吧,首先看程序,不行找个3用表或示波器从CPU往外倒