RS485 模块(F767ZG)

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]);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值