📄 asyn_422.c
字号:
//------------------------------------------------------------------------------
#include "Asyn_422.H"
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//Comm Public:公有通用函数与成员
//------------------------------------------------------------------------------
int CommReceive(void *Buffer,int Count);
int CommSend(void *Buffer,int Count);
bit CommOpen(int Baud,Uchar DataBitNum,Uchar Parit,Uchar Stop,Uchar Crystal);
bit CommClose(void);
//------------------------------------------------------------------------------
//Comm Private:私有函数和成员
//------------------------------------------------------------------------------
void SetCommBaud(Uchar TMOD_in,Uchar PCON_in,Uchar TH1_in,Uchar TL1_in);
bool ReadReceiveBuf(Uchar *Byte);
bool WriteSendBuf(Uchar Byte);
xdata Uchar CommReceiveBuffer[CommMaxReceiveBuffer];
xdata Uchar CommSendBuffer[CommMaxSendBuffer];
Uchar CommReceive_Head;
Uchar CommReceive_Trail;
Uchar CommSend_Head;
Uchar CommSend_Trail;
bool TXDIsWorked;
//------------------------------------------------------------------------------
//函数实现部分
//------------------------------------------------------------------------------
//功 能:串口中断入口函数
//返回值:
//参 数:
//------------------------------------------------------------------------------
void CommEvent(void) interrupt 4 //using 3
{
if(RI)
{
RI=0;
CommReceiveBuffer[CommReceive_Head]=SBUF;
if(((CommReceive_Head+1)%CommMaxReceiveBuffer)!=CommReceive_Trail)
CommReceive_Head=(CommReceive_Head+1)%CommMaxReceiveBuffer;
return;
};//end if
if(TI)
{
TI=0;
if(CommSend_Trail==CommSend_Head)
{
_nop_();
_nop_();
_nop_();
MAX498_DE=false; //Comm Send Data Disable
_nop_();
_nop_();
_nop_();
TXDIsWorked=false;
return;
};//end if
CommSend_Trail=(CommSend_Trail+1)%CommMaxSendBuffer;
SBUF=CommSendBuffer[CommSend_Trail];
TXDIsWorked=true;
};//end if
}
//------------------------------------------------------------------------------
//功 能:从串口接收缓冲区中取得数据
//返回值:
// true: 从缓冲区中成功取得数据
// false: 从缓冲区中无法取得数据
//参 数: *Byte:从缓冲区中取得数据返回
//------------------------------------------------------------------------------
bool ReadReceiveBuf(Uchar *Byte)
{
if(CommReceive_Trail==CommReceive_Head) return false;
*Byte=CommReceiveBuffer[CommReceive_Trail];
CommReceive_Trail=(CommReceive_Trail+1)%CommMaxReceiveBuffer;
return true;
}
//------------------------------------------------------------------------------
//功 能:往串口发送缓冲区中写数据
//返回值:
// true: 往缓冲区中写数据成功
// false: 从缓冲区中写数据失败
//参 数: Byte: 往缓冲区中写入的数据
//------------------------------------------------------------------------------
bool WriteSendBuf(Uchar Byte)
{
if((CommSend_Head+1)%CommMaxSendBuffer==CommSend_Trail) return false;
CommSend_Head=(CommSend_Head+1)%CommMaxSendBuffer;
CommSendBuffer[CommSend_Head]=Byte;
return true;
}
//------------------------------------------------------------------------------
//功 能:设置串口波特率
//返回值:
//参 数:
// TMOD_in:定时器模式输入;
// PCON_in:电源状态控制字输入;
// TH1_in: 定时计数器高位;
// TL1_in: 定时计数器低位;
//------------------------------------------------------------------------------
void SetCommBaud(Uchar TMOD_in,Uchar PCON_in,Uchar TH1_in,Uchar TL1_in)
{
TMOD_Map=(TMOD_Map&Time0_MOD)|TMOD_in;
SetTMOD(TMOD_Map);
PCON=PCON_in;
TH1=TH1_in;
TL1=TL1_in;
}
//------------------------------------------------------------------------------
//功 能:打开串口
//返回值:
//参 数:
// Baud: 串口波特率;(50,110,600,1200,2400,4800,9600,19200,38400)
// DataBitNum:数据位数; (7,8,9,10)
// Parit: 奇偶校验位;(EvenParity,OddParity)
// Stop: 停止位; (1,2)
// Crystal: 晶振频率; (Cry6M,Cry12M)
//------------------------------------------------------------------------------
bit CommOpen(int Baud,Uchar DataBitNum,Uchar Parit,Uchar Stop,Uchar Crystal)
{
DataBitNum=NULL;
Stop=NULL;
SCON=0x50;
CommReceive_Head=0;
CommReceive_Trail=0;
CommSend_Head=0;
CommSend_Trail=0;
TXDIsWorked=false;
//set Comm Model
if(Parit==NoneParity) SCON=0x50;
if(Parit!=NoneParity) SCON=0xD0;
//Set Comm Baud
/*if(Crystal==Cry5_5296M)
{
if(Baud== 55) SetCommBaud(0x10,0x00,0xFE,0xEB);
if(Baud== 110) SetCommBaud(0x20,0x00,0x7D,0x7D);
if(Baud== 600) SetCommBaud(0x20,0x00,0xE8,0xE8);
if(Baud== 1200) SetCommBaud(0x20,0x00,0xF4,0xF4);
if(Baud== 2400) SetCommBaud(0x20,0x00,0xFA,0xFA);
if(Baud== 4800) SetCommBaud(0x20,0x00,0xFD,0xFD);
if(Baud== 9600) SetCommBaud(0x20,0x80,0xFD,0xFD);
if(Baud==19200) SetCommBaud(0x20,0x80,0xFE,0xFE);
};//end if
//if(Crystal==Cry11_0592M)
// {
// if(Baud== 110) SetCommBaud(0x10,0x00,0xFE,0xEB);
// if(Baud== 600) SetCommBaud(0x20,0x00,0xD0,0xD0);
// if(Baud== 1200) SetCommBaud(0x20,0x00,0xE8,0xE8);
// if(Baud== 2400) SetCommBaud(0x20,0x00,0xF4,0xF4);
// if(Baud== 4800) SetCommBaud(0x20,0x00,0xFA,0xFA);
// if(Baud== 9600) SetCommBaud(0x20,0x00,0xFD,0xFD);
// if(Baud== 19200) SetCommBaud(0x20,0x80,0xFD,0xFD);
// if(Baud== 38400) SetCommBaud(0x20,0x80,0xFE,0xFE);
// };//end if
if(Crystal==Cry22_1184M)
{
if(Baud== 220) SetCommBaud(0x10,0x00,0xFE,0xEB);
if(Baud== 600) SetCommBaud(0x20,0x00,0xA0,0xA0);
if(Baud== 1200) SetCommBaud(0x20,0x00,0xD0,0xD0);
if(Baud== 2400) SetCommBaud(0x20,0x00,0xE8,0xE8);
if(Baud== 4800) SetCommBaud(0x20,0x00,0xF4,0xF4);
if(Baud== 9600) SetCommBaud(0x20,0x00,0xFA,0xFA);
if(Baud== 19200) SetCommBaud(0x20,0x00,0xFD,0xFD);
if(Baud== 38400) SetCommBaud(0x20,0x80,0xFD,0xFD);
};//end if*/
if(Crystal==Cry40M)
{
if(Baud== 9600) SetCommBaud(0x20,0x80,0xEA,0xEA);
if(Baud== 19200) SetCommBaud(0x20,0x80,0xF5,0xF5);
};//end if
//Open Comm
TR1 =1;
ES =1;
MAX498_DE=false; //Comm Send Data Disable
return ES;
}
//------------------------------------------------------------------------------
//功 能:关闭串口
//返回值:
//参 数:
//------------------------------------------------------------------------------
/*bit CommClose(void)
{
ES=0; //Close Comm
CommReceive_Head=0;
CommReceive_Trail=0;
CommSend_Head=0;
CommSend_Trail=0;
return ES;
}*/
//------------------------------------------------------------------------------
//功 能:从串口中接收数据
//返回值:从串口中接收到的数据个数
//参 数:
// Buffer:接收数的缓冲区
// Count: 想从串口缓冲区中接收数据个数
//------------------------------------------------------------------------------
int CommReceive(void *Buffer,int Count)
{
Uchar Size=0;
while((Size<Count)&&(ReadReceiveBuf(Buffer)))
{
Size++;
Buffer=Buffer+1;
};//end while
return Size;
}
//------------------------------------------------------------------------------
//功 能:往串口发送数据
//返回值:已发送的数据个数
//参 数:
// Buffer:发送数据的缓冲区
// Count: 想从串口发送数据的个数
//------------------------------------------------------------------------------
int CommSend(void *Buffer,int Count)
{
Uchar Size=0;
while(Size<Count)
{
if(WriteSendBuf(*((Uchar *)Buffer)))
{
Size=Size+1;
Buffer=Buffer+1;
};//end if
if(!TXDIsWorked)
{
CommSend_Trail=(CommSend_Trail+1)%CommMaxSendBuffer;
_nop_();
_nop_();
_nop_();
MAX498_DE=true; //Comm Send Data Enable
_nop_();
_nop_();
_nop_();
SBUF=CommSendBuffer[CommSend_Trail];
TXDIsWorked=true;
};//end if
};//end while
return Size;
}
//------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -