时光虫子 发表于 2017-6-5 14:55
串口缓冲区开大点,接收和读取用环形缓冲区
接收和读取用环形缓冲区
这是关键点,你想明白了就明白。
int main(void)
{
...
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);
}
学习了
avenbbs-241604 发表于 2017-8-8 16:01
int main(void)
{
...
虽然你把每个数据都打印出来了,看起来RxByte1像是保存了不止一个数据,但实际上RxByte1里只保存1字节数据
谢谢分享!!
楼主能不能贴个源码上来啊 好多人遇到这样的问题了
不懂你在说啥
/*这是开启串口中断后,串口1和串口3之间互相通信的程序,在main里写的回调函数,里面的变量都是全局变量,注意注释里说的串口发送完数据就中断,立马存到缓冲区,中断比存储要快,所以能存完串口的所有数据,在进行中断接收时,必须先开启中断接收*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//UNUSED(huart);
if(huart->Instance == USART1)
{
//串口发送完数据就中断,立马存到缓冲区,中断比存储要快,所以能存完串口的所有数据
//然后发送完后,继续开启中断接收函数
RxBuffer1=RxTemp1;
RxBuffer1=0;
RxCounter1=0;
HAL_UART_Transmit(&huart3,RxBuffer1,strlen(RxBuffer1),100);
HAL_UART_Receive_IT(&huart1,&RxTemp1,1);
}
if(huart->Instance == USART3)
{
RxBuffer3=RxTemp3;
RxBuffer3=0;
RxCounter3=0;
HAL_UART_Transmit(&huart1,RxBuffer3,strlen(RxBuffer3),100);
HAL_UART_Receive_IT(&huart3,&RxTemp3,1);
}
}