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

📄 serial.c

📁 基于avr-gcc (GCC) 4.1.2 (WinAVR 20070525)环境开发的atmega128应用程序(带makefile文件)
💻 C
📖 第 1 页 / 共 2 页
字号:
/***********************************************************/
/*														   */
/*文 件 名:Serial.c							           */
/*功    能:串口处理文件                                   */
/*编译器  :	avr-gcc (GCC) 4.1.2 (WinAVR 20070525)		   */
/*当前版本:V1.0										   */
/*作    者:白广斌									       */
/*														   */
/*授    权:										       */
/*														   */
/*开始日期:2007.10.01								       */
/*完成日期:2007.10.01								       */
/*														   */
/***********************************************************/
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <ctype.h>
#include <stdlib.h>
#include <util/delay.h>
#include <Serial.h>

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long int

/*********************************************/
//函数名称:uart0_init(void)
//函数功能:串口0配置函数baud 9600.8.1
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void uart0_init(void)
{
    UCSR0B = 0x00; //disable while setting baud rate
    UCSR0A = 0x00;
    UCSR0C = 0x06;
    UBRR0L = 0x47; //set baud rate lo
    UBRR0H = 0x00; //set baud rate hi
    UCSR0B = 0x98;
}

/*********************************************/
//函数名称:uart1_init(void)
//函数功能:串口1配置函数baud 9600.8.1
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void uart1_init(void)
{
    UCSR1B = 0x00; //disable while setting baud rate
    UCSR1A = 0x00;
    UCSR1C = 0x06;
    UBRR1L = 0x47; //set baud rate lo
    UBRR1H = 0x00; //set baud rate hi
    UCSR1B = 0x98;
}

/*********************************************/
//函数名称:put0c(uchar c)
//函数功能:串口0发送数据处理函数
//输入参数:c
//输出参数:无
//返 回 值:无
/*********************************************/
void put0c(uchar c)
{
    while(!(UCSR0A & (1<<UDRE0)));
    UDR0=c; //发送数据
}

/*********************************************/
//函数名称:put1c(uchar c)
//函数功能:串口1发送数据处理函数
//输入参数:c
//输出参数:无
//返 回 值:无
/*********************************************/
void put1c(uchar c)
{
    while(!(UCSR1A & (1<<UDRE1)));
    UDR1=c; //发送数据
}

/*********************************************/
//函数名称:Serial0_Send_out(uchar x)
//函数功能:串口0发送巡检命令函数
//输入参数:x 
//输出参数:无
//返 回 值:无
/*********************************************/
void Serial0_Send_out(uchar x)
{
    put0c(0x0a);    //数据帧开始   YXXX
	put0c(toascii('Y'));
	put0c((x/100)%10+0x30);
	put0c((x/10)%10+0x30);
	put0c(x%10+0x30);
	put0c(0x0d);    //数据帧结束
}

/*********************************************/
//函数名称:Serial0_Err_out(void)
//函数功能:串口0接收数据错误回送函数
//输入参数:x  错误编码
//输出参数:无
//返 回 值:无
/*********************************************/

