各位大神,求助。我用的是HAL库,根据正点原子的例程,把USART2改成USART6,485可以正常使用,可是当我把USART6改成UART4时,
调用RS485_Send_Data(rs485buf,2)发送函数,如果我把长度写成1时,在串口中可以收到数组的第一个元素,但是如果我写成2以上时,程序就死了,
我单步调试时,怎么也执行不了。不知道哪里有问题,还请大神们帮帮忙,不胜感激。
代码:
UART_HandleTypeDef UART4_RS485Handler; //USART2句柄(用于RS485)
#if EN_UART4_RX //如果使能了接收
//接收缓存区
u8 RS485_RX_BUF[64]; //接收缓冲,最大64个字节.
//接收到的数据长度
u8 RS485_RX_CNT=0;
void UART4_IRQHandler(void)
{
u8 res;
if((__HAL_UART_GET_FLAG(&UART4_RS485Handler,UART_FLAG_RXNE)!=RESET)) //接收中断
{
HAL_UART_Receive(&UART4_RS485Handler,&res,1,1000);
if(RS485_RX_CNT<64)
{
RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
RS485_RX_CNT++; //接收数据增加1
}
}
}
#endif
//初始化IO 串口2
//bound:波特率
void RS485_Init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_Initure;
//PCF8574_Init(); //初始化PCF8574,用于控制RE脚
__HAL_RCC_GPIOC_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_UART4_CLK_ENABLE(); //使能USART2时钟
GPIO_Initure.Pin=GPIO_PIN_10|GPIO_PIN_11; //PA2,3
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF8_UART4; //复用为USART2
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //初始化PA2,3
GPIO_Initure.Pin=GPIO_PIN_9; //PC9,Uart4控制收发引脚
GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
HAL_GPIO_Init(GPIOC,&GPIO_Initure);
//USART 初始化设置
UART4_RS485Handler.Instance=UART4; //USART2
UART4_RS485Handler.Init.BaudRate=bound; //波特率
UART4_RS485Handler.Init.WordLength=UART_WORDLENGTH_8B; //字长为8位数据格式
UART4_RS485Handler.Init.StopBits=UART_STOPBITS_1; //一个停止位
UART4_RS485Handler.Init.Parity=UART_PARITY_NONE; //无奇偶校验位
UART4_RS485Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE; //无硬件流控
UART4_RS485Handler.Init.Mode=UART_MODE_TX_RX; //收发模式
HAL_UART_Init(&UART4_RS485Handler); //HAL_UART_Init()会使能USART2
__HAL_UART_DISABLE_IT(&UART4_RS485Handler,UART_IT_TC);
#if EN_UART4_RX
__HAL_UART_ENABLE_IT(&UART4_RS485Handler,UART_IT_RXNE);//开启接收中断
HAL_NVIC_EnableIRQ(UART4_IRQn); //使能USART1中断
HAL_NVIC_SetPriority(UART4_IRQn,3,3); //抢占优先级3,子优先级3
#endif
RS485_TX_Set(0); //设置为接收模式
}
//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
RS485_TX_Set(1); //设置为发送模式
HAL_UART_Transmit(&UART4_RS485Handler,buf,len,1000);//串口2发送数据
RS485_RX_CNT=0;
RS485_TX_Set(0); //设置为接收模式
}
//RS485查询接收到的数据
//buf:接收缓存首地址
//len:读到的数据长度
void RS485_Receive_Data(u8 *buf,u8 *len)
{
u8 rxlen=RS485_RX_CNT;
u8 i=0;
*len=0; //默认为0
delay_ms(10); //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
{
for(i=0;i<rxlen;i++)
{
buf[i]=RS485_RX_BUF[i];
}
*len=RS485_RX_CNT; //记录本次数据长度
RS485_RX_CNT=0; //清零
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>