📄 uart2_rs485.c
字号:
/*****************************************************************************/
/*+++++++++++++++++++++++++++++ DsPIC30F6010A +++++++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++ UART2---》rs485 ++++++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++ 源文件 +++++++++++++++++++++++++++++++++++*/
/*****************************************************************************/
#include <p30f6010A.h>
#include "UART2_RS485.h"
/*****************************************************************************/
/*RS485输入输出切换控制引脚*/
#define RD LATDbits.LATD1 //1;input;
/*485通讯变量定义*/
unsigned char functionF,RXnum; //功能标志字,接收存储位置
unsigned int receive[8]; //接收缓冲数组
unsigned int monitor_data[10]; //监视发送数组
unsigned int set_data[3]; //设置发送数组
/* inverter */
void INIT_UART2_485(void)
{
TRISDbits.TRISD1=0;
/** 5MHZ 2400
U2BRG=129; // 波特率需要设定2400
U2STA=0x0000;
U2MODE=0x8000; // 使能UART
U2STAbits.UTXEN=1; // 使能发送
IEC1bits.U2RXIE=1; // 接收使用中断
IPC6bits.U2RXIP=6;
IFS1bits.U2RXIF=0;
**/
/** 10MHZ 9600**/
U2BRG=64; // 波特率需要设定9600
U2STA=0x0000;
U2MODE=0x8000; // 使能UART
U2STAbits.UTXEN=1; // 使能发送
IEC1bits.U2RXIE=1; // 接收使用中断
IPC6bits.U2RXIP=6;
IFS1bits.U2RXIF=0;
RD=1; //input
// ClrWdt();
/*
unsigned char i=0;
for(;i<12;i++)
{monitor_data[i]=i;}
*/
monitor_data[0]=0;
monitor_data[1]=1;
monitor_data[2]=2;
monitor_data[3]=3;
monitor_data[4]=4;
monitor_data[5]=5;
monitor_data[6]=6;
monitor_data[7]=7;
monitor_data[8]=8;
monitor_data[9]=9;
set_data[0]=0x0010;
set_data[1]=0x0020;
set_data[2]=0x0030;
}
/*发送一个字节*/
void UART2_Send485(unsigned int t)
{
U2MODEbits.UARTEN=1;
U2STAbits.UTXEN=1; //使能发送器
//开始发送一个字节(8位)
U2TXREG=t&0x00ff; //发送低字节
do{
;
}while(U2STAbits.TRMT==0);
U2STAbits.TRMT=0;
//一个字节传送完毕
// ClrWdt();
}
/*实时数据*/
void SendMonitor485(void)
{
RD=0;//
unsigned int send_temp=0;
// UART2_Send485(0x00E0); //功能代码
// UART2_Send485(0x00E0); //功能代码
UART2_Send485(0x00aa); //验证性报头
UART2_Send485(0x0055); //
UART2_Send485(0x00aa); //
UART2_Send485(0x0055); //
UART2_Send485(0x00aa); //
UART2_Send485(0x0055); //验证性报头
UART2_Send485(0x00E0); //功能代码
UART2_Send485(0x00E0); //功能代码
UART2_Send485(MyAddress); //地址站号
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
// send_temp=0x0401;
// UART2_Send485(send_temp);
// send_temp=0x0401;
// send_temp=send_temp>>8;
// UART2_Send485(send_temp); //data1
//
// send_temp=0x0302;
// UART2_Send485(send_temp);
// send_temp=0x0302;
// send_temp=send_temp>>8;
// UART2_Send485(send_temp); //data2
//
// send_temp=0x0203;
// UART2_Send485(send_temp);
// send_temp=0x0203;
// send_temp=send_temp>>8;
// UART2_Send485(send_temp); //data3
//
// send_temp=0x0104;
// UART2_Send485(send_temp);
// send_temp=0x0104;
// send_temp=send_temp>>8;
// UART2_Send485(send_temp); //data4
unsigned char num;
for(num=0;num<10;num++) //发送监视数组中的所有数据
{
send_temp=monitor_data[num];
UART2_Send485(send_temp);
send_temp=monitor_data[num];
send_temp=send_temp>>8;
UART2_Send485(send_temp);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
UART2_Send485(0x000d); //结束码
/*
UART2_Send485(0x00e0);
UART2_Send485(0x00e0);
*/
receive[0]=0; //清除接收存储区
receive[1]=0;
receive[2]=0;
receive[3]=0;
receive[4]=0;
receive[5]=0;
RD=1;
}
/*设置值*/
void SendSet485(void)
{
UART2_Send485(0xEA);
UART2_Send485(MyAddress);
UART2_Send485(receive[2]);
UART2_Send485(set_data[1]); //set_data数组
UART2_Send485(set_data[2]);
UART2_Send485(0x0d);
receive[0]=0;
receive[1]=0;
receive[2]=0;
receive[3]=0;
receive[4]=0;
receive[5]=0;
}
/*通讯功能*/
void communicate485(void)
{
RD=1;
if(receive[1]!=MyAddress)return; //地址
else
{
RD=0;
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
//中断使能屏蔽
IEC1bits.U2RXIE=0; // 接收使用中断
//
functionF=receive[0];
if((functionF==0xe0)){RD=0;SendMonitor485();}//&&(receive[2]==0x0d)
// else if((functionF==0xea)&&(receive[5]==0x0d)){RD=0;SendSet485();}
else {asm("nop");} //RD=0:output;UART2_Send485(255);
}
IEC1bits.U2RXIE=1; // 接收使用中断
//中断使能恢复
RD=1; //receive
// ClrWdt();
/***********************************************************************
//响应
RD=0;
unsigned char check_num=0;
for(;check_num<8;check_num++)
{
if(receive[(check_num+8-2)%8]==0x00e0)
{
if(receive[(check_num+8-1)%8]==MyAddress)
if(receive[check_num]==0x000d)
functionF=0x00e0;
}
else functionF=0;
}
if(functionF==0x00e0){RD=0;SendMonitor485();}
RD=1;
************************************************************************/
}
/*接收功能在中断程序中完成*/
void __attribute__((__interrupt__,auto_psv)) _U2RXInterrupt(void)
{
IFS1bits.U2RXIF=0;
/**********************************************************************/
receive[RXnum]=U2RXREG&0x00ff;
/* switch(receive[0])
{
case 0x00e0:
if(RXnum<2)RXnum++; // e0 01(YY) 0d
else RXnum=0;
break;
case 0xe5:
if(RXnum>2)RXnum=0;
else RXnum++;
break;
case 0x00ea: // ea 01(YY) XX xx xx 0d
if(RXnum<5)RXnum++;
else RXnum=0;
break;
default:
receive[0]=0; receive[1]=0; receive[2]=0;
receive[3]=0; receive[4]=0; receive[5]=0;
RXnum=0;
}
if(RXnum>5)RXnum=0;
*/
if( receive[0]==0x00e0)
{
if(RXnum<2)RXnum++; // e0 01(YY) 0d
else RXnum=0;
}
else
{
receive[0]=0; receive[1]=0; receive[2]=0;
receive[3]=0; receive[4]=0; receive[5]=0;
RXnum=0;
}
/***********************************************************************/
/***********************************************************************
//只做接收
receive[RXnum]=U2RXREG & 0x00ff;
if(RXnum<8)RXnum++;
else RXnum=0;
************************************************************************/
U2STAbits.FERR=0;
U2STAbits.OERR=0;
IFS1bits.U2RXIF=0; // 清接收中断标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -