你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
...aaa 发表于 2015-11-16 20:33 发送的频率可能过快乐
magnbudie 发表于 2016-1-19 16:23 我算了下,100us,不是发送频率的问题
0721de 发表于 2016-5-9 14:30 uint8_t uart_receive[3]={0}; int main(void) {
我算了下,100us,不是发送频率的问题
你确定是100us不是100ms?串口9600波特率差不多1ms一个数据。你说的串口中断臃肿,采用DMA方式正常我觉得不像,你可以把MCU的频率调到最高,串口的速率没有那么快,不可能处理不完那些东西。
uint8_t uart_receive[3]={0};
int main(void)
{
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2,uart_receive, uart_len);//只这一句开接收中断,
//数组指针uart_receive
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
}
}
stm32f4xx_it.c中
void USART2_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart2);//只这两句就行
HAL_UART_Receive_IT(&huart2,uart_receive, 1);
}
实验表明,我上位机发1字节数据,就会进一次中断,虽然开接收中断函数里是一个数组指针,但HAL进中断是接一字节便进一次中断。
为何是将HAL_UART_Receive_IT((&huart2,uart_receive, 1)函数放在了void USART2_IRQHandler(void)里?
我试了放在回调函数里,结果执行不了。感觉是接收没有满足调用回调函数的条件。
现在用的是STM32F103,串口波特率是9600,如果是再回调函数里再次开启串口中断接收的话,接收一个数据,然后就串口溢出错误了。
改成DMA方式的话,不知道该怎么处理,帧长度不固定。