void Serial0_Err_out(void)
{
	put0c(0x0a);    //数据帧开始   Err
	put0c(toascii('Y'));
	put0c((AddrNuber/100)%10+0x30);
	put0c((AddrNuber/10)%10+0x30);
	put0c((AddrNuber)%10+0x30);
	put0c(toascii('B'));
	put0c(toascii(' '));
	put0c(toascii('E'));
	put0c(toascii('r'));
	put0c(toascii('r'));
	put0c(toascii(':'));
	
	if(BPL_Err!=0){put0c(toascii('0'));put0c(toascii(','));}    //泵排量数据错误!           错误编码:0
    if(CKYW_Err!=0){put0c(toascii('1'));put0c(toascii(','));}   //出口液位数据错误!         错误编码:1
	if(CKLL_Err!=0){put0c(toascii('2'));put0c(toascii(','));}   //出口流量数据错误!         错误编码:2
	if(CKLS_Err!=0){put0c(toascii('3'));put0c(toascii(','));}   //出口流速数据错误!         错误编码:3
	if(LLC_S_Err!=0){put0c(toascii('4'));put0c(toascii(','));}  //流量差(升/秒)数据错误!  错误编码:4
	if(LLPL_Err!=0){put0c(toascii('5'));put0c(toascii(','));}   //理论排量(升/秒)数据错误!错误编码:5
	if(LJLL_Err!=0){put0c(toascii('6'));put0c(toascii(','));}   //累计流量数据错误!         错误编码:6
	if(LJSJ_Err!=0){put0c(toascii('7'));put0c(toascii(','));}   //累计时间数据错误!         错误编码:7
	if(QSSJ_Err!=0){put0c(toascii('8'));put0c(toascii(','));}   //起始时间数据错误!         错误编码:8
	if(BXL_Err!=0){put0c(toascii('9'));put0c(toascii(','));}    //泵效率数据错误!           错误编码:9
	
	if(YJ_Type_Err!=0)                       //预警类型数据错误!         错误编码:10
	{
	    put0c(toascii('1'));
	    put0c(toascii('0'));
		put0c(toascii(','));
	}  

	if(StaraEnd_Err!=0)                      //起始帧或结束帧错误!       错误编码:11
	{
	    put0c(toascii('1'));
	    put0c(toascii('1'));
		put0c(toascii(','));
	}
	
    if(NO_Kwon_Err!=0)                       //未知的错误!可能是数据流过速!!!  
	{
	    put0c(toascii('2'));
	    put0c(toascii('5'));
	    put0c(toascii('5'));
		put0c(toascii(','));
	}

	put0c(0x0d);    //数据帧结束
	
    ERR_YES_OR_NO=0;      //错误总开关
    BPL_Err=0;            //泵排量数据错误!           错误编码:0
    CKYW_Err=0;           //出口液位数据错误!         错误编码:1
    CKLL_Err=0;           //出口流量数据错误!         错误编码:2
    CKLS_Err=0;           //出口流速数据错误!         错误编码:3
    LLC_S_Err=0;          //流量差(升/秒)数据错误!  错误编码:4
    LLPL_Err=0;           //理论排量(升/秒)数据错误!错误编码:5
    LJLL_Err=0;           //累计流量数据错误!         错误编码:6
    LJSJ_Err=0;           //累计时间数据错误!         错误编码:7
    QSSJ_Err=0;           //起始时间数据错误!         错误编码:8
    BXL_Err=0;            //泵效率数据错误!           错误编码:9
    YJ_Type_Err=0;        //预警类型数据错误!         错误编码:10
    StaraEnd_Err=0;       //起始帧或结束帧错误!       错误编码:11
    NO_Kwon_Err=0;        //未知的错误!可能是数据流过速!!!  错误编码:255
}

/*********************************************/
//函数名称:BPL_Data(void)
//函数功能:泵排量数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void BPL_Data(void)
{
    uint x=0;
	
	if((isdigit(Serial_0_Data[6])==1)      //x
	   &&(isdigit(Serial_0_Data[7])==1)    //x
	   &&(isdigit(Serial_0_Data[8])==1)    //x
	   &&(Serial_0_Data[9]==toascii('.'))  //.
	   &&(isdigit(Serial_0_Data[10])==1)   //x
	   &&(isdigit(Serial_0_Data[11])==1))  //x
	{
	    x=((uint)(Serial_0_Data[6]-0x30)*10000);
		x+=((uint)(Serial_0_Data[7]-0x30)*1000);
		x+=((uint)(Serial_0_Data[8]-0x30)*100);
		x+=((uint)(Serial_0_Data[10]-0x30)*10);
		x+=(Serial_0_Data[11]-0x30);
		
		BPL=x;
		BPL_Err=0;
	}
	else
	{
		BPL_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(BPL_Err>5)       //超过5次错误,清零
		{
		    BPL_Err=0;
			BPL=0;
		}
	}
}

