📄 comu485.c
字号:
#include "reg52.H"
#include "Typedef.H"
#include "UserDef.H"
#include "Comu485.H"
#define BAUD 1200
#define T_Baud8_0 (256 - F_OSC/BAUD/12/32) //SMOD=0
#define T_Baud8_1 (256 - F_OSC/BAUD/12/16) //SMOD=1
/*
通讯协议:
BoF + 地址 + 数据(变长)+ EoF ; 支持ESC换码
因为本范例中数据及地址由主机的键盘输入,因此,只能产生‘0’~‘9’有限数字。
*/
/* */
#define CC_BOF '1'
#define CC_EOF '2'
#define CC_ESC '3'
/* 全局变量 */
INT8U comu_recv_len = 0;
INT8U idata Rxbuf[32];
static INT8U iRx=0;
static INT8U idata Txbuf[32];
static INT8U iTx=0;
static INT8U myaddr;
sbit P_Tx = P3^2; /* RS485芯片的发送/接收工作状态控制 */
/***************************************
串口初始化
入口参数:
返回值:
****************************************/
void comu_init(INT8U addr)
{
/* 串口通讯相关定时器设置 */
TMOD &= 0x0F; //定时器1 :自动再装入8位定时器
TMOD |= 0x20;
TH1 = T_Baud8_0;TL1=T_Baud8_0; //波特率
/* 串口配置 */
SCON = 0x50; //方式1,SM2=0,8Bits,REN=1
PCON = 0x00; //SMOD=0
// PCON = 0x80; //SMOD=1
myaddr = addr;
P_Tx = 0;
ES = TRUE; //串口中断允许
TR1 = TRUE; //启动波特率定时器
}
/* 对发送内容进行格式化,加上BoF,EoF,以及在需要时换码,并发送头一个字符,以启动发送序列 */
void comu485_send_packet(INT8U * send_data,INT8U len)
{
INT8U c,i;
Txbuf[0] = CC_BOF;
i = 1;
while (len!=0)
{
c = *send_data;
if ((c==CC_BOF) || (c==CC_EOF) || (c==CC_ESC))
{
Txbuf[i] = CC_ESC;
i ++;
Txbuf[i] = ~c;
i ++;
}
else
{
Txbuf[i] = c;
i ++;
}
send_data ++;
len --;
}
Txbuf[i] = CC_EOF;
P_Tx = 1;
iTx = 0;
SBUF = CC_BOF;
}
/* 对接收到的内容进行处理,去除可能存在的换码,返回接收到的字节数 */
INT8U comu485_recv_packet(INT8U len)
{
INT8U i,n;
i = 0;
n = 0;
while (i<len)
{
if (Rxbuf[i] == CC_ESC)
{
i ++;
Rxbuf[n] = ~Rxbuf[i];
}
else
{
Rxbuf[n] = Rxbuf[i];
}
n ++;
i ++;
}
return n;
}
//-------------------------------------
// 串口中断
//-------------------------------------
void int_comu(void) interrupt 4 using 2
{
INT8U c;
/* 发送中断 */
if (TI)
{
TI = FALSE;
if (Txbuf[iTx] == CC_EOF)
{
P_Tx = 0;
}
else
{
iTx ++;
SBUF = Txbuf[iTx];
}
}
/* 接收中断 */
if (RI)
{
RI = FALSE;
c = SBUF;
if (c == CC_BOF)
{
iRx = 0;
}
else if (c == CC_EOF)
{
comu_recv_len = comu485_recv_packet(iRx);
if (Rxbuf[0] != myaddr)
{
comu_recv_len = 0;
}
}
else
{
Rxbuf[iRx] = c;
iRx ++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -