📄 serial.c
字号:
//-------------------------------------------------------------------------
// Filename : Serial.C
// Language : C for AT89S8252
// Revision : 1.0
// Initial Date : 07/10/2000
// Last Modify :
// System clock : 24.00MHZ
// Description : Panel controller serial communication Plc64i32o
//-------------------------------------------------------------------------
#define _SERIAL_H_
#include <reg52.h>
#include "serial.h"
#undef _SERIAL_H_
//-------------------------------------------------------------------------
bit TransOK;
bit ReceEnd;
bit ReceData;
bit SerialMode;
unsigned char out_proc;
unsigned char in_proc;
unsigned char reply_wait;
sbit DE_RE = P3^2;
//-------------------------------------------------------------------------
void _init_serial (unsigned baud)
{
RCAP2H = baud/256;
RCAP2L = baud%256;
T2CON = 0x34;
SCON = 0x70; // serial port mothed 1
ES = ON; // open serial port interrupt
ReceData = TRUE;
DE_RE = RXENABL; // enable receive
SerialMode = RXENABL;
in_proc = RECE_STFLAG;
}
//-------------------------------------------------------------------------
void _trf_msge (char a,char c,char l)
{
TransOK = FALSE;
TranStream.address = a;
TranStream.command = c;
TranStream.length = l;
SerialMode = TXENABL;
DE_RE = TXENABL;
SBUF = 0x7e;
out_proc = SEND_ADDRESS;
}
//-------------------------------------------------------------------------
void _out_comm(void) using 3
{
if (TI == 1){
TI = 0;
if (SerialMode == TXENABL){
switch (out_proc){
case SEND_ADDRESS :
SBUF=TranStream.address;
out_proc++;
break;
case SEND_COMMAND :
SBUF=TranStream.command;
out_proc++;
break;
case SEND_LENGTH :
SBUF=TranStream.length;
if (!TranStream.length)
out_proc = SEND_WAIT;
else{
out_proc++;
TranStream.data_ptr = 0;
TranStream.checksum = 0;}
break;
case SEND_DATABLK :
SBUF = TranStream.datablk[TranStream.data_ptr];
TranStream.checksum += TranStream.datablk[TranStream.data_ptr];
if (++TranStream.data_ptr == TranStream.length)
out_proc++;
break;
case SEND_CHKSUM :
SBUF = TranStream.checksum;
out_proc++;
break;
case SEND_WAIT :
DE_RE = RXENABL;
out_proc++;
reply_wait = RECENABL;
break;
case SEND_END :
DE_RE = RXENABL;
SerialMode = RXENABL;
out_proc = SEND_ADDRESS;
}
}
else
DE_RE = RXENABL;
}
}
//-------------------------------------------------------------------------
void _in_comm (void) using 3
{
if (RI == 1){
RI = 0;
if (reply_wait == RECENABL){
if(SBUF == 0x66)
TransOK=PASS;
else
TransOK=FALSE;
reply_wait = OFF;
DE_RE = TXENABL;
SBUF = 0x3c;
}
if (SerialMode == RXENABL){
switch (in_proc){
case RECE_STFLAG :
if (SBUF == 0x7e)
in_proc++;
break;
case RECE_ADDRESS :
if (SBUF == ReceStream.address)
in_proc++;
else
in_proc = RECE_STFLAG;
break;
case RECE_COMMAND :
ReceStream.command = SBUF;
in_proc++;
break;
case RECE_LENGTH :
ReceStream.length = SBUF;
if (!ReceStream.length){
in_proc = RECE_END;
DE_RE = TXENABL;
SBUF = 0x66;}
else{
in_proc++;
ReceStream.data_ptr = 0;
ReceStream.checksum = 0;}
break;
case RECE_DATABLK :
ReceStream.datablk[ReceStream.data_ptr++] = SBUF;
ReceStream.checksum += SBUF;
if (ReceStream.data_ptr == ReceStream.length)
in_proc++;
break;
case RECE_CHKSUM :
DE_RE = TXENABL;
if (ReceStream.checksum == SBUF){
SBUF = 0x66;
ReceData = TRUE;}
else{
SBUF = 0xff;
ReceData = WRONG;}
in_proc++;
break;
case RECE_END :
if (SBUF == 0x3c)
ReceEnd = FINISH;
else
ReceEnd = FAILURE;
DE_RE = RXENABL;
SerialMode = RXENABL;
in_proc = RECE_STFLAG;
}
}
}
}
//-------------------------------------------------------------------------
// serial: serial receiver / transmitter interrupt
//-------------------------------------------------------------------------
serial () interrupt 4 using 3 // use registerbank 3 for interrupt
{
unsigned char i;
unsigned char length;
_in_comm();
_out_comm();
if (ReceEnd == FINISH){
if (ReceData == TRUE){
rece_com = ReceStream.command;
ReceEnd = OFF;
if (ReceStream.length){
length = ReceStream.length + 1;
for (i=0; i<length; i++){
rece_data[i] = ReceStream.datablk[i];
}
}
}
}
}
//-------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -