📄 485_master.c
字号:
#include<msp430x24x.h>
#include"485_master.h"
//硬件信息:P3.5口接485的使能端口
#define _485_Receive_EN P5OUT |=BIT5
#define _485_Drive_EN P5OUT &=~BIT5
//0x02:请求从机想主机发送数据的命令
//0XFF:让从机复位的命令,注意:0XFF是作为地址发送的
//Slave_addresss,为从机的地址
/************************************
函数名称:
功 能:与从机通信
参 数:n为连续收的字节个数
描 述:注意,这里的command 一定要是0x02
***********************************/
void Rs485_master(unsigned char Slave_address,unsigned char command,
unsigned char n,unsigned char Rx_BUF[3])
{
P5DIR |=BIT5; //让P3.5一直为输出
unsigned char aa;
unsigned char i;
unsigned char p;
_485_Drive_EN ;
UCA1TXBUF=Slave_address; //第一步,将从机地址发送出去
while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;//等待地址发送完毕
_485_Receive_EN;
while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG;//等待从机返回地址
if(UCA1RXBUF!=Slave_address)Rs485_error(); //如果从机返回的地址不符合,则命令这个从机继续等待
else //如果从机返回的地址符合
{
_485_Drive_EN;
UCA1CTL1 &=~UCTXADDR; //告诉主机,下面的一桢为数据,而不是地址
UCA1TXBUF=command; //将命令发送出去
while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;//等待地址发送完毕
_485_Receive_EN;
while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG; //等待从机返回地址
aa=UCA1RXBUF; //将从机返回的数据赋给aa
if((aa==0x80)){UCA1CTL1 |=UCTXADDR ;Rs485_error();} //如果从机返回的数据为0X80(非法命令),则让从机复位
else
{
if((command==0x02)&(aa==0x02)) //如果发送的命令为0x02,并且从机返回的也为0X02
{
while(1)
{
p=0; //清校验和
for(i=0;i<n;i++) //下面将从机发过来的数据接收下来,放在Rx_data里面
{
_485_Receive_EN;
while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG; //等待从机返回地址
Rx_BUF[i]=UCA1RXBUF;
p+=Rx_BUF[i];
}
while(!(UC1IFG&UCA1RXIFG)); UC1IFG&=~UCA1RXIFG; //等待从机发校验和P过来
if(p==UCA1RXBUF) //如果校验和相同,则发送0X00
{
_485_Drive_EN;
UCA1TXBUF=0x00;
while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;
break;
}
else //如果校验和不同,则让从机复位
{
_485_Drive_EN;
UCA1TXBUF=0xff;
while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;
}
UCA1CTL1 |=UCTXADDR ; //接收完后,又要告诉主机,下面的为地址侦从而重复上面的过程
}//while(1)
}//if((aa&==0x02)&(command==0x02))
}//else
}//else
}// Rs485_master
/************************************
函数名称:
功 能:DELAY函数
参 数:
返回 值 :
***********************************/
void Rs485__Delay(unsigned char n)
{
unsigned char i;
for(i=0;i<10;i++)
{
while(n!=0)
n--;
}
}
/************************************
函数名称:
功 能:当发送或者接收出错时,error函数就给从机发送一个复位命令
参 数:
返回 值 :
***********************************/
void Rs485_error(void)
{
_485_Drive_EN;
UCA1TXBUF=0xff; ; //0XFF为命令从机等待的命令,当从机收到OXFF的命令,则进入等待状态
while(!(UC1IFG&UCA1TXIFG)); UC1IFG&=~UCA1TXIFG;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -