手电大家谈-手电筒爱好者之家

 找回密码
 注册成为会员,享受更多功能。

QQ登录

只需一步,快速开始

只需一步,快速开始

搜索
查看: 9707|回复: 14

[其他DIY] 关于串口接收和无线的问题,数据错位啊...[搞定了]

[复制链接]

该用户从未签到

发表于 2012-11-17 14:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册成为会员,享受更多功能。

x
本帖最后由 yixiti 于 2012-11-19 00:59 编辑

RT!
弄了对315M的无线模块
发射的搞定了,接收的是没有发射的信号就是乱码显示,有发射的信号就接收发射的信号,两边都是用的串口,就是RXD,TXD,三线的,还一个GND没有,因为是无线.发射的接单片机的TXD用来发射信号,接收的我先把接收模块的数据端接到串口线的TXD,就是连的电脑上,拿串口助手看都是正确的,因为有乱码所以需要把信号加工,弄了几个识别码啥的,可问题是在电脑上看接收的都是正常的...用单片机接收就会出现数据错误的问题...比如我发射端一直发射0XFF,用电脑看挺好,用单片机接收就乱了...程序我弄上来大家给看看的
中断用了两个,因为要数据的正确性所以要在电脑上验证,用定时器1发给电脑数据.看着发来的全是错的...开机发送的0X22是对的...用的虚拟串口,波特率2400,33M多的晶振设的...无线传输完在电脑上看正确的说明无线模块没问题..现在就是接收的程序的问题了......
#include<15f104e.h>
#define uchar unsigned char
#define uint unsigned int   

sbit RXD=P3^0;
sbit TXD=P3^1;   
sbit TM0_FLAG=P3^2;               //设传输标志位
sbit TM1_FLAG=P3^3;

uchar codes[2],recive[7];



void WaitTF0( void );  

void Init(void)                    //计数器及中断初始化
{  
    ET1=1;
        ET0=1;                          //允许定时器0中断   
    EA=1;                           //中断允许总开关
        //AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TMOD &= 0x0F;
        TL0 = 0x7F;                //设置定时初值
        TH0 = 0xFB;                //设置定时初值
        TF0 = 0;                //清除TF0标志
        TR0 = 0;                //定时器0使用时才开始计时

        TL1 = 0x7F;                //设置定时初值
        TH1 = 0xFB;                //设置定时初值
        TF1 = 0;                //清除TF0标志
        TR1 = 0;                //定时器0使用时才开始计时
        TM1_FLAG=0;
        TM0_FLAG=0;
}  


uchar RByte()                //接收一个字符  
{  
    uchar Output=0;  
    uchar i=8;  
    TR0=1;                          //启动Timer0   
    WaitTF0();                      //等过起始位   

    //发送8位数据位   
    while(i--)  
    {  
        Output >>=1;  
        if(RXD)  
            Output   |=0x80;        //先收低位   
        WaitTF0();                  //位间延时   
    }  
    while(!TM0_FLAG) if(RXD) break;  

    TR0=0;                          //停止Timer0   

    return Output;  
}  

         
void IntTimer0() interrupt 1        //中断1处理程序   
{  
     TM0_FLAG=1;                    //设置标志位。   
}
void IntTimer1() interrupt 3        //中断1处理程序   
{  
     TM1_FLAG=1;                    //设置标志位。   
}  
void WaitTF0( void )                 //查询传输标志位  
{  
    while(!TM0_FLAG);   
    TM0_FLAG=0;                      //清标志   
}
void WaitTF1( void )                 //查询传输标志位  
{  
    while(!TM1_FLAG);   
    TM1_FLAG=0;                      //清标志   
}  
bit StartBitOn()                        //检查是不是有起始位  
{  
    return   (RXD==0);   
}
void send(uchar input)        //发送一个字符   
{  
     //发送启始位   
     uchar i=8;  
     TR1=1;  
     TXD=(bit)0;  
     WaitTF1();  

     //发送8位数据位   
     while(i--)  
     {  
         TXD=(bit)(input&0x01);   //先传低位   
         WaitTF1();  
         input=input>>1;  
     }  

     //发送结束位   
     TXD=(bit)1;  
     WaitTF1();  
     TR1=0;  
}
void manch()//这是曼特斯特解码的函数..还没用到这呢...接收到的编完码的数据就不对...这函数里面还有的校验不用说跟本过不去了..
{
        uint i,j;
        uchar check;
               
        check=0xFF;
        for(i=2;i<6;i++)
        {
                 check=check^recive;
        }
        check=~check;
        if(check==recive[6])
        {        
                for(i=0;i<2;i++)
                {
                        codes=0x00;
                        for(j=0;j<4;j++)
                        {
                                codes=codes>>1;
                                if((recive[i*2+2]&0x03)==0x01)
                                {
                                        codes=codes|0x80;
                                }
                                if((recive[i*2+3]&0x03)==0x01)
                                {
                                        codes=codes|0x08;
                                }
                                recive[i*2+2]=recive[i*2+2]>>2;
                                recive[i*2+3]=recive[i*2+2]>>2;
                        }
                }
        }
}  
void main()  
{  
    uint i;
    Init();  
                   send(0x22);
        while(1)  
    {                          
        
                        /*if(StartBitOn())//这个判断RXD的函数用不用我不是太清楚...不过用了接收的还是有问题.不用的话0XA5这个起始标致位是按一下键就能收到的,不过下面的就都错了...
                        {
                                
                        send(RByte());
                        
                        } */
               
               
                        if(RByte()==0xa5)
                        {
                                
                                while(RXD);//和这个StartBitOn()是一个意思...
                                recive[2]=RByte();
                                while(RXD);
                                recive[3]=RByte();
                                while(RXD);
                                recive[4]=RByte();
                                while(RXD);
                                recive[5]=RByte();
                                while(RXD);
                                recive[6]=RByte();
                                send(0x23);
                                for(i=2;i<7;i++)
                                {
                                         send(recive);
                                }
                                Write(0xf0,0x00);
                                manch();
                        }
               
                if(codes[0]==0xaa)
                {
                  ;  //这块就是接收不成功
                }            
    }     
}  


