打印
[技术问答]

UART_Send_Data如何与printf同时使用

[复制链接]
657|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mintspring|  楼主 | 2020-7-23 10:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 mintspring 于 2020-7-27 17:44 编辑

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

多谢各位大佬答复和讨论。搞定了
ENABLE_UART0_PRINTF;
                                printf ("bbs.21ic.com" );
                                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,但是我放一起就不行了。。。卡克了,只能执行一个字符的发送就没反应了。

使用特权

评论回复
评论
xiaoxiong1988 2020-7-23 11:38 回复TA
我我上面的修改下,你试试的 
地板
幸福小强| | 2020-7-23 18:01 | 只看该作者
学习一下。

使用特权

评论回复
5
玛尼玛尼哄| | 2020-7-23 21:56 | 只看该作者
有定位到卡哪儿了吗

使用特权

评论回复
6
玛尼玛尼哄| | 2020-7-23 21:56 | 只看该作者
有定位到卡哪儿了吗

使用特权

评论回复
7
mintspring|  楼主 | 2020-7-23 22:12 | 只看该作者
解决方法不用printf。。。只能这样了。

使用特权

评论回复
8
643757107| | 2020-7-24 21:32 | 只看该作者
有人搞明白后分享一下经验

使用特权

评论回复
9
jiekou001| | 2020-7-25 09:09 | 只看该作者
回头我试试。

使用特权

评论回复
10
jiekou001| | 2020-7-25 09:10 | 只看该作者
主要是要看printf是怎么调用实现的,或许默认的重定向有哪儿跟这个冲突。

使用特权

评论回复
11
xiaoxiong1988| | 2020-7-25 16:11 | 只看该作者
bsp里面有重写putchar函数,调用pritnf 函数  串口初始化 要求TI = 1;这和用串口直接发送 有冲突,TI为1就会进入串口中断了。按照我上面说的 就可以同时使用了

使用特权

评论回复
12
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;
    }
}

使用特权

评论回复
13
734774645| | 2020-7-27 17:36 | 只看该作者
jasontu 发表于 2020-7-27 15:50
#define    ENABLE_UART0_PRINTF                set_SCON_TI;PRINTFG=1            //For printf function ...

高手,看明白咋回事了,多谢大佬的精彩分析分享

使用特权

评论回复
14
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用完要关掉。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

282

主题

4810

帖子

24

粉丝