你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
时光虫子 发表于 2017-6-5 14:55 串口缓冲区开大点,接收和读取用环形缓冲区
张亚飞 发表于 2017-6-5 09:06 标准库的接收不用定长接收吧。
kylongmu 发表于 2017-8-3 20:43 这个问题很简单,但是你首先要把函数的接收缓冲区长度,与你要接收任意长度两个概念分开。 你的接收缓冲区 ...
张亚飞 发表于 2017-8-4 09:56 你的意思是改HAL库的源码了?不改源码我就只能在接收完成的回调函数里进行我的操作,但是跟不定长接收没 ...
kylongmu 发表于 2017-8-4 10:05 改hal源码?你想歪了。
张亚飞 发表于 2017-8-4 11:17 在中断函数里,对每次接收到的数据进行判断,分解到你希望的任意长度,并复制数据到你希望的缓冲区。 这 ...
查看全部评分
avenbbs-241604 发表于 2017-8-8 16:01 int main(void) { ...
有点答非所问吧。 stm32cubemx 串口中断接收函数只能定长接收数据。
DMA+总线空闲中断,是实现不定长度接收的最好的办法。
另外,如果你接收的数据帧是有固定格式,只是每帧长度不一样,比如帧格式中有数据长度位,可以通过判断已接收的长度是否等于帧中数据长度位来判定当前数据是否接收完成。不过这样做相比用DMA+空闲中断接收要麻烦一些,效率低还容易出错。
你的接收缓冲区工作在自动填充启动模式,比如你设置100个字节接收,然后在接收完了自动再调用一次,重新设置100个字节接收。等于说接收函数处于无穷状态,随时等待接收。
-----------------------------------------------------------------------------------------
在中断函数里,对每次接收到的数据进行判断,分解到你希望的任意长度,并复制数据到你希望的缓冲区。
搞清楚你要的,与函数的实现方式,才是本质问题。
你的意思是改HAL库的源码了?不改源码我就只能在接收完成的回调函数里进行我的操作,但是跟不定长接收没关系了。
改hal源码?你想歪了。
在中断函数里,对每次接收到的数据进行判断,分解到你希望的任意长度,并复制数据到你希望的缓冲区。 这是你说的。 在stm32cubemx的工程里如果是固定长度接收的话只需要在接收完成的回调函数里处理即可,谈何在中断函数里对数据进行判断呢?
HAL_UART_Receive_IT(&huart3,UART3_R_Msg.Recive_Buf, QUEUE_MESSAGE_MAX_SIZE)
这个函数是设置固定接受缓冲区长度的。
-------------------------------------------------------
这是CubeMX给你生成的中断函数:
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
/* USER CODE END USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3);
/* USER CODE BEGIN USART3_IRQn 1 */
/* USER CODE END USART3_IRQn 1 */
}
里面有2处添加你自己代码的地方,在这里增加你的代码判断,并复制数据到你希望的缓冲区。把串口工作的数据缓冲区当作从头到尾循环工作的方式,判断接收到尾后重新调用HAL_UART_Receive_IT。
设置全局变量,或者信号量,在检测到你希望的数据流时通知线程处理。
把HAL_UART_Receive_IT,HAL_UART_IRQHandler里面源代码好好看看,理解了你才能明白如果做。
接收和读取用环形缓冲区
这是关键点,你想明白了就明白。
{
...
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxByte1, 1);
...
whine(1)
{
...
}
...
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
printf("%c",RxByte1);
HAL_UART_Receive_IT(&huart1, (uint8_t *)&RxByte1, 1);
}
评分
查看全部评分
虽然你把每个数据都打印出来了,看起来RxByte1像是保存了不止一个数据,但实际上RxByte1里只保存1字节数据
评分
查看全部评分