打印

寻找串口中的小臭虫——LPC2103串口疑惑

[复制链接]
2279|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ntao0227|  楼主 | 2010-1-21 22:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天已经折腾一晚了,今天也是搞到现在,始终没有找出问题的所在,希望得到各位朋友的帮助!
编写LPC2103串口裸程序,使用UART0,希望在上电初始化结束后串口发送字符串“Startup OK!”,并在按键时发送键号(这只是初期的功能,完成后还要加其他功能),串口通讯选择中断方式(发送和接受)。现在出现一个非常怪异的现象,在初始化后的发送总是多发送几个首字符,例如:PC接受到的是SStartupOK!,但是在发送键号时却是正常的。还发现这多余的首字符并不是在中断处理时重复发送的,不知怎么到FIFO的,感到非常的奇怪,这中间又是什么原因呢?发送键值和初始化时所用的是一个发送子程序啊?希望朋友们帮我找到这个臭虫,不胜感谢!
串口初始化程序(ABP:60MHz):
void UART0_init(void){
        U0LCR=0x80;
        U0DLL=21;
        U0DLM=0;
        U0FDR=0xb6;                //set BR=115200
        U0LCR=0x0b;                //word length is 8 bit,parity select is odd parity
        U0IER=0x07;                //enable RER,THRE,RX line,AEB and ABT
        U0FCR=0x87;                //enable FIFOs and RX Trigger level is 8 characters
        PINSEL0=(PINSEL0&0xfffffff0)|0x5;        //set I/O
        VICIntSelect=0x00;        //interrupt set
        VICVectCntl5=(VICVectCntl5&0xffffffc0)|0x26;
        VICVectAddr5=(unsigned int)UART0_int;
        VICIntEnable=1<<6;
        }
中断服务程序:
void UART0_int(void) __irq{
        unsigned char i;
//        do{
                switch(U0IIR&0xe){
                        case 0x1:
                                break;
                        case 0x6:                        //RX Line Status / Error
                                if(U0LSR&0x2==0x2);
                                if(U0LSR&0x4==0x4);
                                if(U0LSR&0x8==0x8);
                                if(U0LSR&0x10==0x10);
                                break;
                        case 0x4:                        //RX Data Available
                                for(i=0;i<8;i++,uart0buffer++){
                                        *uart0buffer=U0RBR;
                                        }
                                uart0c=8;
                                break;
                        case 0xc:                        //Character Time-out indication
                                uart0c=0;
                                while((U0LSR&0x01)==1){
                                        *uart0buffer=U0RBR;
                                        uart0buffer++;
                                        uart0c++;
                                        }
                                break;
                        case 0x2:                        //THRE
                                uart0c--;
                                if(uart0c>=1){
                                        uart0buffer+=1;
                                        U0THR=*uart0buffer;
                                        }
                                break;
                        default:
                                break;
                        }
//                }
//        while((U0IIR&0x1)==1);
        VICVectAddr=0x00;
        }
发送程序:
void UART0_TR(unsigned char *buf,unsigned char count){                //UART0 sent data program
        uart0buffer=buf;
        uart0c=count;
        U0THR=*uart0buffer;
//        uart0buffer++;
//        uart0c--;
        }
主程序:
int main() {
~~~~~~~~~~~~
        UART0_init();
        UART0_TR(" startup OK!/n",14);
        while(1) {
~~~~~~~~~~~~~
                }
        }
键值发送:
UART0_TR("Key 03 pressed ",15);
真是百思不得其解,望指教!

相关帖子

沙发
歪 歪| | 2010-1-22 01:03 | 只看该作者
用串口监视分析仪辅助你分析一下,看看到底发出了什么.

下载地址:
http://www.armecos.com/freedown/ ... good/comspy-v20.rar

使用特权

评论回复
板凳
ntao0227|  楼主 | 2010-1-22 20:44 | 只看该作者
我用串口调试助手看了,只是首字符重复,另外,注释掉中断处理程序,显示还是会重复发送,不知何故?

使用特权

评论回复
地板
xinzha| | 2010-1-22 22:19 | 只看该作者
UART0_TR(" startup OK!/n",14);
你把这句换成UART0_TR(" startup OK!/n",13);试试呢?

使用特权

评论回复
5
ntao0227|  楼主 | 2010-1-22 22:46 | 只看该作者
刚试了,不行啊!现在显示的是:ssstartupOK!/n
再次将中断屏蔽,其他不变,发送数据是:ss
这似乎表明这数据的重发只是在首次发送数据给THR时产生的,而不是在中断中,但是就不知又为什么在后面发送键值时没有重发首字符呢!这是最让人不能理解的地方了!

使用特权

评论回复
6
xinzha| | 2010-1-23 08:03 | 只看该作者
你发送的这个字符串,接收端是否能正确打印出来?
要是能正确打印出来,说明最后一个字符"\0"有可能也发送过去了(或者你用示波器抓一下确认一下),如果是这样的话那发送过去的字符数就大于13了。那说不定就是刚刚初始化完成,fifo等模块还没有复位完全导致出现问题,加个延时试试。

使用特权

评论回复
7
ntao0227|  楼主 | 2010-1-23 11:34 | 只看该作者
电脑上我用串口调试助手接受数据的。
可能就是没有初始化完成造成的,原来程序在调试助手上显示:sstartup OK!/n
加上延时后就正常了,显示:startup OK!/n
PS:在变量使用时没怎么注意,第一次加循环时,循环体的赋值超过定义的范围,造成死机了,真的要注意。
谢谢楼上的帮助!

使用特权

评论回复
8
xinzha| | 2010-1-23 11:39 | 只看该作者
晕哦,一直看成是"\n",没注意是"/n"...

使用特权

评论回复
9
ntao0227|  楼主 | 2010-1-23 11:59 | 只看该作者
晕死!总是毛手毛脚的,我还以为是调试助手苯苯呢!

使用特权

评论回复
10
ntao0227|  楼主 | 2010-1-23 12:00 | 只看该作者
从这上面看,RS232发送还挺慢的!

使用特权

评论回复
11
xinzha| | 2010-1-23 17:36 | 只看该作者
232不是挺慢,那是相当慢啊!

使用特权

评论回复
12
ntao0227|  楼主 | 2010-1-23 19:34 | 只看该作者
所以现在在发送数据之前查询一下状态,不然还是有可能出现上次没完成,这次又发送数据了。

使用特权

评论回复
13
xinzha| | 2010-1-23 19:51 | 只看该作者
呃,那是它的fifo太浅了,同时逻辑的保护没有做好。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
ntao0227 + 1
14
ntao0227|  楼主 | 2010-1-24 19:14 | 只看该作者
觉得我写的程序还有很多待完善,4种错误中断还没有任何处理措施。

使用特权

评论回复
15
xinzha| | 2010-1-24 19:21 | 只看该作者
都是一个渐进的过程,当你发现还有完善的余地的时候,就已经比前一刻有了更多的认识。

使用特权

评论回复
16
zhuyjgh| | 2010-1-28 22:59 | 只看该作者
初始化的时候清一下fifo好了,,

使用特权

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

本版积分规则

12

主题

125

帖子

1

粉丝