小弟是单片机初学者,照书上整了个RS485的通信程序,怎么都搞不通,我用串口调试助手发什么命令,才能返回所读的AD值?求高人相助,帮忙修改,万分感谢。邮箱:342602815@qq.com
帧格式及程序如下:
起始字符:用于指示通信的开始。由两个字节组成,为两个F1H。 帧 头:一字节,用于说明通信帧的开始,68H。 字节数:一字节,用于指示该帧中的字节数目,其中不包括起始字符、帧头、检验值和帧尾; 帧标志:一字节,表示本帧数据是命令帧(A5H)还是数据帧(5AH),命令帧用于上位机向分机查询AD转换的数据,数据帧用于分机向上位机传送AD数据(8位)。 帧数据:每帧要发送的数据。 校验值:一字节,该校验为求和校验,即将帧头、字节数、帧标志和帧数据求和。 帧 尾:一字节,FAH。 命令帧的帧标志为A5H,帧中的数据为一字节的分机地址。数据帧的帧标志为5AH,帧中的数据为分机地址和AD值
#include
#include
#define uchar unsigned char
#define uint unsigned int
***it wr_0804=P1^0;
***it rd_0804=P1^1;
***it intr_0804=P1^2;
***it cs_0804=P1^3;
***it RS485E=P3^2; uchar address;
uchar idata data_buffer[20];
uint temp;
bit command_send;
//接收一字节子程序
uchar receive_data(void)
{
RI=0;
while(RI==0);
RI=0;
ACC=SBUF;
return ACC;
}
//发送一字节子程序
void send_data(uchar serial_data)
{
ti=0;
SBUF=serial_data;
while(TI==0);
TI=0;
} //接收一帧子程序
bit receive_one(uchar *s)
{
uchar CS=0x00,serial_data;
uchar i;
RI=0;
serial_data=SBUF;
if(serial_data!=0xf1)
return 0;
do{
serial_data=receive_data();
}while(serial_data==0xf1);
if(serial_data!=0x68)
return 0;
CS+=0x68; s[0]=receive_data();
CS+=s[0]; for(i=1;i<=s[0];i++)
{
s=receive_data();
CS+=s;
}
if(CS!=receive_data())
return 0;
if(receive_data!=0xfa)
return 0;
if(s[2]!=address)
return 0;
return 1; } //串口中断子函数
void RXD_INT(void) interrupt 4
{
P2=0;
if(RI)
CY=receive_one(data_buffer);
if(CY)
command_send=1;
} //发送一帧子程序
void send_one(uchar *s)
{
uchar CS=0x68;
uchar i;
RS485E=1;
send_data(0xf1);
send_data(0xf1);
send_data(0x68);
send_data(s[0]);
CS+=s[0];
for(i=1;i<=s[0];i++)
{
send_data(s);
CS+=s;
}
send_data(CS);
send_data(0xfa);
RS485E=0;
} //收到上位机的命令后,形成数据帧发送
void send_RH(uchar RH)
{
uchar dat[10];
dat[0]=4;
dat[1]=0x5a;
dat[2]=address;
dat[3]=RH;
send_one(dat);
} //获取从机地址
uchar get_address(void)
{
P0=0;
return P0;
} //初始化串口,设置波特率
void inital(void)
{
SCON=0x50;
TMOD=0x20;
TH1=0xFD; //波特率9600,不加倍
TL1=0xFD;
TR1=1;
EA=1;
ES=1;
address=get_address();
command_send=0;
} //ADC0804转换程序
uint get_RH()
{
intr_0804=1;
cs_0804=1;
rd_0804=1;
wr_0804=1; _nop_(); _nop_();
cs_0804=0;
wr_0804=0;
_nop_(); _nop_();
intr_0804=1;
rd_0804=0;
_nop_(); _nop_();
temp=P0; cs_0804=1;
rd_0804=1;
wr_0804=1;
return temp; } //主函数
void main()
{
int rrh;
inital(); while(1)
{
rrh=get_RH();
if(command_send==1)
{
send_RH(rrh);
command_send=0;
}
}
}
|