📄 serial.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 + -