⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 ucos 51 tcp/ip开发文档
💻
字号:
                                      关于串口发送程序的BUG修正
                                     asdjf@163.com     2004/04/09

网友windysons在2004-3-24 14:12:02来信询问如下问题:
-------------------------------------------------------------------------------
你好~我看到你写的serial.c的文件中,有一个问题有点不明白

我把你的serial.c单独拿出来用,没有使用UCOS2,只想输出一个字符PrintChar('b');
但是怎么也出不来,但是我连续调用两次这个函数,就能输出两个b,
但是调用一次,什么也没有显示,这是为什么样?还是你这个文件中的小BUG,谢谢!
-------------------------------------------------------------------------------
2004-3-26 11:33:20网友windysons修改程序如下:
-------------------------------------------------------------------------------
问题我已经解决,稍微改动了一下你的子程序
你的原程序是:
void PrintChar(unsigned char ch) reentrant//显示字符
{
    unsigned char *t;

    //ES=0;
    if( TIflag){
        TIflag=0;
        TI=1;
    }
    t=inTxBuf;t++;
    if(t==TxBuf+LenTxBuf) t=TxBuf;
    if(t==outTxBuf) {/*ES=1;*/return;}                  //TxBuf Full
    *inTxBuf=ch;
    inTxBuf=t;
    //ES=1;
}       
我改动后好使的现程序,只是把标志位判断调到子程序最后就OK了
void PrintChar(unsigned char ch) reentrant//显示字符
{
    unsigned char *t;

    //ES=0;
    t=inTxBuf;t++;
    if(t==TxBuf+LenTxBuf) t=TxBuf;
    if(t==outTxBuf) {/*ES=1;*/return;}                  //TxBuf Full
    *inTxBuf=ch;
    inTxBuf=t;
    //ES=1;  
    if( TIflag){
        TIflag=0;
        TI=1;
    }
}
-------------------------------------------------------------------------------
2004-3-27 21:14:14我发现这是一个BUG
-------------------------------------------------------------------------------
    在执行到PrintChar函数里TI=1一句时立即引发串口中断发送过程,若此时显示缓冲区为空,则串口发送中断立即返回,导致自动连续发送过程结束,除非再次被启动。第一次发送时,还没有在显示缓冲区里准备好数据就启动发送过程,导致发送过程停止,即使随后缓冲区里写入数据,也要等下次启动时才能被发出。第二次发送时,显示缓冲区里有数据,发送中断程序被启动后将发出字符,发送完毕后再次引发TI中断,因为串口速率比CPU慢,所以在下次中断到来前CPU有时间把第二个字符写入缓冲区。只要缓冲区里有数据,一经PrintChar首次启动,发送中断就能自己维持连续发送过程,直到缓冲区空。这样,第一次发送时什么也不显示,而第二次发送时显示两个字符。
    在ucos51shell程序里也存在这个问题。在人机界面下,输入help,敲入h将不显示,继续敲入e,显示he,接着敲入l不显示,再敲入p,接着显示lp。当时百思不得其解(2002年12月),以为是任务切换导致的错误,又不知道如何写内嵌汇编,就放下了。2004/02/20我在PrintChar里加入关中断的内嵌汇编,同样解决了这个问题。这更使我误以为是任务切换不当造成的。现在看来,这是因为在TI=1前关中断保证了在缓冲区里没有存入数据前,发送中断程序不会被执行,从而避免了中断连续发送过程被打断,自持过程停止需要重新启动的问题。按你所说的方法修改serial.c,shell将正常回显键盘输入字符。
    总之,在显示缓冲区为空时不应启动发送过程,要在准备好显示数据后再启动自持发送过程。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -