打印

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

[复制链接]
2809|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ntao0227|  楼主 | 2010-1-21 22:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ntao0227 于 2010-1-21 22:22 编辑

昨天已经折腾一晚了,今天也是搞到现在,始终没有找出问题的所在,希望得到各位朋友的帮助!
编写LPC2103串口裸程序,使用UART0,希望在上电初始化结束后串口发送字符串“Startup OK!”,并在按键时发送键号(这只是初期的功能,完成后还要加其他功能),串口通讯选择中断方式(发送和接受)。现在出现一个非常怪异的现象,在初始化后的发送总是多发送几个首字符,例如:PC接受到的是SStartup OK!,但是在发送键号时却是正常的。还发现这多余的首字符并不是在中断处理时重复发送的,不知怎么到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);
真是百思不得其解,望指教!

相关帖子

沙发
ntao0227|  楼主 | 2010-1-22 22:56 | 只看该作者
顶起来,希望能找到原因。

使用特权

评论回复
板凳
mfzhao| | 2010-1-24 01:45 | 只看该作者
我觉得你这么写还是挺危险的,buf的值在执行完UART0_TR这个函数之后就会被释放。这个时候指向的内容有可能被别的地方修改了。要查原因,可以在第一次进入发送中断的地方看一下你uart0buffer的地址和内容分别是啥。内容有没有被修改

使用特权

评论回复
地板
ntao0227|  楼主 | 2010-1-24 19:11 | 只看该作者
是不是将uart0buffer的类型改成字符数组就可以规避这风险呢!

使用特权

评论回复
5
xinzha| | 2010-1-24 19:34 | 只看该作者
本帖最后由 xinzha 于 2010-1-24 19:44 编辑

这个问题几句话也说不清楚,你去网上搜搜华为c语言一级考试的培训资料吧,里面对这类问题有专门的讲解。
你的这个写法我个人觉得问题不是很大,因为是作为指针直接引用而不是作为临时字符串数组,所以编译器可能将字符串存放于const data区域,不会因为函数退出而销毁。

使用特权

评论回复
6
caijie| | 2010-4-26 14:29 | 只看该作者
呵呵 到http://www.**/blog/hnclcj/下一个LPC2XXX的UART程序就OK了 可以参照那个 自己再理解下

使用特权

评论回复
7
caijie| | 2010-4-26 14:35 | 只看该作者
这个是UART TIMER VIC管理 的程序 很适合你参考学习 有问题邮件给我

V02.rar

36.91 KB

使用特权

评论回复
8
caijie| | 2010-4-26 14:35 | 只看该作者
里面包含了一个UART的测试程序 使用了我写的VIC的管理程序

使用特权

评论回复
9
caijie| | 2010-4-26 14:38 | 只看该作者
这个版本的VIC是第1个版本 还没有完善 以后会更加合理跟完善的

使用特权

评论回复
10
金鱼木鱼| | 2010-4-28 14:26 | 只看该作者
你的串口线有问题没有?

使用特权

评论回复
11
ntao0227|  楼主 | 2010-5-5 21:20 | 只看该作者
好像处理速度匹配问题。加入延时和监控就好啦!谢谢!

使用特权

评论回复
12
alpha321| | 2010-5-30 16:57 | 只看该作者
感谢7楼, 学习了

使用特权

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

本版积分规则

12

主题

125

帖子

1

粉丝