请问 红 {MOD}是我标记上的 我是用个10ms定时器 然后再串口中断接收函数里 如果时间超过10ms就认为接收完成 ,在main函数里就是给接收的先打印出来。发现第一次必须发一个字节(如果发多了就死了) 然后 在多发就正常了。。。。 这是为什么啊 我找了一天没找出个原因来
u8 RxTimerout = 3;
u16 yyy=0;
UART_HandleTypeDef huart1;//huart1句柄
TIM_HandleTypeDef htim3;
__align(8) u8 USART1_TX_BUF[200]; //????,??USART2_MAX_SEND_LEN??
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
int i=0;
/*接收状态
*bit15, 接收完成标志
*bit14, 接收到0x0d
*bit13~0, 接收到的有效字节数目
*/
u16 USART_RX_STA=0; //接收状态标记
u8 aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲
/* USER CODE END 2 */
/* USER CODE BEGIN printf */
/*如果使用printf函数需要开启下面函数*/
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while((USART1->ISR & 0x40) == RESET);
USART1->TDR = (u8)ch;
return ch;
}
#endif
/* USER CODE END printf */
/* USART1 init function */
void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1 2 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
HAL_UART_Receive_IT(&huart1, (u8 *)aRxBuffer, RXBUFFERSIZE);
/* USER CODE END USART1 */
}
#if 0
/*接收中断回调函数,当产生接收中断的时候,每中断一次都会进入到回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
u8 Rec;
Rec=*(--(huart->pRxBuffPtr));
/* USER CODE BEGIN USART1_Receive_callback 1 */
if(huart->Instance==USART1)//如果是串口1
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(RxTimerout==0)
{
yyy=0;
USART_RX_STA |= 0x8000;
}
RxTimerout = 3;
USART_RX_BUF[yyy++]=Rec; //记录接收到的值
if(yyy>(USART_REC_LEN-1))yyy=0;//接收数据错误,重新开始接收
}
/* USER CODE END USART1_Receive_callback 1 */
}
}
#endif
#if 1
/*接收中断回调函数,当产生接收中断的时候,每中断一次都会进入到回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
u8 Rec;
Rec=*(--(huart->pRxBuffPtr));
/* USER CODE BEGIN USART1_Receive_callback 1 */
if(huart->Instance==USART1)//如果是串口1
{
if(USART_RX_STA<USART_REC_LEN-1) //还可以接收数据
{
__HAL_TIM_SET_COUNTER(&htim3,0);//计数器清空
if(USART_RX_STA==0)TIM3_Set(1);
USART_RX_BUF[USART_RX_STA&0x3FFF]=Rec; //记录接收到的值
USART_RX_STA++;
}
else
{
USART_RX_STA|=1<<15;//强制标记接收完成
}
}
/* USER CODE END USART1_Receive_callback 1 */
}
#endif
#if 0
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
u8 Rec;
Rec=*(--(huart->pRxBuffPtr));
if(huart->Instance==USART1)
{
if(USART_RX_STA < USART_REC_LEN)
{
HAL_TIM_Base_Stop_IT(&htim3);
if(USART_RX_STA==0){
USART_RX_BUF[USART_RX_STA&0X3FFF]=Rec;
USART_RX_STA++;
// HAL_TIM_Base_Start_IT(&htim3); //使能定时器
}
}
else
{
USART_RX_STA|=1<<15;
}
}
}
#endif
#if 0
/*接收中断回调函数,当产生接收中断的时候,每中断一次都会进入到回调函数*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
int i=0;
u8 Rec;
Rec=*(--(huart->pRxBuffPtr));
/* USER CODE BEGIN USART1_Receive_callback 1 */
if(huart->Instance==USART1)//如果是串口1
{
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Rec!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Rec==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Rec;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
/* USER CODE END USART1_Receive_callback 1 */
}
#endif
/* @brief This function handles USART1 global interrupt.*/
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
while (HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY);//等待就绪
while(HAL_UART_Receive_IT(&huart1,(u8 *)aRxBuffer, RXBUFFERSIZE) != HAL_OK);
/* USER CODE END USART1_IRQn 1*/
}
#if 0
/************************************************
函数名称 : USART1_SendByte
功 能 : 串口1发送一字节数据
参 数 : Data --- 数据
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void USART1_SendByte(uint8_t Data)
{
while((USART1->ISR & UART_FLAG_TXE) == RESET);
USART1->TDR = (Data & (uint16_t)0x01FF);
}
/************************************************
函数名称 : USART1_SendNByte
功 能 : 串口1发送N个字符
参 数 : pData ----- 字符串
Length --- 长度
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void USART1_SendNByte(uint8_t *pData, uint16_t Length)
{
while(Length--)
{
USART1_SendByte(*pData);
pData++;
}
}
/************************************************
函数名称 : USART1_Printf
功 能 : 串口1打印输出
参 数 : String --- 字符串
返 回 值 : 无
作 者 : strongerHuang
*************************************************/
void USART1_Printf(uint8_t *String)
{
while((*String) != ' ')
{
USART1_SendByte(*String);
String++;
}
USART1_SendByte(0x0A);
}
#endif
/* TIM3 init function */
void MX_TIM3_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim3.Instance = TIM3;
htim3.Init.Prescaler = 4800-1;//4800-1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 200-1;//10000-1;
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
// HAL_TIM_Base_Start_IT(&htim3); //使能定时器
}
//定时器底册驱动,开启时钟,设置中断优先级
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
__HAL_RCC_TIM3_CLK_ENABLE(); //使能TIM3时钟
HAL_NVIC_SetPriority(TIM3_IRQn,1,3); //设置中断优先级,抢占优先级1,子优先级3
HAL_NVIC_EnableIRQ(TIM3_IRQn); //开启ITM3中断
}
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim3);
}
//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&htim3))
{
USART_RX_STA|=1<<15; //标记接收完成
TIM3_Set(0);
// if(RxTimerout > 0)
// {
// printf("OK
");
// RxTimerout--;
// }
}
//__HAL_TIM_SET_COUNTER(&htim3,0);//计数器清空
}
void TIM3_Set(u8 sta)
{
if(sta)
{
__HAL_TIM_SET_COUNTER(&htim3,0);//计数器清空
HAL_TIM_Base_Start_IT(&htim3);//使能TIMx
}
else HAL_TIM_Base_Stop_IT(&htim3);//关闭定时器3
}
void u2_printf(char* fmt,...)
{
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART1_TX_BUF,fmt,ap);
va_end(ap);
HAL_UART_Transmit(&huart1,(u8 *)USART1_TX_BUF,sizeof(USART1_TX_BUF),1000);
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET); //等待发送结束
}
main()函数
while (1)
{
if(USART_RX_STA &0x8000)
{
HAL_UART_Transmit(&huart1,(u8 *)USART_RX_BUF,strlen(USART_RX_BUF),1000);
while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_TC)!=SET); //等待发送结束
memset(USART_RX_BUF,0,sizeof(USART_RX_BUF));
USART_RX_STA = 0;
}
}
一周热门 更多>