📄 rs485.c
字号:
#include "p30fxxxx.h"
#include "RS485.h"
#include "common.h"
void __attribute__((__interrupt__)) _U2RXInterrupt(void) //串口2接收中断
{
IFS1bits.U2RXIF=0;
ConvData.ReceiveData=U2RXREG;
RecvDataBuf[RecvDataLen++]=ConvData.Change[0];
if(1==CheckAddressOK)
{
if(RecvDataLen-1==RecvDataBuf[1])
{
if(Check_Sum(RecvDataBuf,RecvDataLen))
{
CheckMessageOK=1;
CheckAddressOK=0;
U2STAbits.ADDEN=1;
}
else
{
CheckMessageOK=0;
U2STAbits.ADDEN=1;
RecvDataLen=0;
}
}
}
if(1==U2RXREGbits.URX8)
{
if(HOST_ADDRESS==RecvDataBuf[0])
{
U2STAbits.ADDEN=0;
CheckAddressOK=1;
}
else
{
RecvDataLen=0;
U2STAbits.ADDEN=1;
CheckAddressOK=0;
}
}
/* if(1==U2RXREGbits.URX8)
{
if(HOST_ADDRESS==RecvDataBuf[0])
{
U2STAbits.ADDEN=0;
CheckAddressOK=1;
}
else
{
RecvDataLen=0;
}
}
else if(1==CheckAddressOK)
{
if(RecvDataLen-1==RecvDataBuf[1])
{
if(Check_Sum(RecvDataBuf,RecvDataLen))
{
CheckMessageOK=1;
CheckAddressOK=0;
U2STAbits.ADDEN=1;
}
else
{
CheckMessageOK=0;
U2STAbits.ADDEN=1;
}
}
}
else
{
RecvDataLen=0;
}*/
}
void RS485_Init(void)
{
U2BRG=(FCY/16/BAUDRATE)-1; //设置波特率为9600
U2MODEbits.UARTEN=0; //暂时关闭串口
U2MODEbits.PDSEL=3; //九位数据,无奇偶校验位
U2MODEbits.STSEL=0; //一个停止位
U2MODEbits.ABAUD=1;
U2STAbits.UTXISEL=1; //发送缓冲器空时,产生中断
U2STAbits.UTXEN=0; //暂时禁止发送
U2STAbits.URXISEL=0;
U2STAbits.ADDEN=1; //地址检测模式使能
U2RXREG=0X0000; //清发送缓冲和接受缓冲
U2TXREG=0X0000;
IFS1bits.U2TXIF = 0;
IFS1bits.U2RXIF = 0; //清除中断标志
IEC1bits.U2TXIE = 0;
IEC1bits.U2RXIE = 1; //开启串口中断
IPC6bits.U2TXIP = 6;
IPC6bits.U2RXIP = 6; //发送接受优先级3级
}
void Send_Message(unsigned char Address) //发送地址位
{
unsigned int i;
//RECV_DISABLE;
//SEND_ENABLE;
PORTG=0x0003;
U2TXREG=(1<<8)|Address;
for(i=10000;i>0;i--);
while(!U2STAbits.TRMT);
PORTG=0x0000;
//RECV_ENABLE;
//SEND_DISABLE;
}
unsigned char Check_Sum(unsigned char *CheckData,unsigned char Len) //计算校验和
{
unsigned char i;
unsigned char AddSum;
for(i=1;i<Len;i++)
{
AddSum+=RecvDataBuf[i];
}
if(0==AddSum)
{
return 1;
}
else
{
return 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -