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