📄 serial.c
字号:
/***********************************************************/
/* */
/*文 件 名: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 + -