STM32CUBEMX设置
添加引脚RS485--GPIO引脚
USART1
代码部分
usart.h
/* USER CODE BEGIN Private defines */
#define RS485_TX_Set(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET)) //485使能脚
#define BUFFERSIZE 256
#define TIMEOUT 1000
/* USER CODE END Private defines */
/* USER CODE BEGIN Prototypes */
// RS485发送len个字节.
// buf:发送区首地址
// len:发送的字节数
void RS485_send_data(uint8_t *buf,uint16_t len);
/* USER CODE END Prototypes */
usart.c
/* USER CODE BEGIN 0 */
uint8_t huart1_rx_buffer[BUFFERSIZE];//接收数组
uint8_t huart1_tx_buffer[BUFFERSIZE];//发送数组
uint8_t huart1_rx_len = 0; //接收到的数据长度
uint8_t huart1_recv_end_flag = 0; //接收结束标志位
/* USER CODE END 0 */
/* USER CODE BEGIN USART1_Init 2 */
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart1,huart1_rx_buffer,BUFFERSIZE);
RS485_TX_Set(0); //设置为接收模式
/* USER CODE END USART1_Init 2 */
/* USER CODE BEGIN 1 */
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_send_data(uint8_t *buf,uint16_t len)
{
RS485_TX_Set(1); //设置为发送模式
HAL_UART_Transmit(&huart1,buf,len,TIMEOUT);//串口2发送数据
HAL_UART_Receive_DMA(&huart1,huart1_rx_buffer,BUFFERSIZE);//开启DMA接收,方便下一次接收数据
RS485_TX_Set(0); //设置为接收模式
}
/* USER CODE END 1 */
stm32f7xx_it.c
/* USER CODE BEGIN Includes */
#include "usart.h"
/* USER CODE END Includes */
/* USER CODE BEGIN EV */
extern uint8_t huart1_rx_buffer[BUFFERSIZE];//接收数组
extern uint8_t huart1_tx_buffer[BUFFERSIZE];//发送数组
extern uint8_t huart1_rx_len; //接收到的数据长度
extern uint8_t huart1_recv_end_flag; //接收结束标志位
/* USER CODE END EV */
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
uint8_t tmp_flag =__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE); //获取IDLE标志位
if((tmp_flag != RESET))//通过标志位判断接收是否结束
{
huart1_recv_end_flag = 1; //置1表明接收结束
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除标志位
HAL_UART_DMAStop(&huart1);
uint8_t temp=__HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
huart1_rx_len =BUFFERSIZE-temp; //计算出数据长度
// mbh_executive(huart1_rx_buffer,huart1_rx_len);//进入接收执行函数
RS485_send_data(huart1_rx_buffer,huart1_rx_len);
HAL_UART_Receive_DMA(&huart1,huart1_rx_buffer,BUFFERSIZE);//开启DMA接收,方便下一次接收数据
RS485_TX_Set(0); //设置为接收模式
}
/* USER CODE END USART1_IRQn 1 */
}
主函数代码
void userApplicationCustomThread(void)
{
ModbusTransmitBuffer[0] = 4;
ModbusTransmitBuffer[1] = 3;
ModbusTransmitBuffer[2] = 2;
ModbusTransmitBuffer[3] = 1;
RS485_send_data(ModbusTransmitBuffer,ModbusTransmitBuffer[0]);
}