新手上路
- 积分
- 20
- 金钱
- 20
- 注册时间
- 2019-7-29
- 在线时间
- 16 小时
|

楼主 |
发表于 2019-11-26 11:47:59
|
显示全部楼层
问题解决了,解决的方法为:使用中断接收, 并且把RT THREAD USART1_IRQHandler 函数中的uart_isr(&(uart_obj[UART1_INDEX].serial))屏蔽。
初始化函数:
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(huart->Instance==USART1)
{
/* USER CODE BEGIN USART1_MspInit 0 */
/* USER CODE END USART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_USART1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**USART1 GPIO Configuration
PA9 ------> USART1_TX
PA10 ------> USART1_RX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USART1 interrupt Init */
__HAL_UART_DISABLE_IT(&uart->handle,UART_IT_TC);
__HAL_UART_ENABLE_IT(&uart->handle,UART_IT_RXNE); //开启中断接收
HAL_NVIC_EnableIRQ(USART1_IRQn);
HAL_NVIC_SetPriority(USART1_IRQn,3,1);
}
}
中断服务函数
void USART1_IRQHandler(void)
{
static uint16_t UART_IQR_Rxbyte_Numcnt=0;
static uint8_t UART_IQR_Rxdata_Byte[20]={0};
uint8_t UART_IQR_Rxdata_temp=0,sum_chk=0,xor_chk=0,neg_chk=0,crc_chk=0,dif_chk;
/* enter interrupt */
rt_interrupt_enter();
// uart_isr(&(uart_obj[UART1_INDEX].serial)); 要屏蔽的函数
if(UART_IQR_Rxstuts_flag==UART_IQR_Rxopen&&(__HAL_UART_GET_FLAG(&uart->handle,UART_FLAG_RXNE)!=RESET))
{
HAL_UART_Receive(&uart->handle,&UART_IQR_Rxdata_temp,1,0);
if(UART_IQR_Rxbyte_Numcnt < 20)
{
UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]=UART_IQR_Rxdata_temp;
switch(UART_IQR_Rxbyte_Numcnt) /**格式3**/
{
/******************************************帧头确认***********************************************************/
case 0: if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=0x41)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
case 1: if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=0x34)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
case 2: if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=0x41)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
case 3: if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=0x32)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
case 4: if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=0x46)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
/******************************************目标地址取反校验************************************************/
case 6: neg_chk= ~UART_IQR_Rxdata_Byte[5];
if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=neg_chk)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
/******************************************ID校验 取反校验************************************************/
case 8: neg_chk= ~UART_IQR_Rxdata_Byte[7];
if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=neg_chk)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
/****************************************1帧8字节数据累加校验、异或校验**********************************************/
case 17: sum_chk = ( UART_IQR_Rxdata_Byte[9] +UART_IQR_Rxdata_Byte[10] +UART_IQR_Rxdata_Byte[11]+UART_IQR_Rxdata_Byte[12]+
UART_IQR_Rxdata_Byte[13] +UART_IQR_Rxdata_Byte[14] +UART_IQR_Rxdata_Byte[15]+UART_IQR_Rxdata_Byte[16]);
xor_chk = ( UART_IQR_Rxdata_Byte[9] ^UART_IQR_Rxdata_Byte[10] ^UART_IQR_Rxdata_Byte[11]^UART_IQR_Rxdata_Byte[12]^
UART_IQR_Rxdata_Byte[13] ^UART_IQR_Rxdata_Byte[14] ^UART_IQR_Rxdata_Byte[15]^UART_IQR_Rxdata_Byte[16]);
dif_chk = sum_chk>xor_chk?(sum_chk-xor_chk) xor_chk-sum_chk);
if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=dif_chk)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
case 18: crc_chk=crc8_rohc(&UART_IQR_Rxdata_Byte[9], 8);
if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=crc_chk)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
/******************************************帧尾确认********************************************************/
case 19: if(UART_IQR_Rxdata_Byte[UART_IQR_Rxbyte_Numcnt]!=0xED)
{
UART_IQR_Rxbyte_Numcnt=0;
}else(UART_IQR_Rxbyte_Numcnt++);break;
default : UART_IQR_Rxbyte_Numcnt++;break;
}
}
if(UART_IQR_Rxbyte_Numcnt==20)
{
UART_IQR_Rxstuts_flag=UART_IQR_Rxclose;
UART_IQR_Rxbyte_Numcnt=0;
rt_sem_release(SemFor_uart_com);
UART_IQR_Rxflame.addr = UART_IQR_Rxdata_Byte[5];
UART_IQR_Rxflame.id = UART_IQR_Rxdata_Byte[7];
memcpy(UART_IQR_Rxflame.data,&UART_IQR_Rxdata_Byte[9],8);
}
}
/* leave interrupt */
rt_interrupt_leave();
}
|
-
|