📄 serial.c
字号:
#include "serial.h"
#include "..\main\port.h"
#include "..\main\ext_reg.h"
#include <intrins.h>
#define NOP() {_nop_(); _nop_();}
void Serial_Init()
{
// Serial init
PCON &= 0x7F; // Set SMOD bit to 0 (don't double baud rates)
SCON = 0x52;
TMOD |= 0x20; // T1 in mode 2, 8-bit auto reload
TH1 = (256 - (uchar)((((unsigned long)OSC_FREQ / 100) * 3125)
/ ((unsigned long) BAUD_RATE * OSC_PER_INST * 1000)));
// TH1 = 0xf4;
TL1 = TH1;
TR1 = 1; // Run the timer
TI = 1; // Send first character (dummy)
// Interrupt *NOT* enabled
ES = 0;
RS485EN = 0;
RS_RecvPrt = 0; //接收指针
RS_RecvPrcePrt = 0; //接收处理指针
RS_SendPrt = 0; //发送指针
RS_SendPrcePrt = 0; //发送处理指针
// HiRS_SendPrt = 0; //发送指针
// HiRS_SendPrcePrt = 0; //发送处理指针
bRS_SendPrce = 0;
}
/*------------------------------------------------------------------*-
Serial_Update()
-*------------------------------------------------------------------*/
void Serial_Update()
{
static uchar idata RecvState = RECID1; //接收状态
static uchar idata Len; //数据包长度
static uchar idata VerSum; //校验和
static uchar idata RecvPtr; //接收数据指针
static uchar idata Recv_Idle_Count=0;
if(TI == 1)
{
TI = 0;
if(mTranLen)
{
RS485EN = 1;
NOP();
SBUF = mTran_Buff[mTranPtr][RS_SendPrcePrt];
mTranPtr++;
if(mTranPtr >= mTranLen)
{
mTranPtr = 0;
mTranLen = 0;
}
}
else
{
RS485EN = 0; // 485Recv
bRS_SendPrce = 0;
if((++RS_SendPrcePrt)>=N_RS_SEND)
{ RS_SendPrcePrt = 0; }
}
}
// Only dealing with received bytes here
// -> Just check the RI flag
if((Recv_Idle_Count++)>50)
{
Recv_Idle_Count = 0;
RecvState = RECID1;
}
if (RI == 1)
{
RI = 0;
Recv_Idle_Count = 0;
switch(RecvState)
{
case RECID1:
if(SBUF == 0xaa)
{
RecvState = RECID2;
}
break;
case RECID2:
if(SBUF == 0x83)
{
RecvState = RECLEN;
}
else
{
RecvState = RECID1;
}
break;
case RECLEN:
Len = SBUF;
if((Len>=RECVBUFFLEN)||(Len<2))
{
RecvState = RECID1;
break;
}
VerSum = Len;
RecvPtr = 0;
RecvState = RECBUF;
break;
case RECBUF:
mRecv_Buff[RecvPtr][RS_RecvPrt] = SBUF;
RecvPtr++;
VerSum = VerSum^SBUF;
if((RecvPtr+1)>=Len)
{
RecvState = RECSUM;
}
break;
case RECSUM:
if(VerSum == SBUF)
{
if((++RS_RecvPrt)>=N_RS_RECV)
{ RS_RecvPrt = 0; }
}
RecvState = RECID1;
break;
default:
RecvState = RECID1;
break;
}
}
}
/*------------------------------------------------------------------*/
void Serial_Send()
{
uchar i,len;
if(bRS_SendPrce) return;
if(RS_GetSendCount()==0) return;
len = mTran_Buff[2][RS_SendPrcePrt];
if((len>=TRANBUFFLEN)||(len<2))
{
if((++RS_SendPrcePrt)>=N_RS_SEND)
{ RS_SendPrcePrt = 0; }
return;
}
mTran_Buff[0][RS_SendPrcePrt] = 0xbb;
mTran_Buff[1][RS_SendPrcePrt] = 0x83;
mTran_Buff[2][RS_SendPrcePrt] = len+1;
mTran_Buff[len+3][RS_SendPrcePrt] = len+1; //从长度字开始校验
for(i=0;i<len;i++)
{
mTran_Buff[len+3][RS_SendPrcePrt] ^= mTran_Buff[i+3][RS_SendPrcePrt];
}
mTranPtr = 0;
mTranLen = len+4; // 0xaa,0x83,len,crc (4Bytes)
bRS_SendPrce = 1;
TI = 1; //重要
}
//(1)、发送缓冲区中待处理信息信息数
uchar RS_GetSendCount()
{
if(RS_SendPrt >= RS_SendPrcePrt)
{
return (RS_SendPrt - RS_SendPrcePrt);
}
else
{
return (N_RS_SEND + RS_SendPrt - RS_SendPrcePrt + 1);
}
}
//(2)、接收缓冲区中待处理信息信息数
uchar RS_GetRecvCount()
{
if(RS_RecvPrt >= RS_RecvPrcePrt)
{
return (RS_RecvPrt - RS_RecvPrcePrt);
}
else
{
return (N_RS_RECV + RS_RecvPrt - RS_RecvPrcePrt + 1);
}
}
/*------------------------------------------------------------------*-
---- END OF FILE -------------------------------------------------
-*------------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -