RS-485是半双工的通讯方法,发送和接纳共用同一物理信道。在恣意时刻只允许一台单机处于发送状况。因而要求应对的单机必须在侦听到总线上呼叫信号现已发送结束,而且没有其它单机宣布应对信号的情况下,才干应对。半双工通讯对主机和从机的发送和接纳时序有严厉的要求。假如在时序上合作欠好,就会产生总线抵触,使整个体系的通讯瘫痪,无法正常作业。要使总线上的设备在时序上严厉合作。在复位时,使主从机都处于接纳状况。
MAX3082的发送和接纳转化是由芯片的RE/和DE端操控的。RE/=1,DE=1时,MAX3082处于发送状况;RE/=0,DE=0时,MAX3082处于接纳状况。一般运用单片机的一个IO口衔接RE/和DE端。在上电复位时,我们硬件电路安稳需求必定的时刻,而且单片机各端口复位后处于高电平状况,这样就会使总线上各个分机处于发送状况,我们上电时各电路不安稳,或许向总线发送信息。因而,假如用一根口线作发送和接纳操控信号,应该将口线反向后接入MAX3082的操控端,使上电时MAX3082处于接纳状况。别的,在主从机软件上也应做处理办法,如:上电时或通讯之前,对串行口做几回空操作,铲除端口的不合法数据和指令。
RS-485的通讯程序编写和RS-232没有太大差异,假如运用一个IO口操控MAX3082的RE/和DE端口,RS-485只比RS-232多了一个接纳和发送的转化操控位。初始化串口时,使该位处于低电平,即接纳状况。发送数据时,使该位先为高,发送完数据后拉低。程序如下:
sbitRS485_EP3^5//发送,接纳操控位
void UART1_Init(void)
{
SCON = 0x50;//方法1,8位数据,可变波特率
RS485_E= 0;//置低,接纳
TMOD|= 0x20;//定时器1,方法2,8位自重载
PCON = 0x00;//波特率倍频制止
TH1= 0xfd;//晶振22.1184MHz,波特率19200;
TL1= 0xfd;
IE|= 0x90;//开中止
IP= 0x10;
TR1= 1;//发动定时器
}
void UART1_Send_Char(const INT8U dt)
{
SBUF= dt;
while(!TI);
TI = 0;
}
void UART1_Send_String(INT8U *str, INT8U len)
{
INT8U i;
RS485_E= 1;//置高,发送
ES= 0;
for(i=0; i { UART1_Send_Char(*(str+i)); } RS485_E= 0;//置低,接纳 ES= 1; }
void UART1_Interrupt(void) interrupt 4
{
RS485_E = 0;//接纳
ES = 0;
if(RI)
{
//中止接纳数据
}
ES = 1;
}