3114|2

54

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于89c669串口0中断接收的问题 [复制链接]

我的程序如下:
//串口0用于与微机通信,接到微机数据包后不做改变,原封返回数据包
//晶振:11.0592MHz    波特率:2400
#include

sbit DOG = P3^2;
sbit LED = P3^3;

void InitUart0(void);
void InitTimer0(void);
void Uart0Interrupt(void);
void Timer0Interrupt(void);
void Uart0SendByte(unsigned char dat);
void delay(unsigned int times);

unsigned char i = 0;
unsigned int j,t;
unsigned char nbuff[7];
unsigned char rinbuff[20] = {0};
bit RFlag;

void main(void)
{
        EA = 0;
        InitTimer0();
        delay(100);
        InitUart0();
        delay(100);
        EA = 1;

        while(1)
        {
                 DOG = !DOG;
                if(RFlag)
                {
                        for(j = 0; j < 6; j++)
                        {
                                Uart0SendByte(nbuff[j]);
//                                delay(100);
                        }
                        RFlag = 0;
                }       
        }
}

void InitUart0(void)
{
        ES0 = 0;
        S0STAT = 0x20;
        PCON &= 0x1f;
        TMOD |= 0x20;          // timer1为自动重装模式
        TH1 = 0xe8;                // 设置串口1的波特率为2400
        TL1 = 0xe8;
        TR1 = 1;
        S0CON = 0x50;        // SM0_0 = 0, SM1_0 = 1(串口模式1), SM2_0 = 0, REN_0 = 1(允许收中断), TI_0 = 0, RI_0 = 0, TB8_0 = 0, RB8_0 = 0,
        ES0 = 1;
}

void InitTimer0(void)
{
        TMOD = 0x01;
        TH0 = 0x03;                // 定时10毫秒
        TL0 = 0x00;
        ET0 = 1;
        TR0 = 1;
}

void Uart0Interrupt(void) interrupt 4
{
        unsigned char dat;

        if(RI_0)
        {
                RI_0 = 0;
                dat = S0BUF;

                if(i < 7)
                {                       
                        nbuff = dat;
                        i++;
                }
                else
                {
                        RFlag = 1;
                        i = 0;
                }
        }
}

void Timer0Interrupt(void) interrupt 1
{
        TH0 = 0x03;
        TL0 = 0x00;
        t++;
        if(t == 20)
        {
                LED = !LED;
                t = 0;
        }
}

void Uart0SendByte(unsigned char dat)
{
        S0BUF = dat;
        while(TI_0 == 0);
        TI_0 = 0;
}

void delay(unsigned int times)
{
        unsigned int a;
        for(a = 0; a < times; a++);
}       
产生问题:
我通过串口调试助手向89c669发送6个字节“aa 00 00 00 00 ff”,接收的字节为“AA 00 00 00 00 FF 00 00 00 FF AA 00 00 FF AA 00 00 00 AA 00 00 00 00 FF 00 00 00 FF AA 00 00 FF AA 00 00 00 AA 00 00 00 00 FF 00 00 00 FF AA 00 00 FF AA 00 00 00 AA 00 00 00 00 FF ”。波特率的初始值虽然和书上给的范例不一样,但是这里的初始值经过试验是没有问题的,但是为什么数据包里的数据会产生错位,我一直弄不明白,这里特向诸位大侠求救,先谢谢诸位了!!

最新回复

这里先谢谢这位仁兄了,小弟再有什么地方不懂还望你不吝赐教!!  详情 回复 发表于 2008-10-22 19:36
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
收发之间用一个bit位进行一下判断,在收时停止发送,发送完进行收同关闭发送

推荐一种方法,做一个数组,接受程序顺序写入数组,发送程序从数组取数据(先进先出的堆),注意在写和读数组时判断当前数组的状态。

参照我项目中的这段收发代码,主程序从ribuf读出写入到tibuf即可。


  1. #define TIBUFMAX    12
  2. #define RIBUFMAX    12

  3. idata unsigned char tibufcount=0,ribufcount=0;
  4. idata unsigned char tirear,rirear;
  5. idata unsigned char tibuf[TIBUFMAX];
  6. idata unsigned char ribuf[RIBUFMAX];
  7. bit ti_wait = 1;

  8. //----------------------------------------------------------------------------------------------
  9. void InitComm()
  10. {

  11. //   TMOD = 0x21; //定时器0(T/C0)8Bit-reload,定时器1(T/C1)8Bit-reload
  12.     SCON  = 0x50;//串行口方式1
  13.     ES    = 1;   //允许串行口中断
  14.     TH1 = 0xfb;
  15.     TR1 = 1;
  16. }

  17. //----------------------------------------------------------------------------------------------
  18. void WrRiBuf(unsigned char c)
  19. {
  20.         ribuf[rirear] = c;
  21.         rirear++;
  22.         if(rirear == RIBUFMAX) rirear = 0;
  23.         if(ribufcount != RIBUFMAX) ribufcount++;
  24. }
  25. //----------------------------------------------------------------------------------------------
  26. unsigned char RdRiBuf()
  27. {
  28.         char p;
  29.         unsigned char c;
  30.        
  31.         ES = 0;
  32.         p = rirear - ribufcount;
  33.         if(p < 0) p = RIBUFMAX + p;
  34.         ribufcount--;
  35.         c = ribuf[p];
  36.         ES = 1;
  37.         return c;
  38. }
  39. //----------------------------------------------------------------------------------------------
  40. void WrTiBuf(unsigned char c)
  41. {
  42.         tibuf[tirear] = c;
  43.         tirear++;
  44.         if(tirear == TIBUFMAX) tirear = 0;
  45.         if(tibufcount != TIBUFMAX) tibufcount++;
  46.         if (ti_wait)
  47.         {
  48.                 ti_wait = 0;
  49.                 TI =1;
  50.         }
  51. }
  52. //----------------------------------------------------------------------------------------------
  53. unsigned char RdTiBuf()
  54. {
  55.         char p;
  56.         unsigned char c;
  57.        
  58.         p = tirear - tibufcount;
  59.         if(p < 0) p = TIBUFMAX + p;
  60.         tibufcount--;
  61.         c = tibuf[p];
  62.         return c;
  63. }
  64. //----------------------------------------------------------------------------------------------
  65. void IntComm(void) interrupt 4
  66. {
  67.     if(RI)
  68.     {   RI = 0;
  69.         WrRiBuf(SBUF);
  70.     }
  71.         if(TI)
  72.         {
  73.                 TI = 0;
  74.                 if(tibufcount) SBUF = RdTiBuf();
  75.                 else ti_wait = 1;
  76.         }
  77. }

复制代码
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这里先谢谢这位仁兄了,小弟再有什么地方不懂还望你不吝赐教!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表