有哪位大侠用华邦的78E516B做过串口的收发通信的??帮帮忙

pilot   2007-11-5 21:07 楼主
本人现在用飞利浦的p89c669与华邦的w78e56b进行通信
实现的功能为:由p89c669发送一串长度24个字节的命令,w78e516b在接收到这段命令后回传一段命令给p89c669,传输采用rs485,转换芯片为sn75176b
通路如下:

  p89c669<=>sn75176b<=>sn75176b<=>w78e516b

p89c669这边的程序已经完成,可以手动发送长度为24字节的命令
起先我不用串口中断进行收发 程序如下:
#pragma CODE /*DEBUG*/ OBJECTEXTEND NOAREGS
#include
#include
#include
#include "dpjsoftmain.h"

#define                Nop                _nop_();_nop_();_nop_();_nop_();

unsigned int i=0,o=0,sum=0;


unsigned char data Configure[24];        //存储局端发送过来的配置命令
unsigned char data Feedback[25];        //存储回给局端的命令




main()
{
//        InitialProcess();
         TMOD = 0x20;  /* T/C1 方式2*/
         TL1  = 0xf7;   
         TH1  = 0xf7;  //波特率19200
         PCON =        0x80;
         TR1  = 1;
         SCON = 0x50;  /* 串口方式1*/
         ES   = 0;     
         EA   = 0;
         WIDTH=0,ATT1=1,ATT2=0,CMC1=1; //各端口初始化
                 for(i=0;i<24;i++)
                {
                        Configure=0x00;
                }
                 Configure[1]=0x10;
        while(1)
        {       
                        DE1=0; //75176b准备接收
                        RI=0;
                        for (i = 0;i<24;i++)
                        {       
                                Configure = SBUF;
                                while(RI==0);
                                RI=0;                               
                        }

                        DE1=1;  //75176b准备发送
                        TI=0;
                       
                        for(i=0;i<24;i++)
                        {
                                SBUF = Configure;
                                while(TI==0);
                                TI=0;
                       
                        }               
                       
        }
}
此程序用调试助手观察w78e516b回上来的数据长度以及数值的大小均不对..
但是屏蔽掉接收部分,让78e516b自己发送时..数据确是正确的..
由于一直调不出来..所以后来网上看了些程序..加入了中断..
程序如下:
#pragma CODE /*DEBUG*/ OBJECTEXTEND NOAREGS
#include
#include
#include
#include "dpjsoftmain.h"

#define                Nop                _nop_();_nop_();_nop_();_nop_();

unsigned int i=0,o=0,sum=0;
//unsigned char sum;




unsigned char data Configure[25];        //存储局端发送过来的配置命令
unsigned char data Feedback[25];        //存储回给局端的命令


void com_inerrupt(void) interrupt 4 using 2
{
  if(RI)
    {
            RI=0;
            Configure=SBUF;
                i++;
    }
}





main()
{
//        InitialProcess();
         TMOD = 0x20;  /* T/C1 方式2*/
         TL1  = 0xf7;   
         TH1  = 0xf7;  
         PCON =        0x80;
         TR1  = 1;
         SCON = 0x50;  /* 串口方式1*/
         ET1  = 0;
         ES   = 1;     
         EA   = 1;
         WIDTH=0,ATT1=1,ATT2=0,CMC1=1;
                 for(i=0;i<24;i++)
                {
                        Configure=0x00;
                }
                 Configure[1]=0x10;
        while(1)
        {       
                        ES=1;
                        DE1=0;
                        RI=0;
                        while(1)
                        {
                                if(i==24)
                                {
                                        break;
                                }
                        }

                        ES=1;
                        DE1=1;
                        TI=0;
                       
                        for(i=0;i<24;i++)
                        {
                                SBUF = Configure;
                                while(TI==0);
                                TI=0;                       
                        }               
                       
        }
}
程序变的回不上来数据,但是很奇怪,由p89c669发送第一串长度为24字节的数据后,再由p89c669发送一串长度为16字节的数据后,w78e516b开始不停的回第一次发送的24字节的数据,所以我觉得数据应该是收下来了.

本人刚接触单片机没多久,而且学的很不系统,所以我估计中断那一块写的乱七八咱的..望高手们多指点指点.

回复评论 (1)

呃..这里的帖子居然不能编辑..
采用中断的时候有个地方写错了..主函数里接收的部分应该是
while(1)
{
        if(READ_COUNT==24)
        {
                break;
        }
}
中断中的i改成READ_COUNT
顺便顶一记..
点赞  2007-11-6 10:45
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复