rs485接收中断函数使能_单片机485通讯的问题 只能接收到第一次的数据

本文档详细介绍了使用STC单片机进行串口485通信时,只能够接收到第一次数据的中断接收函数启用问题。通过提供初始化、数据发送和接收的代码示例,分析了可能存在的问题,并给出了中断配置和数据帧发送的解决方案。
摘要由CSDN通过智能技术生成

/******************************************

***

*PROJICT CODE:  串口程序

*CREATE DATE :  2017/10/20

*CREATED BY  :  CHneg

*FUNCTION    :  初始化 数据发送 数据 接收

*MODIFY DATE :  /

*DOCUMENT    :  STC DataSheet

*OTHERS      :  /

******************************************

***/

#include "main.h"

COMx_Define        COM1;

u8        idata TX1_Buffer[COM_TX1_Lenth];        //发送缓冲

u8         idata RX1_Buffer[COM_RX1_Lenth];        //接收缓冲

u8 ExtsAddr = 0x00;

u8 DestAddr = 0x01;

u8 RTUOverFlag=0,RTUStartFlag=0,UART_R_RTU[20],RTUFunc,

RTUPst,RTUDataLen,UARTRTUDataCheckedFlag=0;

u8 USART_Configuration(u8 UARTx, COMx_InitDefine *COMx)

