搜索
bottom↓
回复: 5

串口发送数据丢失怎么回事?

[复制链接]

出0入0汤圆

发表于 2012-9-7 13:47:47 | 显示全部楼层 |阅读模式
比如发“12-34”可显示却是“1244”丢了三怎么回事,求高手解析
#include <reg52.h>
#include <intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char a,i,b,b1,a1,a2,b2,n,m,c,d;
static unsigned char data CN[10];
static unsigned char data CT;
uint Timer0_t;Timer0_cont;
typedef         bit                 BOOL ;
BOOL flag;
static uint Timer0_Spac=50;   //延时0.5秒
sbit DQ=P1^4;
uchar code seg7[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e};
uchar code table[]="OK ";
sbit P25=P2^5;
sbit P26=P2^6;
sbit P27=P2^7;
sbit buzzer=P0^6;

void delay1(uchar z)
{
        while(z--);
}


void display(uint mm)
{

  
           P0=seg7[mm];
           P2 |= 0xE0;
           P2 &= 0x1F;
           P0 = 0x02;
           P2 |= 0xC0;
           P2 &= 0x3F;
           delay1(10);
     
       
          
}

void display1(uint mm)
{

           P0=seg7[mm];
           P2 |= 0xE0;
           P2 &= 0x1F;
           P0 = 0x04;
           P2 |= 0xC0;
           P2 &= 0x3F;
           delay1(10);
      
       
}

void display2(uint mm)
{
   

             P0=seg7[mm];
           P2 |= 0xE0;
           P2 &= 0x1F;
           P0 = 0x20;
           P2 |= 0xC0;
           P2 &= 0x3F;
           delay1(10);
          
      
       
}

void display3(uint mm)
{
   

     P0=seg7[mm];
           P2 |= 0xE0;
           P2 &= 0x1F;
           P0 = 0x40;
           P2 |= 0xC0;
           P2 &= 0x3F;
           delay1(10);

   
       
}


uchar ASCII2HEX(uchar ASCIIData)                                //接收到的校验和作为Ascii码,需转换成16进制
{
        uchar HexData;

        if (ASCIIData==0x30)
        {
                HexData=0x00;
        }
        else if         (ASCIIData==0x31)
        {
                HexData=0x01;
        }
        else if         (ASCIIData==0x32)
        {
                HexData=0x02;
        }
        else if         (ASCIIData==0x33)
        {
                HexData=0x03;
        }
        else if         (ASCIIData==0x34)
        {
                HexData=0x04;
        }
        else if         (ASCIIData==0x35)
        {
                HexData=0x05;
        }
        else if         (ASCIIData==0x36)
        {
                HexData=0x06;
        }
        else if         (ASCIIData==0x37)
        {
                HexData=0x07;
        }
        else if         (ASCIIData==0x38)
        {
                HexData=0x08;
        }
        else if         (ASCIIData==0x39)
        {
                HexData=0x09;
        }
        return HexData;
}




void serinit()        //初始化
{
   TMOD=0x21;
   TH0 =0xd8;                                                                 //赋T0的预置值0x1000,溢出30次就是1秒钟
   TL0 =0xf0;
   TH1=0xf3;
   TL1=0xf3;
  
   TR1=1;
   REN=1;
   RI=0;
   TR0=1;
   SM0=0;
   SM1=1;
   EA=1;
   ES=1;

}
uint serial()
{         
     if(flag)
         {
                 ES=0;
                for(i=0;i<2;i++)
                {
                        SBUF=table[i];
                        while(!TI);
                        TI=0;
                }
               
                b=b1;
                a=b2;
                c=a1;
                d=a2;
                ES=1;
                flag=0;
         }
         return a,b,c,d;
}  
void COMOUT(uchar Data)
{
        SBUF=Data;
        while(!TI);
        TI=0;
}

void main()
{
         buzzer = 0;                    //高有效
        P25=1;
        P26=0;
        P27=1;
        P25=0;
        P26=0;
        P27=0;
        serinit();
        while(1)
        {

                  serial();
                  display(a);
              display1(b);
              display2(c);
              display3(d);       
         
        }
}       
void ser() interrupt 4  //接收成功后自动进入串口中断程序
{
               
if(RI)
   {
           Timer0_cont=0;       
           CN[CT] = SBUF;                                        //将寄存器数据传递给临时寄存器。
           if (CT>4)
           {
               CT=0;
           }
           CT++;
           RI=0;
           COMOUT(SBUF);
                   COMOUT(CT);

              if(CN[2]==0X2D && CT==4)
        {
         
                               b2=ASCII2HEX(CN[0]);
                                b1=ASCII2HEX(CN[1]);
                                a2=ASCII2HEX(CN[3]);
                                a1=ASCII2HEX(CN[4]);

                               
                                for(i=0;i<10;i++)
                                {
                                        CN[i]=0;
                                }
                                CT=0;
        flag=1;   //标志位置一       
//        serial();          
        }
          
     
   }

}

void timer0_int(void) interrupt 1                        // 定时器0中断是1号
{
        uchar i;
//        TR0=0;
        TH0 =0xd8;                                                                
        TL0 =0xf0;
    Timer0_cont++;
   

        if (Timer0_cont>=Timer0_Spac)                        //串口数据定时复位
         {               
            TR0=0;
                 for (i=0;i<10;i++)
                {
                         CN[i]=0;
                }
                CT=0;
                Timer0_cont=0;
///                ES=1;
        }
       TR0=1;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-9-7 15:11:58 | 显示全部楼层
好长啊

建议去看看 【程序调试黑宝书】

这么长的程序除了作者没人想看

************************************

我的想法是:

     换一个数据试试,看看还是不是第三个数据出问题?

     是,那就是说数据转换出现问题,可以锁定那部分

     不是?楼主自己找原因、、、、、、

    我的建议(来自黑宝书):分模块调试,一部分一部分调试,具体看黑宝书

出0入0汤圆

发表于 2012-9-7 15:13:57 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-9-7 22:18:24 | 显示全部楼层
uchar ASCII2HEX(uchar ASCIIData)                                //接收到的校验和作为Ascii码,需转换成16进制
{
        uchar HexData;

        if (ASCIIData==0x30)
        {
                HexData=0x00;
        }
        else if         (ASCIIData==0x31)
        {
                HexData=0x01;
        }
        else if         (ASCIIData==0x32)
        {
                HexData=0x02;
        }
        else if         (ASCIIData==0x33)
        {
                HexData=0x03;
        }
        else if         (ASCIIData==0x34)
        {
                HexData=0x04;
        }
        else if         (ASCIIData==0x35)
        {
                HexData=0x05;
        }
        else if         (ASCIIData==0x36)
        {
                HexData=0x06;
        }
        else if         (ASCIIData==0x37)
        {
                HexData=0x07;
        }
        else if         (ASCIIData==0x38)
        {
                HexData=0x08;
        }
        else if         (ASCIIData==0x39)
        {
                HexData=0x09;
        }
        return HexData;
}


太长了,优化一下

uchar ASCII2HEX(uchar ASCIIData)                                //接收到的校验和作为Ascii码,需转换成16进制
{
        uchar HexData;
        HexData = ASCIIData - 0x30;
        return HexData;
}


出0入0汤圆

发表于 2012-9-8 00:09:22 | 显示全部楼层
HeP028 发表于 2012-9-7 22:18
uchar ASCII2HEX(uchar ASCIIData)                                //接收到的校验和作为Ascii码,需转换 ...

不错,程序优化,赞一个

出0入0汤圆

 楼主| 发表于 2012-9-10 08:40:58 | 显示全部楼层
y574924080 发表于 2012-9-7 15:11
好长啊

建议去看看 【程序调试黑宝书】

恩恩好的谢谢 啊。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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