📄 串口通讯.h
字号:
#include<extern_var.h>
#define SEND_MAXSIZE 0xff //缓冲区大小
#define REC_MAXSIZE 0xff
unsigned char CommSendBufferHead, CommSendBufferTail; //发送缓冲区指针
unsigned char xdata CommSendBuffer[SEND_MAXSIZE]; //发送缓冲区
unsigned char CommRecBufferHead, CommRecBufferTail; //接收缓冲区指针
unsigned char xdata CommRecBuffer[REC_MAXSIZE]; //接收缓冲区
bit FlagRecComm,SendItComm; //启动发送.接收的标志
//////////////////////////////////////////
void s_init(); //串口初始化
unsigned char s_read(void); //从缓冲区读一个数据
void s_write(unsigned char ch); //向缓冲区写一个数据
void s_writes(unsigned char *base); //向缓冲区写一个字符串
//void s_writesb( unsigned char *sends, int kno );
unsigned int s_intflag(unsigned char idata *ch); //检测接收缓冲区是否有数据
void s_intreset(void); //接收缓冲区清零
void s_close( void ); //关串口
void timer0(void); //定时器0中断服务程序
float float_swap(float); //浮点型数据转换
int int_swap(int); //整型数据转换
long int long_int_swap(long int); //长整型数据转换
unsigned char receive_data(void); //导航数据接收
void send_data(void); //初始参数发送
unsigned char sys_done(void); //系统握手
//bit GetCommChar(unsigned char idata *ch);
///////////////////////////////////////////
//接收缓冲区清零
void s_intreset(void)
/* s_intreset: 接收缓冲区清零 */
/* */
/* Input : */
/* 无 */
/* Return : 无? */
/* Public: */
/* CommRecBufferHead 接收缓冲区头指针置零 */
/* CommRecBufferTail 接收缓冲区尾指针置零 */
/* FlagRecComm */
{
CommRecBufferHead=CommRecBufferTail=0; //头尾指针回零
FlagRecComm=0;
}
//串口初始化
void s_init(void)
/* s_init : 串行口初始化 */
/* */
/* Input : */
/* 无 */
/* Return : 无? */
/* CommRecBufferHead 接收缓冲区头指针置零 */
/* CommRecBufferTail 接收缓冲区尾指针置零 */
/* FlagRecComm */
/* CommSendBufferHead 发送缓冲区头指针置零 */
/* CommSendBufferTail 发送缓冲区尾指针置零 */
/* SendItComm 发送标志置一 */
{
PCON = 0x00;
TMOD = 0x21;
TCON=0x00; //定时器0:工作方式1;定时器1:工作方式2
SCON=0xd0;//SCON=0x50; //串行口工作方式1
TH1=0xfd; //19200Bps波特率
TL1=0xfd;
TH0=0x70;//b8; //20ms定时
TL0=0x00;//00;
CommSendBufferHead=CommSendBufferTail=0; // set the head and tail to the base of the ring buffer
CommRecBufferHead=CommRecBufferTail=0;
FlagRecComm=0;
SendItComm=1;
RI=0; // Clear HW_UART receive and transmit
TI=0; // complete indicators.
TR1=1;
TR0=1;
IP=0X02; //定时器0开中断,定时器1关中断,串口开中断,开中断
IE=0X93;
return;
}
//向发送缓冲区写入一个字符
void s_write(unsigned char ch)
/* s_write: 向发送缓冲区写入一个字节 */
/* */
/* Input : */
/* ch 要发送的字节 */
/* Return : 无 */
/* Public: */
/* CommSendBufferTail 发送缓冲区尾指针加一,如等于最大值时,则回零 */
/* SendItComm 启动串口发送中断标志,为1则启动,为0则不启动 */
/* CommSendBuffer[] 发送缓冲区,发送数据写入发送缓冲区 */
{
CommSendBuffer[CommSendBufferTail]=ch;
CommSendBufferTail++; //尾指针向后移动
if (CommSendBufferTail==SEND_MAXSIZE){ //如果缓冲区满,指针回零
CommSendBufferTail=0;
}
if (SendItComm){ //如果没有启动发送,则启动
SendItComm=0;
SBUF=CommSendBuffer[CommSendBufferHead];
}
return ;
}
//字符串发送程序
void s_writes(unsigned char *base)
/* s_writes : 发送一个字符串 */
/* */
/* Input : */
/* base 待发送字符串首址 */
/* Return : 无 */
/* Public: */
/* CommSendBufferTail 每写入一个字节,发送缓冲区尾指针加一, */
/* 如等于最大值时,则回零 */
/* SendItComm 启动串口发送中断标志,为1则启动,为0则不启动 */
/* CommSendBuffer[] 发送缓冲区,发送数据写入发送缓冲区 */
{
unsigned char i=0;
for (;;){
if (base[i]==0) break; //如果字符串大小为零则退出
CommSendBuffer[CommSendBufferTail]=base[i];
CommSendBufferTail++;
if (CommSendBufferTail==SEND_MAXSIZE){ //如果发送缓冲区满则指针回零
CommSendBufferTail=0;
}
i++;
}
if (SendItComm){ //如果没有启动发送则启动
SendItComm=0;
SBUF=CommSendBuffer[CommSendBufferHead];
}
}
/*
void s_writesb( unsigned char *sends, int kno )
{
unsigned char i=0;
if (!kno) { return; }
while (i<kno)
{
CommSendBuffer[CommSendBufferTail]=sends[i];
i++;
CommSendBufferTail++;
if (CommSendBufferTail==SEND_MAXSIZE)
{
CommSendBufferTail=0;
}
}
if (SendItComm)
{
SBUF=CommSendBuffer[CommSendBufferHead];
}
}
*/
//中断处理子函数
void CommISR(void) interrupt 4
/* CommISR : 串行口中断处理子函数 */
/* */
/* Input : */
/* sv 可见星数目 */
/* Return : 无 */
/* Public: */
/* CommSendBufferhead 发送缓冲区头指针加一,如等于最大值时,则回零 */
/* SendItComm 启动串口发送中断标志,数据未发完则置0,发完则置1 */
/* CommSendBuffer[] 发送缓冲区,发送缓冲区数据写入SBUF */
/* CommRecBufferTail 接收缓冲区尾指针加一,如等于最大值时,则回零 */
/* CommRecBuffer[] 接收缓冲区,接收到的数据写入接收缓冲区 */
{
if (TI){ //发送处理
TI=0;
CommSendBufferHead++; //数据头向后移一位
if (CommSendBufferHead==SEND_MAXSIZE){ //如果指针到头则回零
CommSendBufferHead=0;
}
if (CommSendBufferHead!=CommSendBufferTail){ //如果数据没发送完,则继续发送
SendItComm=0;
SBUF=CommSendBuffer[CommSendBufferHead]; // send the next byte
}
else{ //数据发送完,置数据发送允许启动标志
SendItComm=1;
}
}
if (RI){
RI=0;
CommRecBuffer[CommRecBufferTail]=SBUF; //receive data
CommRecBufferTail++;
if (CommRecBufferTail==REC_MAXSIZE){ //如果指针到头,则回零
CommRecBufferTail=0;
}
FlagRecComm=1;
}
}
//接收缓冲区数据数量
unsigned int s_intflag( void )
/* s_intflag : 检测接收缓冲区数据数量 */
/* */
/* Input : */
/* sv 可见星数目 */
/* Return : 接收缓冲区数据数量 */
/* Public: */
/* CommRecBufferTail 接收缓冲区尾指针,用于计算接收到的数据数量 */
/* CommRecBufferHead 接收缓冲区头指针,用于计算接收到的数据数量 */
{
unsigned int flag=0;
flag=CommRecBufferTail-CommRecBufferHead;
if(flag<0) flag+=REC_MAXSIZE; //为正则返回正值
return(flag); //为负则返回FLAG+256
}
/*
unsigned int s_outflag( void )
{
unsigned int flag=0;
flag=CommSendBufferTail-CommSendBufferHead;
if(flag<0) flag+=SEND_MAXSIZE;
return(flag);
}
bit GetCommChar(unsigned char idata *ch)
{
if(FlagRecComm){
if (CommRecBufferTail==CommRecBufferHead) return 0;
*ch=CommRecBuffer[CommRecBufferHead];
CommRecBufferHead++;
if (CommRecBufferHead==REC_MAXSIZE)
{
CommRecBufferHead=0;
}
if (CommRecBufferTail==CommRecBufferHead) FlagRecComm=0;
return 1;
}
else return 0;
}
*/
//从接收缓冲区接收一个字符
unsigned char s_read( void )
/* s_read : 从接收缓冲区中读取一个数据 */
/* */
/* Input : */
/* 无 */
/* Return : 读到的数据? */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -