[技术问答] UART_Send_Data如何与printf同时使用

[复制链接]
1330|14
 楼主| mintspring 发表于 2020-7-23 10:59 | 显示全部楼层 |阅读模式
本帖最后由 mintspring 于 2020-7-27 17:44 编辑

UART_Send_Data(UART0,my);
有大佬用过这个方法吗,我怎么同时用这两个就卡住了。。。

多谢各位大佬答复和讨论。搞定了
  1. ENABLE_UART0_PRINTF;
  2.                                 printf ("bbs.21ic.com" );
  3.                                 DISABLE_UART0_PRINTF;
这样使用printf就可以了,用的时候使能,用完关闭功能。就不会卡死,就不会影响使用UART_Send_Data();
xiaoxiong1988 发表于 2020-7-23 11:29 | 显示全部楼层
本帖最后由 xiaoxiong1988 于 2020-7-23 11:37 编辑

串口打开中断  中断发送
printf 重新定义为调用串口中断发送  增加一个串口忙检测标识
有例程
void Uart0_ISR(void) interrupt 4
{
//    char ch;
    if(TI)
    {
        Uart0_Send_Ready=1;//把TI的值传递给Uart0_Send_Ready
        TI=0;//清TI
    }
   
    if(RI)
    {
        RI=0;
        //干该干的事……
    }
}
重新定义putchar
char putchar (char c)
{
    if (c == '\n')
    {
        while (!Uart0_Send_Ready);
        Uart0_Send_Ready = 0;
        SBUF = 0x0d;                         /* output CR  */
    }
    while (!Uart0_Send_Ready);
    Uart0_Send_Ready = 0;
    return (SBUF = c);
}
你试试  不知道你用的哪类芯片

 楼主| mintspring 发表于 2020-7-23 11:33 | 显示全部楼层
xiaoxiong1988 发表于 2020-7-23 11:29
串口打开中断  中断发送
printf 重新定义为调用串口中断发送  增加一个串口忙检测标识
有例程

我用的是ML51,我看官方的例子一个用的printf,一个是用的UART_Send_Data,但是我放一起就不行了。。。卡克了,只能执行一个字符的发送就没反应了。

评论

我我上面的修改下,你试试的  发表于 2020-7-23 11:38
幸福小强 发表于 2020-7-23 18:01 | 显示全部楼层
学习一下。
玛尼玛尼哄 发表于 2020-7-23 21:56 | 显示全部楼层
有定位到卡哪儿了吗
玛尼玛尼哄 发表于 2020-7-23 21:56 | 显示全部楼层
有定位到卡哪儿了吗
 楼主| mintspring 发表于 2020-7-23 22:12 | 显示全部楼层
解决方法不用printf。。。只能这样了。
643757107 发表于 2020-7-24 21:32 | 显示全部楼层
有人搞明白后分享一下经验
jiekou001 发表于 2020-7-25 09:09 | 显示全部楼层
回头我试试。
jiekou001 发表于 2020-7-25 09:10 | 显示全部楼层
主要是要看printf是怎么调用实现的,或许默认的重定向有哪儿跟这个冲突。
xiaoxiong1988 发表于 2020-7-25 16:11 | 显示全部楼层
bsp里面有重写putchar函数,调用pritnf 函数  串口初始化 要求TI = 1;这和用串口直接发送 有冲突,TI为1就会进入串口中断了。按照我上面说的 就可以同时使用了
jasontu 发表于 2020-7-27 15:50 | 显示全部楼层
#define    ENABLE_UART0_PRINTF                set_SCON_TI;PRINTFG=1            //For printf function must setting TI = 1


void Serial_ISR(void) interrupt 4
{
    _push_(SFRS);
  
    if (RI)
    {
        uart0_receive_flag = 1;
        uart0_receive_data = SBUF;
        clr_SCON_RI;                                         // Clear RI (Receive Interrupt).
    }

    if (TI)
    {
        if (!PRINTFG)
        {
            TI = 0;
        }
    }

    _pop_(SFRS);
}       

在呼叫 UART_Send_Data先把TI清0,及PRINTFG设为0

void UART_Send_Data(UINT8 UARTPort, UINT8 c)
{
    switch (UARTPort)
    {
      case UART0:
        SBUF = c;
      break;
      case UART1:
        SBUF_1 = c;
      break;
    }
}
void UART_Send_Data(UINT8 UARTPort, UINT8 c)
{
    switch (UARTPort)
    {
      case UART0:
        SBUF = c;
      break;
      case UART1:
        SBUF_1 = c;
      break;
    }
}

734774645 发表于 2020-7-27 17:36 | 显示全部楼层
jasontu 发表于 2020-7-27 15:50
#define    ENABLE_UART0_PRINTF                set_SCON_TI;PRINTFG=1            //For printf function ...

高手,看明白咋回事了,多谢大佬的精彩分析分享
 楼主| mintspring 发表于 2020-7-27 17:43 | 显示全部楼层
jasontu 发表于 2020-7-27 15:50
#define    ENABLE_UART0_PRINTF                set_SCON_TI;PRINTFG=1            //For printf function ...

多谢大佬,搞定了,你说的针对,printf用完要关掉。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

303

主题

4972

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部