⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 串口通讯.h

📁 rs422串口编程
💻 H
📖 第 1 页 / 共 3 页
字号:
#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 + -