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

📄 serial.c

📁 利用C8051F31x的SMBus总线实现对射频读写芯片的基本读写
💻 C
字号:
/*************************************************************************/
#include "serial.h" 


/*************************************************************************/
/* 定义常量 */
#define NULL ((void *) 0L)
#define DB_SENDMAXSIZE 14	/* 待送数据最大长度 */
#define DB_RECMAXSIZE 14	/* 待接收数据最大长度 */


/*************************************************************************/
/* 定义全局变量 */
extern BYTE CommSendBufferHead, CommSendBufferTail;
extern BYTE CommRecBufferHead, CommRecBufferTail;
BYTE idata CommSendBuffer[DB_SENDMAXSIZE]; 
BYTE idata CommRecBuffer[DB_RECMAXSIZE]; 
bit SendIt; 	/* 串行口传送旗标 */
BYTE Count50ms;

/*****************************************************************
函数名称:	void OpenComm(void)
功能描述:	初始化串行口,参数归零
输入:		无
输出:		无
*****************************************************************/
void OpenComm(void) 
{
	UART_Init();
	for (CommSendBufferHead=0;CommSendBufferHead<DB_SENDMAXSIZE;CommSendBufferHead++)
	{
		CommSendBuffer[CommSendBufferHead]=0;	/* 清发送缓冲区 */
	}
	for (CommRecBufferHead=0;CommRecBufferHead<DB_RECMAXSIZE;CommRecBufferHead++)
	{
		CommRecBuffer[CommRecBufferHead]=0;		/* 清接收缓冲区 */
	}

	CommSendBufferHead=CommSendBufferTail=0; 	/* 设置头和尾到鼓型缓冲区的基地址0 */
	CommRecBufferHead=CommRecBufferTail=0;
	SendIt=1;
	REN0=1;		/* 允许接收 */
	ES0=1; 		/* 允许串行中断 */
}


/*****************************************************************
函数名称:	void SendCommChar(char ch)
功能描述:	复制ch所指定的字符到鼓型缓冲区
输入:		char ch - 复制的字符
输出:		无
*****************************************************************/
void SendCommChar(char ch)
{
	CommSendBuffer[CommSendBufferTail]=ch; 			/* 复制当前字节 */
	CommSendBufferTail++; 							/* 调节指针 */
	if (CommSendBufferTail==DB_SENDMAXSIZE)
		CommSendBufferTail=0; 						/* 考核指针是否重叠 */
	if (SendIt)										/* 如果字节需要传送 */
	{	 
//		M485 = 1;									/* RS485置为发送 */
		sleep_ms(100);								/* 延时 */
		SBUF0=CommSendBuffer[CommSendBufferHead]; 	/* 送数据 */
		SendIt=0;
	}
//	M485 = 0;										/* RS485置为接收 */
	return ;
}


/*****************************************************************
函数名称:	void SendCommBuffer(BYTE *base,BYTE size)
功能描述:	复制第一个参数base所指定的存储器数据到鼓型缓冲区
输入: 		base - 待复制数据的所在位置
			BYTE size - 复制的字节长度
输出:		无
*****************************************************************/
void SendCommBuffer(BYTE *base, BYTE size) 
{
	BYTE i=0;
	if (!size || base==NULL) { return; }			/* 核查是否NULL缓冲区 */
	while (i<size) 
	{	 /* 如果base中有数据,且鼓型缓冲区有空间后进行数据复制 */
		CommSendBuffer[CommSendBufferTail]=base[i]; /* 复制当前字节 */
		i++;
		CommSendBufferTail++; 						/* 调节指针 */
		if (CommSendBufferTail==DB_SENDMAXSIZE)
		{ 											/* 核对指针重叠 */
			CommSendBufferTail=0;
		}
	}
	if (SendIt)
	{	 											/* 如果有字节需要串送 */
		M485 = 1;									/* RS485置为发送 */
		sleep_ms(100);								/* 延时 */
		SBUF0=CommSendBuffer[CommSendBufferHead]; 	/* 送数据 */
		SendIt=0;
	}
	M485 = 0;										/* RS485置为接收 */
}


/*****************************************************************
函数名称:	void CommISR(void) interrupt 4
功能描述: 	串口中断服务子程序,如果鼓型缓冲区的头变量加1不等于尾变量

⌨️ 快捷键说明

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