打印

请教一下关于arm7与51单片机串行口通讯的问题

[复制链接]
1538|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
冰零分子|  楼主 | 2015-5-25 15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机发送部分:

                        ADV1=123;
                        ADV2=456;
                        ADV3=789;
                        printf("@%05u\n",ADV1);        
                        while(TI0==0);
                        delay(100);        
                        printf("#%05u\n",ADV2);
                        while(TI0==0);
                        delay(100);
                        printf("$%05u\n",ADV3);


ARM接收部分:

if((U1IIR & 0x0F) == 0x04)                // 接收数据可用 RDA
        {
                RxSign=U1RBR;
                if(RxSign=='@')
                {
                        for(i=0; i<13; i++)
                        {
                                RxBuf1[i] = U1RBR;                // "读取FIFO的数据,并清除中断        "
                        }
                }
                else if(RxSign=='#')
                {
                        for(i=0;i<13;i++)
                        {
                                RxBuf2[i] = U1RBR;        
                        }
                }
                else if(RxSign=='$')
                {
                        for(i=0;i<13;i++)
                        {
                                RxBuf3[i] = U1RBR;        
                        }
                }
        }
        else if((U1IIR & 0x0F) == 0x0C)                  //字符超时CTI 无中断挂起
        {
                while((U1LSR&0x01)==1)                   //U1RBR包含有效数据  
                {
                        if(i==0)
                                RxSign=U1RBR;
                        if(RxSign=='@')
                                RxBuf1[i-1] = U1RBR;                // 读取FIFO的数据,并清除中断        
                        else if(RxSign=='#')
                                RxBuf2[i-1] = U1RBR;
                        else if(RxSign=='$')
                                RxBuf3[i-1] = U1RBR;
                        i++;
                }

其中ARM  初始化U1FCR = 0xc1;                    触发点位14个字符

为什么RxBuf1接受的是123
RxBuf2和RxBuf3接收到的不是456,789而是56496,7855
刚接触串行通讯 网大神求解   
怎么才能使RxBuf2和RxBuf3能接收到正确数字?
先行谢谢各位

相关帖子

沙发
laoxianccc| | 2015-5-25 16:08 | 只看该作者
这样看也看不出什么,不过你可以试试把 一组一组单独试试接收的情况在分析,
还有就是你每次接受的数据都是56496,7855?
你这里只用了一个帧头判定,不一定很准确,你可以参考下面的链接看看。
http://blog.csdn.net/gszhy/article/details/8594433
这里面对串口接收部分的处理方式还是很不错的,我之前就用过这种方法成功接收到我要的数据

使用特权

评论回复
板凳
xuyaqi| | 2015-5-25 17:37 | 只看该作者
用串口调试分别测试单片机与ARM看问题出在那一个上面。

使用特权

评论回复
地板
冰零分子|  楼主 | 2015-5-26 10:47 | 只看该作者
laoxianccc 发表于 2015-5-25 16:08
这样看也看不出什么,不过你可以试试把 一组一组单独试试接收的情况在分析,
还有就是你每次接受的数据都是 ...

谢谢啊   我把接收部分改为
else if((U1IIR & 0x0F) == 0x0C)                  //字符超时CTI 无中断挂起
        {
                   if((U1LSR&0x01)==1)                // 接收数据可用 RDA
        {
                RxSign=U1RBR;
                if(RxSign=='@')
                {
                        for(i=0; i<13; i++)
                        {
                                RxBuf1 = U1RBR;                // "读取FIFO的数据,并清除中断        "
                        }
                }
                else if(RxSign=='&')
                {
                        for(i=0;i<13;i++)
                        {
                                RxBuf2 = U1RBR;       
                        }
                }
                else if(RxSign=='$')
                {
                        for(i=0;i<13;i++)
                        {
                                RxBuf3 = U1RBR;       
                        }
                }
                }

BUF3接收正常了   可能是延时不够字符超时CTI没有置位  就把延时延长到3000 buf2也收到正常数据了

本来以为是延时的问题   把延时保留接收改回去又不正常了  初步确定还是while部分的问题  

不过还没弄清是什么问题

使用特权

评论回复
5
冰零分子|  楼主 | 2015-5-26 10:47 | 只看该作者
xuyaqi 发表于 2015-5-25 17:37
用串口调试分别测试单片机与ARM看问题出在那一个上面。

恩恩 谢谢啊

使用特权

评论回复
6
laoxianccc| | 2015-5-27 08:33 | 只看该作者
冰零分子 发表于 2015-5-26 10:47
谢谢啊   我把接收部分改为
else if((U1IIR & 0x0F) == 0x0C)                  //字符超时CTI 无中断挂起
        {

ADV1=123;
                        ADV2=456;
                        ADV3=789;
                        printf("@%05u\n",ADV1);        
                        while(TI0==0);
                        delay(100);        
                        printf("#%05u\n",ADV2);
                        while(TI0==0);
                        delay(100);
                        printf("$%05u\n",ADV3);
最后的这个地方不加个while判定吗?

使用特权

评论回复
7
冰零分子|  楼主 | 2015-5-27 17:29 | 只看该作者
laoxianccc 发表于 2015-5-27 08:33
ADV1=123;
                        ADV2=456;
                        ADV3=789;

还没搞清楚   最终这样可以正常:
ADV1=123;
                        ADV2=456;
                        ADV3=789;
                       delay(3500);
                        printf("@%05u\n",ADV1);        
                        while(TI0==0);
                        delay(3500);   
                     
                        printf("#%05u\n",ADV2);
                        while(TI0==0);
                        delay(3500);
                        printf("$%05u\n",ADV3);


ARM接收部分:

if((U1IIR & 0x0F) == 0x04)                // 接收数据可用 RDA
        {
                RxSign=U1RBR;
                if(RxSign=='@')
                {
                        for(i=0; i<13; i++)
                        {
                                RxBuf1 = U1RBR;                // "读取FIFO的数据,并清除中断        "
                        }
                }
                else if(RxSign=='#')
                {
                        for(i=0;i<13;i++)
                        {
                                RxBuf2 = U1RBR;        
                        }
                }
                else if(RxSign=='$')
                {
                        for(i=0;i<13;i++)
                        {
                                RxBuf3 = U1RBR;        
                        }
                }
        }
        else if((U1IIR & 0x0F) == 0x0C)                  //字符超时CTI 无中断挂起
        {
                 if((U1LSR&0x01)==1)                // 接收数据可用 RDA
        {
                RxSign=U1RBR;
                if(RxSign=='@')
                {
                        for(i=0; i<13; i++)
                        {
                                RxBuf1 = U1RBR;                // "读取FIFO的数据,并清除中断        "
                        }
                }
                else if(RxSign=='&')
                {
                        for(i=0;i<13;i++)
                        {
                                RxBuf2 = U1RBR;        
                        }
                }
                else if(RxSign=='$')
                {
                        for(i=0;i<13;i++)
                        {
                                RxBuf3 = U1RBR;        
                        }
                }
                }

使用特权

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

本版积分规则

15

主题

950

帖子

19

粉丝