本人现在用飞利浦的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字节的数据,所以我觉得数据应该是收下来了.
本人刚接触单片机没多久,而且学的很不系统,所以我估计中断那一块写的乱七八咱的..望高手们多指点指点.
呃..这里的帖子居然不能编辑..
采用中断的时候有个地方写错了..主函数里接收的部分应该是
while(1)
{
if(READ_COUNT==24)
{
break;
}
}
中断中的i改成READ_COUNT
顺便顶一记..