打印

串口通信buffer值

[复制链接]
3074|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kusheng176|  楼主 | 2010-9-1 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我设置了8个8位buffer,用来装64个二级对管的状态值。
现在出现了2个问题:
1、我在调试窗口看到8个buffer的值是
buffer[0]=0x02;
buffer[1]=0x00;
buffer[2]=0x00;
buffer[3]=0x00;
buffer[4]=0x02;
buffer[5]=0x00;
buffer[6]=0x00;
buffer[7]=0x00;
但是用串口调试助手的16进制接受到的数据就是 04 04 00 00 00 00 00 00 04 04 00 00 00 00 00 00,相当于发送到PC机上的buffer值都左移了一位。

2、我每个buffer有8个字节,就如上面数据,为什么我发送过去的每个buffer的值都重复了一遍?理想状态应该是02 00 00 00 02 00 00 00

3、当每一轮的扫描开始时,当我没有改变二级对管的状态下,我的8个Buffer值应该为00 00 00 00 00 00 00 00;但是我用串口调试助手看到的值却是03 00 00 00 03 00 00 00,在调试窗口看到的buffer为:
buffer[0]=0x01;
buffer[1]=0x00;
buffer[2]=0x00;
buffer[3]=0x00;
buffer[4]=0x01;
buffer[5]=0x00;
buffer[6]=0x00;
buffer[7]=0x00;

我实在是不知道为什么,才来请教各位高手的。麻烦指点一下。。。谢谢了

相关帖子

沙发
kusheng176|  楼主 | 2010-9-1 15:46 | 只看该作者
void Turn_pa(unsigned char mask)                //对PA口数据进行存储
{
    unsigned char j;  
    for (j=0; j<8;j++)
    {
        if(num & 1)
        {
            buffer[j]|=1<<mask;
        }
        num >>= 1;
    }
}

void Turn_pb(unsigned char mask)           //对PB口数据进行存储
{
    unsigned char j;  
    for (j=0; j<8;j++)
    {
        if(num1 & 1)
        {
            buffer[j]|=1<<mask;
        }
        num1 >>= 1;
    }
}



void caiyang()
{
    uchar j;
        num=PA;
        num1=PB;
        Delay380us();
/*
    for(j=0;j<1;j++)                //扫描开始
        {
            PC=0xfe;                  
            Turn_pa(j);
                PC=0xfd;         
        }           
        for(j=1;j<2;j++)
        {
            Turn_pa(j);
                PC=0xfb;   
    }
        for(j=2;j<3;j++)
        {
            Turn_pa(j);
                PC=0xf7;   
    } */         
        for(j=3;j<4;j++)
        {          
            Turn_pa(j);
                   PC=0xef;
    }         
          
    for(j=4;j<5;j++)
        {       
                Turn_pb(j);                  
                PC=0xdf;
        }
        for(j=5;j<6;j++)
        {       
                Turn_pb(j);
                PC=0xbf;
        }        
        for(j=6;j<7;j++)
        {       
                Turn_pb(j);                  
                PC=0x7f;
        }        
        for(j=7;j<8;j++)                                                                                            
        {       
                Turn_pb(j);
        }            
        SendMsg();
    for(j=0;j<8;j++)
    {
      buffer[j]=0;
    }                   
        cishu++;
}                 


这是我采样的程序(我是菜鸟,所以程序写的这么繁琐。。。)
当我单独采样PA或者是PB的时候,问题3可以解决,但是一旦一起运行,就出现了。。。我也不知道为什么

使用特权

评论回复
板凳
alamo2009| | 2010-9-1 18:02 | 只看该作者
最好搭上仿真器,单步跟一下,发第一个数的时候,看看调试助手收到的是什么。
在这里buffer[j]|=1<<mask;设断点跟

使用特权

评论回复
地板
hotpower| | 2010-9-1 18:18 | 只看该作者
全发0x55看看,估计是串口的波特率加倍了。

使用特权

评论回复
5
原野之狼| | 2010-9-1 23:41 | 只看该作者
拿示波器打一下 看下你的波特率是否是你想要的

使用特权

评论回复
6
hotpower| | 2010-9-2 08:25 | 只看该作者
连续0x55基本能估算分析出波特率的差异。

使用特权

评论回复
7
kusheng176|  楼主 | 2010-9-2 14:49 | 只看该作者
6# hotpower
void main()
{
TMOD=0x20;                 //设置定时器1为工作方式2
TH1=0xfe;
TL1=0xfe;
TR1=1;
REN=1;
SM0=0;        //串口方式1
SM1=1;
num=0x55;  
SBUF=num;
while(TI==0);
TI=0;
}

我的晶振是6M的,波特率设置的9600。我发55,串口调试助手上看到的数值不对。请问下是什么原因呢?

使用特权

评论回复
8
kusheng176|  楼主 | 2010-9-2 14:52 | 只看该作者
3# alamo2009
我的这个是当有第一组数据(8位)到来时,把这8位数据分别存放到8个缓存器的第一位,然后以此类推,直到把这8个缓存器全部存满,然后进行发送。
分步看的话,也不会准确的吧

使用特权

评论回复
9
kusheng176|  楼主 | 2010-9-3 12:54 | 只看该作者
请问下有人知道原因么?

使用特权

评论回复
10
kusheng176|  楼主 | 2010-9-3 15:05 | 只看该作者
波特率的问题我解决了。我每扫描完一次,就发送一次数据。(没有进行采样)
扫描第一次:00 00 00 00 00 00 00 10;第二次:01 00 00 01 00 00 00 10;后面就一直是这个值了。
但是我buffer的高四位和第四位分开测试的时候,数据就是对的:00 00 00 00 00 00 00 00

还有一个问题:就是当我采样为0E 00 00 00 0E 00 00 00时;用串口看到的值却是1C 00 00 00 1C 00 00 00;貌似串口将整个数据都左移了一位(上述干扰问题还是存在的,只是没有列出);而且单独测试最高位的时候,仿真的时候可以看到数据,但是串口却读不出来。

请问下原因?谢谢了

使用特权

评论回复
11
kusheng176|  楼主 | 2010-9-4 11:39 | 只看该作者
请问还有指导么?

使用特权

评论回复
12
kusheng176|  楼主 | 2010-9-7 15:16 | 只看该作者
再问。。。

使用特权

评论回复
13
kusheng176|  楼主 | 2010-9-9 08:44 | 只看该作者
继续。。。

使用特权

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

本版积分规则

0

主题

64

帖子

1

粉丝