基于HAL库的串口dma传输的RS485发送函数

      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接收

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值