RS485平时应处于接收状态,例如空闲接收,DE/RE控制连到一起,处于低电平状态,在发送时应将DE/RE控制引脚拉高,拉高时机是发送指令发出前几个微秒,然后,发送,最后再延时若干时间将DE/RE控制引脚置低。最后的延时时间通常与波特率和发送的数据长度有关,通常延时时间=发送的字节数*系数,如果波特率115200bps,系数取100us左右。
上次发的源码有错,即sizeof()对字符指针求长度,得到得是字符的位数,而不是字符串长度!特此纠正,抱歉!修改后的代码如下:
///
//函数名称:DMA_Usart_Send(uint8_t *buf, uint8_t buf_size)
//功能描述:串口DMA方式发送数据帧
//参数说明:*buf 数据帧的指针,buf_size数据帧的长度
//返 回 值: 无
//
void DMA_Usart_Send(UART_HandleTypeDef *huart,uint8_t *buf, uint8_t buf_size)
{
if(HAL_UART_Transmit_DMA(huart,buf,len)!=HAL_OK )
{
Error_Handler();
}
}
///
//函数名称:void RS485_Send_data(uint8_t *pdata,uint8_t data_size,uint8_t s)
//功能描述:RS485发送控制,平时RS485处于接收状态,发送时DE置高电平
//参数说明:uint8_t *buf :数据帧
// uint8_t buf_size :数据帧长度
// uint8_t s :串口号:1,2,3
//返 回 值:无
//编 辑:鸡蛋圆
//日 期:20220325
/
void RS485_Send_data(uint8_t *buf,uint8_t buf_size,uint8_t s)
{
switch(s)
{
case 1://串口1
RS485_1_T; //串口1,RS485发送状态
delay_us(3); //延时3us
DMA_Usart_Send(&huart3,buf, buf_size);
delay_us(buf_size*100); //根据数据长度延时,当波特率为115200时,数据长度乘*100
RS485_1_R; //串口3,RS485置接收状态
break;
case 2://串口1
RS485_2_T; //串口2,RS485发送状态
delay_us(3); //延时3us
DMA_Usart_Send(&huart3,buf, buf_size);
delay_us(buf_size*100); /根据数据长度延时,当波特率为115200时,数据长度乘*100
RS485_2_R; //串口3,RS485置接收状态
break;
case 3://串口1
RS485_3_T; //串口3,RS485发送状态
delay_us(3); //延时3us
DMA_Usart_Send(&huart3,buf, buf_size);
delay_us(buf_size*100); //根据数据长度延时,当波特率为115200时,数据长度乘*100
RS485_3_R; //串口3,RS485置接收状态
break;
}
}
其他波特率延时长度与通过简单计算或试验确定。
RS485_1_T ,RS485_1_R 是连接到DE/RE引脚的GPIO,例如,串口1的485控制引脚为PA11
则 :
/***********************RS485(@串口1)收发控制***********************************/
#define RS485_1_T HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_SET) //RS485发送
#define RS485_1_R HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET) //RS485接收
依次类推,与具体硬件设计有关
/***********************RS485(@串口2)收发控制***********************************/
#define RS485_2_T HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET) //RS485发送
#define RS485_2_R HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET) //RS485接收
/***********************RS485(@串口3)收发控制***********************************/
#define RS485_3_T HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET) //RS485发送
#define RS485_3_R HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET) //RS485接收
————————————————
版权声明:本文为优快云博主「鸡蛋圆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/sun_shu_ying/article/details/123731610