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

📄 serial.c

📁 Small RTOS(51) 1.00v 无需外扩ram即可在51上执行的占先式RTOS 可移植,完全免费,公开源代码 具有详细中文文档和注释 (作者已经把它运用到实际的项目中)
💻 C
字号:
#include "config.h"

unsigned char serial_read(void);
unsigned char serial_in_buf_space(void);
unsigned char ReadSerial(unsigned char data *cp);
unsigned char serial_read_1(void);
unsigned char serial_read_2(void);

unsigned char idata serial_in_buf[SERIAL_IN_BUF_LONG];
unsigned char data serial_in_hard;
unsigned char data serial_in_end;


		void InitSerial(void)
{
	SCON=0x50;
	PCON=0x80;
	TMOD=TMOD&0x0f;
	TMOD=TMOD|0x20;
	TH1=0xf3;                   //com is 4800 b/s
	TL1=0xf3;
	TR1=1;
	ES=1;
    EA=1;
}

unsigned char Buf[NBYTE-2];

                            void main(void)
{
	InitSerial();
	while(1)
	{
	    if(ReadSerial(Buf)==1)
	    {
	        SBUF='O';
	        while(TI==0);
	        TI=0;
	        SBUF='K';
	        while(TI==0);
	        TI=0;
	        SBUF='!';
	        while(TI==0);
	        TI=0;
	    }
	}
	
}


		unsigned char ReadSerial(unsigned char data *cp)
{
    unsigned char i;
    unsigned char temp,Sum;

    temp=serial_in_buf_space();
    if(temp<(NBYTE)) return 0;
    temp=serial_read();
    if(temp!=STARTBYTE1) return 0;
    temp=serial_read_1();
    if(temp!=STARTBYTE2) return 0;
    temp=serial_read();
    Sum=STARTBYTE1+STARTBYTE2;
    for(i=0;i<NBYTE-3;i++)
    {
        temp=serial_read_1();
        if(temp==STARTBYTE1)
        {
             temp=serial_read_2();
             if(temp==STARTBYTE2) return 0;
        }
        temp=serial_read();
        *cp++=temp;
        Sum+=temp;
    }
    temp=serial_read_1();
    Sum+=temp;
    if(Sum!=0) return 0;
    temp=serial_read();
    return 1;

}

		void comm(void) interrupt 4 using 1
//"串行口中断"
{
	if(RI==1)
	{
		RI=0;
		serial_in_buf[serial_in_end]=SBUF;
		if(((serial_in_end+1)%SERIAL_IN_BUF_LONG)==serial_in_hard) return;
		serial_in_end++;
		serial_in_end=serial_in_end%SERIAL_IN_BUF_LONG;
		return;
	}
}

 		unsigned char serial_read(void)
{
	unsigned char cc;
	
	cc=serial_in_buf[serial_in_hard];
	serial_in_hard=(serial_in_hard+1)%SERIAL_IN_BUF_LONG;
	return cc;
}

		unsigned char serial_in_buf_space(void)
{
	unsigned char inend_temp;
	
	inend_temp=serial_in_end-serial_in_hard;
	if(inend_temp>SERIAL_IN_BUF_LONG) inend_temp=SERIAL_IN_BUF_LONG+inend_temp;
	return inend_temp;
}

 		unsigned char serial_read_1(void)
{
	return serial_in_buf[serial_in_hard];
}

 		unsigned char serial_read_2(void)
{
	unsigned char cc;
	
	cc=(serial_in_hard+1)%SERIAL_IN_BUF_LONG;
	return serial_in_buf[cc];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -