RS485平时应处于接收状态,例如空闲接收,DE/RE控制连到一起,处于低电平状态,在发送时应将DE/RE控制引脚拉高,拉高时机是发送指令发出前几个微秒,然后,发送,最后再延时若干时间将DE/RE控制引脚置低。最后的延时时间通常与波特率和发送的数据长度有关,通常延时时间=发送的字节数*系数,如果波特率115200bps,系数取100us左右。源代码如下:
//
//函数名称:void RS485_Send_data(uint8_t *pdata,uint16_t data_size,uint8_t s)
//功能描述:RS485发送控制,平时RS485处于接收状态,发送时DE/RE置高电平
//参数说明:uint8_t *pdata :数据帧
// uint16_t data_size :数据帧长度
// uint8_t s :串口号:1,2,3
//返 回 值:无
//编 辑:鸡蛋圆
//日 期:20220325
/
void RS485_Send_data(uint8_t *pdata,uint16_t data_size,uint8_t s)
{
switch(s)
{
case 1://串口1
RS485_1_T; //串口1,RS485发送状态
delay_us(3); //延时3us
if(HAL_UART_Transmit_DMA(&huart1,pdata,sizeof(pdata))!=HAL_OK ) //发送
{
Error_Handler();
}
delay_us(sizeof(pdata)*100); //根据数据长度延时,当波特率为115200时,数据长度乘*100
RS485_1_R; //串口3,RS485置接收状态
break;
case 2://串口1
RS485_2_T; //串口2,RS485发送状态
delay_us(3); //延时3us
if(HAL_UART_Transmit_DMA(&huart2,pdata,sizeof(pdata))!=HAL_OK ) //发送
{
Error_Handler();
}
delay_us(sizeof(pdata)*100); //根据数据长度延时,当波特率为115200时,数据长度乘*100
RS485_2_R; //串口3,RS485置接收状态
break;
case 3://串口1
RS485_3_T; //串口3,RS485发送状态
delay_us(3); //延时3us
if(HAL_UART_Transmit_DMA(&huart3,pdata,sizeof(pdata))!=HAL_OK ) //发送
{
Error_Handler();
}//
delay_us(sizeof(pdata)*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接收