• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

串口数据接收时使用printf异常的原因

liuxiaofei126 2019-04-17 浏览量:1338

void USART1_IRQHandler(void)                 //´®¿Ú1ÖжϷþÎñ³ÌÐò
{
   u8 data;
  static u8 i;
  if(USART_GetFlagStatus(USART1 USART_FLAG_RXNE)==1)
  {
    USART_ClearFlag(USART1USART_FLAG_RXNE);
// Res =USART_ReceiveData(USART1);//(USART1->DR); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
// USART_SendData(USART1 Res);
// printf("OK\n");
// Write_RingBuff(USART_ReceiveData(USART1));      //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý
// if(0 == Read_RingBuff((u8*) &data)) 
// {
   data=USART_ReceiveData(USART1);

printf("OK\n");

为啥串口助手只收到三个ok

下面就是判断数据了

printf("OK\n"); 只有把这个注释掉,单片机接受指令才正常,否则单片机接受指令不反应

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 我也遇到过这样的问题:

    如果仅实现自发自收,在串口中断这样写就可以了。

    dat = USART_ReceiveData(USART1) & 0xFF;

    USART_SendData(USART1 dat);

    不要使用printf()这个函数,这个函数经过C库封装,有一些过程在中断里面处理不合适。


    • 发布于 2019-04-18
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:3
  • 这个要看你的printf的实现方式,一般printf底层调用putchar,putchar用的是那个轮询式的发送方法,这种方法有个等待TC寄存器发送完成的过程,因此相当于是在串口中断里面延时,中断里面延时会导致后面的中断无法触发,这样就会导致丢失数据

    建议在中断里面将收到的数据个数进行计数,尽量不要打印,打印可以放到主循环里面

    • 发布于2019-04-18
    • 举报
    • 评论 2
    • 0
    • 0
liuxiaofei126 回复了 chen0000009 :print和USART_SendData(USART1 Res)不一样 回复
chen0000009 回复了 liuxiaofei126 :printf调用的是putchar你可以搜一下工程里面putchar是怎么实现的 回复

  • 因为printf一般都是一个比较厚重的函数实现,容易造成处理超时,所以尽量不要在中断中直接调用,否则容易超时。
    • 发布于2019-04-18
    • 举报
    • 评论 0
    • 0
    • 0

  • 不要在任何中断程序里面用很长时间,你的发送ok这3个字节会耗用很久,属于阻塞发送,如果是回调函数就没问题,导致后面电脑发过来的数据来不及接收因为你那3个字节还没发完,你应该接收完一个数据通过标志位告诉主函数去发送​ok,这样就不会影响中断了
    • 发布于2019-04-18
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

串口数据接收时使用printf异常的原因