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

📄 myserial.c.txt

📁 串口通讯
💻 TXT
字号:
#include <AT89X51.h>
//static unsigned char data CN[4];
//unsigned char TS[8] = {254,252,248,240,224,192,128,0};

char  CT=0; //接收字符序列
char  CT1=0;
unsigned char tempchar;//异或结果暂存
unsigned char tempchar1;

int startaddress2=0x8000;//发送数据的存放地址
int startaddress1=0x8030;//接收数据的存放地址
unsigned char datalength=16;//数据长度
unsigned char blocklength=4;//进行传输时的数据块长度
char xdata * Pointdata2;//外部数据存储器地址指针,发送区指针
char xdata * Pointdata1;//外部数据存储器地址指针,接收区指针
unsigned char  data * recieve;//接收暂存
unsigned char flag=0;//默认=0是发送,等于1是接收


void main(void)
	{
		void InitCom(unsigned char BaudRate);
		void ComOutChar(unsigned char OutData);
		void ComInChar(char * InData);
		void ComOutBlock();
		void TransportFeed(unsigned char feed);
		void transportfalse();
		unsigned int a=0;
		unsigned char b='a';//数据

		//数据输出区初始化
		Pointdata2=startaddress2;				
/*		for(a=0;a<datalength;a++)		
				{
					*Pointdata2=b++;
					if(a==1) 	*Pointdata2='a';
					if(a==2) 	*Pointdata2=0xFF;
					if(a==3)    *Pointdata2=0x9E;
					Pointdata2++;
					 
				}*/
		Pointdata2=startaddress2;
		Pointdata1=startaddress1;		


		CT = 0; //接收字符序列
		tempchar=0;//接收暂存;

		CT1=0;
		tempchar1=0;

		InitCom(6); //设置波特率为9600 1-8 波特率300-57600

		EA = 1;
		ES = 1; //开串口中断


//		ComOutBlock();
//		ComOutBlock();

		flag=1;
		do
			{
				for (a=0; a<30000; a++)
				P3_6 = 1;
				for (a=0; a<30000; a++) //指示灯闪动
				P3_6 = 0;
			}
		while(1);
	}













//串口初始化 晶振为11.0592M 方式1 波特率300-57600
void InitCom(unsigned char BaudRate)
	{
	
		unsigned char THTL;

		switch (BaudRate)
		{
			case 1: THTL = 64; break; //波特率300
			case 2: THTL = 160; break; //600
			case 3: THTL = 208; break; //1200
			case 4: THTL = 232; break; //2400
			case 5: THTL = 244; break; //4800
			case 6: THTL = 250; break; //9600
			case 7: THTL = 253; break; //19200
			case 8: THTL = 255; break; //57600
			default: THTL = 208;
		}

		SCON = 0x50; //串口方式1,允许接收
		TMOD = 0x20; //定时器1 定时方式2
		TCON = 0x40; //设定时器1 开始计数
		TH1 = THTL;
		TL1 = THTL;
		PCON = 0x80; //波特率加倍控制,SMOD 位
		RI = 0; //清收发标志
		TI = 0;
		TR1 = 1; //启动定时器
	}



void dataprocesser()//处理接收到的数据,进行存储
	{
		unsigned char a=0;
		unsigned char  data * rc=recieve;

		
				for(a=0;a<blocklength;a++)		
					{
						*Pointdata1=*rc;
						 Pointdata1++;
						 rc++;
					}	

	}






void ComInINT(void) interrupt 4 using 1
	{


		if (RI&flag) //接收中断处理程序
			{
				if (CT>=blocklength)//第blocklength+1个字符为校验位,要进行处理
					{						
						CT = -1; //收完一组数据,序列指针清零
						RI = 0;
						recieve-=blocklength;

						if(tempchar==SBUF)//校验正确
							{
								ComOutChar(1);
							    dataprocesser();
							}
						else//没有通过校验
							{
								ComOutChar(0);
								//无论成功与否要进行反馈通知发送方
							}

					}
				else
					{
						*recieve=SBUF;
						recieve++;
					}

				if(CT==0)
						tempchar=SBUF;

				else 
					if (CT>0)//如果是接收的第一个字符暂时无法进行异或运算
						tempchar^=SBUF;

				CT++;
				RI = 0; //RI 清零


			}



	}









void ComOutBlock()//发送一个数据块
	{
		unsigned char a=0;
		char temp;
		char feed;

		CT1=0;
		flag=0;
		for(a=0;a<=blocklength;a++)
			{
				temp=*Pointdata2;

				if(CT1==0)
					{
						tempchar1=temp;
						ComOutChar(temp);
						Pointdata2++;
					}
			
			    if(CT1>0&&CT1<blocklength)
				 	{
						tempchar1^=temp;
						ComOutChar(temp);
						Pointdata2++;
					}
				if(CT1==blocklength)
				 	{

						temp=tempchar1;
						CT1=-1;
						ComOutChar(tempchar1);
						ComInChar(&feed);
						if(feed=='a')
							{
							   //Pointdata2+=1;
							//	Pointdata2-=1;
								//transportsuc();//发送成功
							}
						else
							{
								transportfalse();//发送失败
							}

					 }

				CT1++;
			}
	}






	
void transportfalse()//发送失败处理程序
	{
		CT1=0;
		Pointdata2=Pointdata2-blocklength;
		ComOutBlock();
	}






void ComInChar(char * feed)//从串口接收一个字符
	{
		char * InData=feed;

		while(!RI); //空语句判断字符是否收完	
		*InData=SBUF;
    	RI = 0; //清RI
	}




void ComOutChar(unsigned char OutData)//向串口发送一个字符
	{
		SBUF = OutData; //输出字符

		while(!TI); //空语句判断字符是否发完
		TI = 0; //清TI
	}

⌨️ 快捷键说明

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