/*********************************************/
//函数名称:CKYW_Data(void)
//函数功能:出口液位数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void CKYW_Data(void)
{
    uint x=0;
	
	if((Serial_0_Data[12]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[13])==1)               //x
	    &&(Serial_0_Data[14]==toascii('.'))             //.
		&&(isdigit(Serial_0_Data[15])==1)               //x
	    &&(isdigit(Serial_0_Data[16])==1)               //x
		&&(isdigit(Serial_0_Data[17])==1))              //x
	{
		x=((uint)(Serial_0_Data[13]-0x30)*1000);
		x+=((uint)(Serial_0_Data[15]-0x30)*100);
		x+=((uint)(Serial_0_Data[16]-0x30)*10);
		x+=(Serial_0_Data[17]-0x30);
		
		CKYW=x;
		CKYW_Err=0;
	}
	else
	{
	    CKYW_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(CKYW_Err>5)   //超过5次错误,清零
		{
		    CKYW_Err=0;
			CKYW=0;
		}
	}
}

/*********************************************/
//函数名称:CKLL_Data(void)
//函数功能:出口流量数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void CKLL_Data(void)
{
    uint x=0;
	
	if((Serial_0_Data[18]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[19])==1)               //x
	    &&(isdigit(Serial_0_Data[20])==1)               //x
		&&(isdigit(Serial_0_Data[21])==1)               //x
	    &&(Serial_0_Data[22]==toascii('.'))             //.
		&&(isdigit(Serial_0_Data[23])==1)               //x
		&&(isdigit(Serial_0_Data[24])==1))              //x
	{
		x=((uint)(Serial_0_Data[19]-0x30)*10000);
		x+=((uint)(Serial_0_Data[20]-0x30)*1000);
		x+=((uint)(Serial_0_Data[21]-0x30)*100);
		x+=((uint)(Serial_0_Data[23]-0x30)*10);
		x+=(Serial_0_Data[24]-0x30);
		
		CKLL=x;
		CKLL_Err=0;
	}
	else
	{
	    CKLL_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(CKLL_Err>5)   //超过5次错误,清零
		{
		    CKLL_Err=0;
			CKLL=0;
		}
	}
}

/*********************************************/
//函数名称:CKLS_Data(void)
//函数功能:出口流速数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void CKLS_Data(void)
{
    uint x=0;
	
	if((Serial_0_Data[25]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[26])==1)               //x
	    &&(isdigit(Serial_0_Data[27])==1)               //x
		&&(Serial_0_Data[28]==toascii('.'))             //.
	    &&(isdigit(Serial_0_Data[29])==1)               //x
		&&(isdigit(Serial_0_Data[30])==1))              //x
	{
		x=((uint)(Serial_0_Data[26]-0x30)*1000);
		x+=((uint)(Serial_0_Data[27]-0x30)*100);
		x+=((uint)(Serial_0_Data[29]-0x30)*10);
		x+=(Serial_0_Data[30]-0x30);
		
		CKLS=x;
		CKLS_Err=0;
	}
	else
	{
	    CKLS_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(CKLS_Err>5)   //超过5次错误,清零
		{
		    CKLS_Err=0;
			CKLS=0;
		}
	}
}

/*********************************************/
//函数名称:LLC_S_Data(void)
//函数功能:流量差(升/秒)数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void LLC_S_Data(void)
{
    int x=0;
	
	if((Serial_0_Data[31]==toascii(' '))                //空格
	    &&((isdigit(Serial_0_Data[32])==1)
		||(Serial_0_Data[32]==toascii('-'))
		||(Serial_0_Data[32]==toascii('+')))            //x/+-
	    &&(isdigit(Serial_0_Data[33])==1)               //x
		&&(isdigit(Serial_0_Data[34])==1)               //x
	    &&(Serial_0_Data[35]==toascii('.'))             //.
		&&(isdigit(Serial_0_Data[36])==1)               //x
		&&(isdigit(Serial_0_Data[37])==1))              //x
	{
		if(Serial_0_Data[32]!=toascii('-'))
		{
		    if(Serial_0_Data[32]!=toascii('+'))
			{
		        x=((uint)(Serial_0_Data[33]-0x30)*1000);
		        x+=((uint)(Serial_0_Data[34]-0x30)*100);
		        x+=((uint)(Serial_0_Data[36]-0x30)*10);
		        x+=(Serial_0_Data[37]-0x30);
		
		        LLC_S=x;
			}
			else
			{
			    x=((uint)(Serial_0_Data[32]-0x30)*10000);
		        x+=((uint)(Serial_0_Data[33]-0x30)*1000);
		        x+=((uint)(Serial_0_Data[34]-0x30)*100);
		        x+=((uint)(Serial_0_Data[36]-0x30)*10);
		        x+=(Serial_0_Data[37]-0x30);
		
		        LLC_S=x;
			}
		}
		else
		{
		    if(Serial_0_Data[32]==toascii('-'))
			{
			    x=((uint)(Serial_0_Data[33]-0x30)*1000);
		        x+=((uint)(Serial_0_Data[34]-0x30)*100);
		        x+=((uint)(Serial_0_Data[36]-0x30)*10);
		        x+=(Serial_0_Data[37]-0x30);
		
		        LLC_S=-x;
			}
		}
		
		LLC_S_Err=0;
	}
	else
	{
	    LLC_S_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(LLC_S_Err>5)   //超过5次错误,清零
		{
		    LLC_S_Err=0;
			LLC_S=0;
		}
	}
}

/*********************************************/
//函数名称:LJLL_Data(void)
//函数功能:累计流量数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void LJLL_Data(void)
{
    uint x=0;
	
	if((Serial_0_Data[38]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[39])==1)               //x
	    &&(isdigit(Serial_0_Data[40])==1)               //x
		&&(isdigit(Serial_0_Data[41])==1)               //x
	    &&(Serial_0_Data[42]==toascii('.'))             //.
		&&(isdigit(Serial_0_Data[43])==1)               //x
		&&(isdigit(Serial_0_Data[44])==1))              //x
	{
		x=((uint)(Serial_0_Data[39]-0x30)*10000);
		x+=((uint)(Serial_0_Data[40]-0x30)*1000);
		x+=((uint)(Serial_0_Data[41]-0x30)*100);
		x+=((uint)(Serial_0_Data[43]-0x30)*10);
		x+=(Serial_0_Data[44]-0x30);
		
		LJLL=x;
		LJLL_Err=0;
	}
	else
	{
	    LJLL_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(LJLL_Err>5)   //超过5次错误,清零
		{
		    LJLL_Err=0;
			LJLL=0;
		}
	}
}

/*********************************************/
//函数名称:LLPL_Data(void)
//函数功能:理论排量(升/秒)数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void LLPL_Data(void)
{
    uint x=0;
	
	if((Serial_0_Data[45]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[46])==1)               //x
	    &&(isdigit(Serial_0_Data[47])==1)               //x
		&&(isdigit(Serial_0_Data[48])==1)               //x
		&&(Serial_0_Data[49]==toascii('.'))             //.
	    &&(isdigit(Serial_0_Data[50])==1)               //x
		&&(isdigit(Serial_0_Data[51])==1))              //x
	{
		x=((uint)(Serial_0_Data[46]-0x30)*10000);
		x+=((uint)(Serial_0_Data[47]-0x30)*1000);
		x+=((uint)(Serial_0_Data[48]-0x30)*100);
		x+=((uint)(Serial_0_Data[50]-0x30)*10);
		x+=(Serial_0_Data[51]-0x30);
		
		LLPL=x;
		LLPL_Err=0;
	}
	else
	{
	    LLPL_Err++;
		ERR_YES_OR_NO=1;    //错误总开关置1,有错误发生!!!
		if(LLPL_Err>5)   //超过5次错误,清零
		{
		    LLPL_Err=0;
			LLPL=0;
		}
	}
}

/*********************************************/
//函数名称:LJSJ_Data(void)
//函数功能:累计时间数据提取函数
//输入参数:无
//输出参数:无
//返 回 值:无
/*********************************************/
void LJSJ_Data(void)
{
    uint x=0;
	
	if((Serial_0_Data[52]==toascii(' '))                //空格
	    &&(isdigit(Serial_0_Data[53])==1)               //x
	    &&(isdigit(Serial_0_Data[54])==1)               //x
		&&(isdigit(Serial_0_Data[55])==1)               //x
	    &&(Serial_0_Data[56]==toascii('.'))             //.

⌨️ 快捷键说明

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