已经搞定了,除了接收有问题另外解码也有问题~主要是清楚UART的状态就能明白了


回复 dsu_marcocopyright:copyright

使用道具 举报

该用户从未签到

发表于 2012-11-17 15:05 | 显示全部楼层
好久没见 LZ
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-11-17 15:11 | 显示全部楼层
嗯...现在忙活...上的少了
回复

使用道具 举报

头像被屏蔽

该用户从未签到

发表于 2012-11-17 15:24 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-11-17 15:39 | 显示全部楼层

是直接用TXD发,不过误码离近了还行,校验我也加了,还弄的归0码保证传输质量,这是单工的...重发就算了...搞不了...因为不知道收没收到,但是这都不是问题,问题是无线是好用的,走圈无线拿电脑看是全对的,但是用单片机接收串口数据就出错了...我估计就是单片机接收数据的问题,还有就是我以前试验那个收数据的函数,收一个成,收两个就不成了..不知道为啥...
回复

使用道具 举报

头像被屏蔽

该用户从未签到

发表于 2012-11-17 15:43 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽

该用户从未签到

发表于 2012-11-17 15:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2012-11-17 15:51 | 显示全部楼层
geniuskim 发表于 2012-11-17 15:43
用在什么产品上呢?

一般这类传输除非不在意误码,否则都会封包发送吧。

不是啥产品,就自己弄着玩的,串口是模拟出来的串口,因为STC的15没有硬件的串口寄存器,晶振是单片机内部的,应该挺准,内部能选用的,选的33.1776M的,问题是这不是出错,是就没对..不过是接收端的事,发射端用的一样的单片机一样的晶振频率,无线发射到串口线拿电脑收就全没问题
我是想先搞这个,不是成本的问题
回复

使用道具 举报

头像被屏蔽

该用户从未签到

发表于 2012-11-17 16:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

  • TA的每日心情
    开心
    2014-5-20 08:21
  • 签到天数: 38 天

    [LV.5]常住居民I

    发表于 2012-11-17 18:42 | 显示全部楼层
    学习了~~
    回复

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2012-11-17 19:00 | 显示全部楼层
    geniuskim 发表于 2012-11-17 16:00
    不妨先用电脑串口把接口部分调通?

    说实话这东西...要不是有特别用处可能意义不大。

    用电脑都是通的...现在就是单片机接收的程序问题,无线传输啥的都没问题了...
    其实也没特大用途.就为了玩
    回复

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2012-11-17 23:59 | 显示全部楼层
    geniuskim 发表于 2012-11-17 15:49
    这程序看了两眼还是看着好乱...

    要是哪里错了,也不是没可能。

    那玩意没有啊...程序复杂的地方可以不看...问题就是怎么不丢包
    回复

    使用道具 举报

    头像被屏蔽

    该用户从未签到

    发表于 2012-11-18 00:11 | 显示全部楼层
    提示: 作者被禁止或删除 内容自动屏蔽
    回复

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2012-11-18 00:52 | 显示全部楼层
    geniuskim 发表于 2012-11-18 00:11
    我纳闷就是,如果你用电脑串口发送,单片机接收正常,换无线模块发送给单片机就不正常。
    然而无线模块给 ...

    单片机就没收正常过..现在的问题是一个数据行,后面再有就不行了
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-11-16 16:38
  • 签到天数: 184 天

    [LV.7]常住居民III

    发表于 2012-11-18 18:43 | 显示全部楼层
    学习了~~
    回复

    使用道具 举报

    本版积分规则

    小黑屋|手机版|Archiver|论坛自带搜索|下载论坛app|手电大家谈-手电筒爱好者之家 ( 备案序号:鲁ICP备05002565号 )
    以上言论纯属个人观点,与手电大家谈立场无关。
    最佳浏览模式:1920*1080


    GMT+8, 2024-5-29 08:50 , Processed in 0.219052 second(s), 52 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表