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

📄 uart.c

📁 说明在程序里
💻 C
字号:
#define __UART_SOURCE__
#include <reg52.h>
#include "UART.h"
#include "x5045.h"

/**********************************************************************
  模块名: XX
  日  期: 2002-11-14 
  说  明:     


  日期: 2002-11-14
  修改:
  说明: 版本定为1.02


  日期:
  修改:
  说明:


  日期:
  修改:
  说明:

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

// 函数名称: UART_ReceiveDgm()
// 函数说明: 串口接收一条的报文处理程序
// 返回值  : void  :  无
void UART_ReceiveDgm()
{
    BYTE bt_temp;
	// 将接收到的字符转存到bt_temp
    bt_temp  = SBUF;  
    if(b_EndFlag)
    {
		b_EndFlag  =  FALSE;
		b_Start    =  FALSE;
		b_IsSaveOk =  FALSE;
		if(bt_BCC ==  bt_temp)
		{ 
			// 如果BCC校验正确就置位b_HandleFlag位
			b_RecData  =  TRUE; 
			// 闪通信指示
			COMMLED    =  ~COMMLED;
		}
		else
		{   // 否则丢弃报文并且清相关标志位
			b_EndFlag  =  FALSE;
			b_Start    =  FALSE;
			b_IsSaveOk =  FALSE;
			b_IsAddrOk =  FALSE;
			b_IsTypeOk =  FALSE; 
			bt_ReceiveDataCount = 0;
		}
		//  等待下一次接收
		SM2        =  TRUE;
    }
	switch(bt_temp)
	{
    case ACK:
		{   // 如果是ACK应答就清b_WaitACK
			b_WaitACK = FALSE;
		} 
		break;
	case STX:
		{
			// 接收到起始字节SM2清0
			SM2               = FALSE;  
			// 接收计数器清0
			bt_ReceiveDataCount  = 0;  
			bt_BCC            = STX; 
			// 存入接收数组
			bt_ReceiveBuf[bt_ReceiveDataCount++]  = STX; 
			// 收到起始字符就置位b_Start位
			b_Start           = TRUE; 
			// 指示下一个是地址号
			b_IsAddrOk        = TRUE;  
			b_IsTypeOk        = FALSE;  
		}
		break;
	case ETX:
		{
			if(b_Start)        
			{
				// 如果没有收到起始字符而收到结束字符就认为出错不予理睬
				b_EndFlag   =  TRUE;
				b_Start     =  FALSE;
				bt_ReceiveBuf[bt_ReceiveDataCount] = ETX;
				bt_BCC     ^=  ETX;
			}
		}
		break;
    case TestChar:
		{
			// 闪通信指示灯
			COMMLED  =  ~COMMLED;
			b_RecTestChar = TRUE; 
		}
		break;
	default:
		{
			if(b_IsTypeOk)
			{
				b_IsTypeOk = FALSE;
				// 置位储存位
				b_IsSaveOk = TRUE;  
				if(bt_temp != DEVICETYPE)
				{   // 类型号不符
					b_Start     = FALSE;  
					b_IsSaveOk  = FALSE;  
					SM2   = TRUE;
					return;
				}
			}
			if(b_IsAddrOk)
			{   
				b_IsAddrOk = FALSE;
				b_IsTypeOk = TRUE;
				b_IsSaveOk = TRUE; 
				if(bt_temp != bt_ADDR)
				{
					// 地址号不符
					b_Start    = FALSE;
					b_IsTypeOk = FALSE;
					b_IsSaveOk = FALSE;  
					SM2        = TRUE;
					return;
				}
			}
			if(b_IsSaveOk) 
			{   
				// 如果存储位有效就存入接收数组
				bt_ReceiveBuf[bt_ReceiveDataCount++] = bt_temp;
				bt_BCC ^= bt_temp;
			}
		}
		break;
	}
}

// 函数名称: UARTIntHandler
// 函数说明: 串口中断服务程序
// 返回值  : void  :  无
void UART_IntHandler() interrupt 4
{
	// 这种状态不应当出现,但如出现了我们使接收缓冲区中的数据无效
	if(TI)
	{
		TI                  = FALSE;
		SM2                 = FALSE;
		bt_ReceiveDataCount = 0;
		b_IsAddrOk          = FALSE;
		b_IsSaveOk          = FALSE;
		b_IsTypeOk          = FALSE;
		b_Start             = FALSE;
		return;
	}
	else 
	{
		RI                  = FALSE;
		UART_ReceiveDgm();
	}
}

// 函数名称: UART_Init
// 函数说明: 串口的初始化
// 返回值  : void  :  无
void UART_Init()
{
	SCON         = 0xf0;
	// 允许接收485总线数据
    RD485_Enable();
	b_RecData    = FALSE;
	b_IsAddrOk   = FALSE;
	b_IsSaveOk   = FALSE;
	b_IsTypeOk   = FALSE;
    b_Start      = FALSE;
    b_EndFlag    = FALSE;	
}

// 函数名称: UART_SendDgm
// 函数说明: 向串口发送报文
// 返回值  : void  :  无
// 参数说明: char* pcCmd  : 报文数据指针 
// 参数说明: BYTE btCount : 报文数据的个数
void UART_SendDgm(BYTE* pcDgm,BYTE btCount)
{
	BYTE i;
	WR485_Enable();
	// 关闭串口中断
    ES   =  FALSE;  
	for(i = 0;i < btCount; i ++)
	{
		SBUF = pcDgm[i];
		// 等待发送完成后,发送下一个字节
		while(!TI);
		TI   = FALSE;
	}
	// 允许接收485总线的数据
	RD485_Enable();
    ES   =  TRUE;
}




// 函数名称: UART_SendDgm_to232
// 函数说明: 向232串口发送报文
// 返回值  : void  :  无
// 参数说明: char* pcCmd  : 报文数据指针 
// 参数说明: BYTE btCount : 报文数据的个数
void UART_SendDgm_to232(BYTE* pcDgm,BYTE btCount)
{
	BYTE i;
	// 允许向232写数据
	WR232_Enable();
    SCON =  0xb0;
    ES   =  FALSE;  
	for(i = 0;i < btCount; i ++)
	{
        X5045_WatchDog();
        if(i == 0)
        { 
			TB8  =  TRUE;
        }
        else
        {
			TB8  =  FALSE;
        }
		SBUF = pcDgm[i];
		// 等待发送完成后,发送下一个字节
		while(!TI);
		TI   = FALSE;
	}
    ES   =  TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -