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

📄 serial.c

📁 VB与单片机通信实现智能照明温度控制示例 包括Vb代码和C代码
💻 C
字号:
#include <at89x51.h>
#include "serial.h"
#include "function.h"
#define MAXCMDSIZE 20

typedef unsigned char uchar; 
typedef unsigned int uint;  
 
unsigned char SerialCmd[20],SerialRet[10];
bit SerialReq;

void Send(unsigned char * s,int len)
{
	int i;
	ES=0;
	REN=0;
	for(i=0;i<len;i++)
	{
		SBUF=s[i];
		while(!TI){}
		TI=0;
	}
	REN=1;
	ES=1;
}
void SendAddr(bit success)
{
	ES=0;
	REN=0;
	if(success)
		SBUF=DEVICE_ID;
	else
		SBUF=0;
	while(!TI){}
	TI=0;
	REN=1;
	ES=1;
}
unsigned char CheckSum(unsigned char * c)
{
	unsigned char len,checksum,i;
	len=c[0];
	checksum=0;
	for(i=0;i<len;i++)
		  checksum=checksum^c[i];
	if(checksum==0xff)
		checksum=0xfe;
	return checksum;
}

bit ProcessCmd()
{
	bit success=1;
	ES=0;
	if(CheckSum(SerialCmd)!=SerialCmd[SerialCmd[0]])
	{
		SendAddr(0);
		SerialReq=0;
		ES=1;
		return 0;
	}
	switch (SerialCmd[1])
	{
		case CMD_PING:
				SerialRet[0]=0;
				break;
		case CMD_ENABLE_MANUAL_CON:
				if(!SetManCon(1)) success=0;
				break;
		case CMD_DISABLE_MANUAL_CON:
				if(!SetManCon(0)) success=0;
				break;
		case CMD_QUERY_ROOM:
				if(!GetRoom()) success=0;
				break;
		case CMD_QUERY_DATA:
				if(!GetData()) success=0;
				break;
		case CMD_SET_MANUAL_CON_TIME:
				if(!SetManTime()) success=0;
				break;
		case CMD_CON_LIGHT:
				if(!SetLight()) success=0;
				break;
		case CMD_CON_AIRCON:
				if(!SetAirCon()) success=0;
				break;
		case CMD_ADJ_TIMER:  
				if(!SetTime()) success=0;
				break;
		case CMD_SETTIMER_LIGHT:  break;
		case CMD_SETTIMER_AIRCON:  break;
		case CMD_SETTIMER_POWER:  break;
	}
	if(success)
	{
		SendAddr(1);
		if(SerialRet[0]>0)
		{
			Send(SerialRet,SerialRet[0]+1);
		}
	}
	else
	{
		SendAddr(0);
		SerialReq=0;
		ES=1;
		return 0;
	}
	SerialReq=0;
	ES=1;
	return 1;
}



void Serial_ISR () interrupt 4
{
	static unsigned char tlen,len,state;
	if (!RI) {RI=0;TI=0;return;}
	if(SBUF==0xff && SerialReq==0)
	{
		state=1;
		tlen=0;
		len=0;
		RI=0;TI=0;
		return; 
	}
	switch (state)
	{
		case 0:
			break;
		case 1:
			if(SBUF==DEVICE_ID)
				state=2;
			else
				state=0;
			break;
		case 2:
			len=0;
			tlen=SBUF;
			if(tlen>MAXCMDSIZE)
				tlen=MAXCMDSIZE;
			SerialCmd[0]=tlen;
			state=3;
			break;
		case 3:
			len++;
			SerialCmd[len]=SBUF;
			if(len>=tlen)
			{
				tlen=0;
				len=0;
				state=0;
				SerialReq=1;
			}
	}
	RI=0;TI=0;
}


⌨️ 快捷键说明

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