{

u8        i;

u32        j;

if(UARTx == USART1)

{

COM1.id = 1;

COM1.TX_read    = 0;

COM1.TX_write   = 0;

COM1.B_TX_busy  = 0;

COM1.RX_Cnt     = 0;

COM1.RX_TimeOut = 0;

COM1.B_RX_OK    = 0;

for(i=0; i

for(i=0; i

if(COMx->UART_Mode > UART_9bit_BRTx)        return 1;        //模式错误

if(COMx->UART_Polity == PolityHigh)                PS = 1;        //高优先级中断

else                                                                        PS = 0;        //低优先级中断

SCON = (SCON & 0x3f) | COMx->UART_Mode;

if((COMx->UART_Mode == UART_9bit_BRTx) ||(COMx->UART_Mode == UART_8bit_BRTx))        //可变波特率

{

j = (MAIN_Fosc / 4) / COMx->UART_BaudRate;        //按1T计算

if(j >= 65536UL)        return 2;        //错误

j = 65536UL - j;

if(COMx->UART_BRT_Use == BRT_Timer1)

{

TR1 = 0;

AUXR &= ~0x01;                //S1 BRT Use Timer1;

TMOD &= ~(1<<6);        //Timer1 set As Timer

TMOD &= ~0x30;                //Timer1_16bitAutoReload;

AUXR |=  (1<<6);        //Timer1 set as 1T mode

TH1 = (u8)(j>>8);

TL1 = (u8)j;

ET1 = 0;        //禁止中断

TMOD &= ~0x40;        //定时

INT_CLKO &= ~0x02;        //不输出时钟

TR1  = 1;

}

else if(COMx->UART_BRT_Use == BRT_Timer2)

{

AUXR &= ~(1<<4);        //Timer stop

AUXR |= 0x01;                //S1 BRT Use Timer2;

AUXR &= ~(1<<3);        //Timer2 set As Timer

AUXR |=  (1<<2);        //Timer2 set as 1T mode

TH2 = (u8)(j>>8);

TL2 = (u8)j;

IE2  &= ~(1<<2);        //禁止中断

AUXR &= ~(1<<3);        //定时

AUXR |=  (1<<4);        //Timer run enable

}

else return 2;        //错误

}

else if(COMx->UART_Mode == UART_ShiftRight)

{

if(COMx->BaudRateDouble == ENABLE)        AUXR |=  (1<<5);        //固定波特率SysClk/2

else                                                                AUXR &= ~(1<<5);        //固定波特率SysClk/12

}

else if(COMx->UART_Mode == UART_9bit)        //固定波特率SysClk*2^SMOD/64

{

if(COMx->BaudRateDouble == ENABLE)        PCON |=  (1<<7);        //固定波特率SysClk/32

else                                                                PCON &= ~(1<<7);        //固定波特率SysClk/64

}

if(COMx->UART_Interrupt == ENABLE)        ES = 1;        //允许中断

else                                                                ES = 0;        //禁止中断

if(COMx->UART_RxEnable == ENABLE)        REN = 1;        //允许接收

else                                                                REN = 0;        //禁止接收

P_SW1 = (P_SW1 & 0x3f) | (COMx->UART_P_SW & 0xc0);        //切换IO

if(COMx->UART_RXD_TXD_Short == ENABLE)        PCON2 |=  (1<<4);        //内部短路RXD与TXD, 做中继, ENABLE,DISABLE

else                                                                        PCON2 &= ~(1<<4);

return        0;

}

return 3;        //其它错误

}

/*************** 装载串口发送缓冲 *******************************/

void TX1_write2buff(u8 dat)        //写入发送缓冲,指针+1

{

TX1_Buffer[COM1.TX_write] = dat;        //装发送缓冲

if(++COM1.TX_write >= COM_TX1_Lenth)        COM1.TX_write = 0;

if(COM1.B_TX_busy == 0)                //空闲

{

COM1.B_TX_busy = 1;                //标志忙

TI = 1;                                        //触发发送中断

}

}

void PrintString1(u8 *puts)  // 发送 字符串

{

for (; *puts != 0;        puts++)

TX1_write2buff(*puts);         //遇到停止符0结束

}

void MovCharSBuffer(unsigned char c)  //  数据帧定义及中断函数

{

SBUF=c;

while(TI!=1);

TI=0;

}

/**************发送数据帧函数***********************/

void Send_RTU(unsigned char DestAddr,unsigned char S_RTUFunc,unsigned char S_RTUDataLen,unsigned char *S_RTUData)

{

unsigned char i,S_RTUCheck;

ES=0;

EA=0;

REN=0;

//RTUDataLen=0x00;

delay_ms(1);

S_RTUCheck=0;

MovCharSBuffer(FrameHead);          // 0x40 @       /1  帧头

MovCharSBuffer(DestAddr);                   // 0x01                        /2

S_RTUCheck=S_RTUCheck+DestAddr;         // 0+ 0x01

MovCharSBuffer(S_RTUFunc);                   // 0x11                        /3

S_RTUCheck=S_RTUCheck+S_RTUFunc;         // 0x01 +0x11

MovCharSBuffer(S_RTUDataLen);                  // 0x07                        /4

S_RTUCheck=S_RTUCheck+S_RTUDataLen; // 0x12 +0x07 = 0x19

if(S_RTUDataLen!=0)

{

for(i=0;i

{

MovCharSBuffer(*S_RTUData);                                        //  /N* 数据

S_RTUCheck=S_RTUCheck+*S_RTUData;

S_RTUData++;

}

}

MovCharSBuffer(S_RTUCheck);                                                         // /7

MovCharSBuffer(0x23);                                                                // /8

ES=1;

EA=1;

REN=1;

}

/********************* UART1中断函数************************/

void UART1_int (void) interrupt UART1_VECTOR

{

if(RI)

{

RI = 0;

if(COM1.B_RX_OK == 0)

{

if(COM1.RX_Cnt >= COM_RX1_Lenth)

COM1.RX_Cnt = 0;

RX1_Buffer[COM1.RX_Cnt++] = SBUF;

COM1.RX_TimeOut = TimeOutSet1;

}

}

if(TI)

{

TI = 0;

if(COM1.TX_read != COM1.TX_write)

{

SBUF = TX1_Buffer[COM1.TX_read];

if(++COM1.TX_read >= COM_TX1_Lenth)

COM1.TX_read = 0;

}

else        COM1.B_TX_busy = 0;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值