⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs485.c

📁 基于单片机PIC30F系列的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 + -