?? main.c
字號:
/**************************************************************************
文件名: main.c
功能 :數據透傳
時間 :2005.11.18
程序員:yangxb
NCUtype:MEGA128
GPRStype:IPCOM100
2007-5-30 20:04 + 串口功能打通
+ 將串口緩沖區擴展到2*200字節
2007-5-31 7:49 + 修改短信協議,支持7bit,8bit編碼/解碼
2007-6-16 14:51 + 引入了具有printf功能的輸出函數dprintf0,dprintf1
2007-6-16 18:24 + 實現了部分console命令
2007-6-17 17:44 + 實現了140字節短信發送
2007-6-17 18:49 + 對中心命令和終端相應進行了測試
2007-6-18 1:08 + 重新設計了console口的命令處理
+ 實現了data模式和console模式的轉換
2007-6-20 0:14 + 在響應中加入校驗和
2007-6-20 2:16 + 實現了eeprom中參數的讀/寫
2007-6-21 17:29 + 實現了console中大部分命令,包括查詢和設置
**************************************************************************/
#include <main.h>
int main (void)
{
sysInit();
for(;;)
{
//AD采樣
delay_s(10);
ADC_Process();
// //終端事件處理
// tmEventProcess();
//
// //處理上行緩沖區數據
// DealUpData();
//
// //處理下行緩沖區數據
// DealDownData();
}
}
/*--------------------------------------------------------------------------
系統初始化
--------------------------------------------------------------------------*/
void sysInit(void)
{
ioint();
varint();
SysPara.Started = 0;
RunMsgPrintf("reboot");
delay_s(1);
RunMsgPrintf("正在對系統初始化...");
ParaInit();
//GSM初始化
while(GsmInit()==0);
//清空緩沖區
ClearUpBuff();
ClearDownBuff();
delay_s(1);
RunMsgPrintf("系統初始化完成,進入正常工作狀態");
SysPara.Started = 1;
}
/*--------------------------------------------------------------------------
功能:io初始化
--------------------------------------------------------------------------*/
void ioint(void)
{
DDRC=0xff ;
UBRR0H=0;
UBRR0L=23;//19200,接RS-232
UCSR0B=(1<<RXEN0)|(1<<RXCIE0)|(1<<TXEN0);
UBRR1H=0;
UBRR1L=3;//115200
UCSR1B=(1<<RXEN1)|(1<<RXCIE1)|(1<<TXEN1);
TIMSK=(1<<TOIE0);
TCCR0=0x07;
TCNT0=180 ;
sei();
}
/*--------------------------------------------------------------------------
功能:變量初始化
--------------------------------------------------------------------------*/
void varint(void)
{
int n ;
UpBuf.BufBegin = 0 ;
UpBuf.BufEnd = 0 ;
for(n=0;n<UpBufMax;n++)
{
UpBuf.Buff[n].state= writeonly ;
}
DownBuf.BufBegin = 0 ;
DownBuf.BufEnd = 0 ;
for(n=0;n<DownBufMax;n++)
{
DownBuf.Buff[n].state=writeonly ;
}
SysPara.U0_Mod = U0_WM_DATA;
}
/*-----------------------------------------------------------------------
UART0接收中斷服務函數
-----------------------------------------------------------------------*/
SIGNAL(SIG_UART0_RECV)
{
unsigned char c;
c=UDR0;
if (UpBuf.Buff[UpBuf.BufEnd].state == writeonly)
{
if(UpBuf.Buff[UpBuf.BufEnd].len<(MAXLEN-1))
{
UpBuf.Buff[UpBuf.BufEnd].data[UpBuf.Buff[UpBuf.BufEnd].len++] = c ;
}
else
{
UpBuf.Buff[UpBuf.BufEnd].data[MAXLEN-1] = '\0' ;
}
//console模式下
if (SysPara.U0_Mod ==U0_WM_CONSOLE)
{
UARTOnWork0.OnWork = 0;
//回顯
putChar0(c);
//console口一次輸入完畢
if (c == '\r')
{
UpBuf.Buff[UpBuf.BufEnd].data[UpBuf.Buff[UpBuf.BufEnd].len] = '\0' ;
UpBuf.Buff[UpBuf.BufEnd].state = readonly ;//可讀不可寫
//將終止指針后移一項
if ( UpBuf.BufEnd == (UpBufMax-1) )
{
UpBuf.BufEnd = 0 ;
}
else
{
UpBuf.BufEnd++ ;
}
}
}
else//數據模式下,由定時器來判斷數據結束
{
UARTOnWork0.OnWork = 1 ;
UARTOnWork0.TimeClick = 1 ;//1*0.01m=10ms
}
}
}
/*-----------------------------------------------------------------------
UART1接收中斷服務函數
-----------------------------------------------------------------------*/
SIGNAL(SIG_UART1_RECV)
{
unsigned char c;
c=UDR1;
if (DownBuf.Buff[DownBuf.BufEnd].state == writeonly)
{
UARTOnWork1.OnWork = 1 ;
UARTOnWork1.TimeClick = 1 ;//1*0.01m=10ms
if(DownBuf.Buff[DownBuf.BufEnd].len<(MAXLEN-1))
{
DownBuf.Buff[DownBuf.BufEnd].data[DownBuf.Buff[DownBuf.BufEnd].len++] = c ;
}
}
}
/*-----------------------------------------------------------------------
TIMER0中斷服務函數:判斷一包數據接收是否結束,如果結束,則將結束指針后移一位
[note]在中斷函數中不要使用具有阻塞性質的程序段
-----------------------------------------------------------------------*/
ISR ( TIMER0_OVF_vect )
{
TCNT0 = 180 ;
if (UARTOnWork0.OnWork ==1 )
{
if (UARTOnWork0.TimeClick !=0 )//正在接收數據
{
UARTOnWork0.TimeClick-- ;
}
else //接收完畢
{
UARTOnWork0.OnWork = 0 ;
UpBuf.Buff[UpBuf.BufEnd].data[UpBuf.Buff[UpBuf.BufEnd].len] = '\0' ;
UpBuf.Buff[UpBuf.BufEnd].state = readonly ;//可讀不可寫
//將終止指針后移一項
if ( UpBuf.BufEnd == (UpBufMax-1) )
{
UpBuf.BufEnd = 0 ;
}
else
{
UpBuf.BufEnd++ ;
}
}
}
if (UARTOnWork1.OnWork ==1 )
{
if (UARTOnWork1.TimeClick !=0 )//正在接收數據
{
UARTOnWork1.TimeClick-- ;
}
else //接收完畢
{
UARTOnWork1.OnWork = 0 ;
DownBuf.Buff[DownBuf.BufEnd].data[DownBuf.Buff[DownBuf.BufEnd].len] = '\0' ;
DownBuf.Buff[DownBuf.BufEnd].state = readonly ;//可讀不可寫
//將終止指針后移一項
if ( DownBuf.BufEnd == (DownBufMax-1) )
{
DownBuf.BufEnd = 0 ;
}
else
{
DownBuf.BufEnd++ ;
}
}
}
}
/*-----------------------------------------------------------------------
ADC中斷服務函數:
對每一路進行指定次數的轉換,轉換完畢后,置位轉換完成標志
-----------------------------------------------------------------------*/
ISR(ADC_vect)
{
ADC_data.AD_Channles[ADC_data.CurrChannel][ADC_data.CurrTimes] = (uint16_t)ADCL;
ADC_data.AD_Channles[ADC_data.CurrChannel][ADC_data.CurrTimes] = (uint16_t)(ADCH<<8);
ADC_data.CurrTimes++;
//轉換次數夠了,進行下一路
if (ADC_data.CurrTimes == (ADCONVERTTIMES - 1))
{
ADC_data.CurrChannel++;
if (ADC_data.CurrChannel == ADCHANNELMAX)
{
//關閉AD,停止轉換
CloseADC();
//通知主程序轉換完畢
ADC_data.finished = 1;
}
else
{
ADMUX = ADC_data.CurrChannel;
ADC_data.CurrTimes = 0;
}
}
}
/*-----------------------------------------------------------------------
發送指定字節的數據到串口0
包括'\0'字符
-----------------------------------------------------------------------*/
void WriteUart0(unsigned char *data, int dataLen)
{
int n ;
for(n=0;n<dataLen;n++)
{
while ( !( UCSR0A & (1<<UDRE0)) );
UDR0 = data[n] ;
}
}
/*-----------------------------------------------------------------------
發送指定字節的數據到串口1
包括'\0'字符
-----------------------------------------------------------------------*/
void WriteUart1(unsigned char *data, int dataLen)
{
int n ;
for(n=0;n<dataLen;n++)
{
while ( !( UCSR1A & (1<<UDRE1)) );
UDR1=data[n] ;
}
}
/*-----------------------------------------------------------------------
通過串口1發送一個字符
用于回顯
-----------------------------------------------------------------------*/
void putChar1(char c)
{
while ( !( UCSR1A & (1<<UDRE1)) );UDR1=c;
}
/*-----------------------------------------------------------------------
通過串口0發送一個字符
用于回顯
-----------------------------------------------------------------------*/
void putChar0(char c)
{
while ( !( UCSR0A & (1<<UDRE0)) );UDR0=c;
}
/*------------------------------------------------------------------------
myprintf0 : 通過串口0發送字符串,串以'\0'結束
輸入:帶發送字符串的指針
2007-6-15 23:37 changed by yxb
------------------------------------------------------------------------*/
void myprintf0(char *p)
{
WriteUart0(p, strlen(p));
}
/*------------------------------------------------------------------------
myprintf1 : 通過串口1發送字符串,串以'\0'結束
輸入:帶發送字符串的指針
2007-6-15 23:37 changed by yxb
-----------------------------------------------------------------------*/
void myprintf1(char *p)
{
WriteUart1(p, strlen(p));
}
void RunMsgPrintf(char *info)
{
if (SysPara.Started == 0)
{
dprintf0("\r\n#ZF> %s", info);
}
else
{
if (SysPara.U0_Mod ==U0_WM_CONSOLE)
{
dprintf0("\r\n#ZF> %s", info);
}
}
}
/*---------------------------------------------------------------------------
處理上行數據緩沖區中的數據記錄
-----------------------------------------------------------------------------*/
void DealUpData(void)
{
TBuff Buff ;
SM_PARAM MySM_PARAM;
if (ReadUpBuf(&Buff) ==0 )return ; //從數據緩沖區讀取一條數據記錄
if (SysPara.U0_Mod ==U0_WM_CONSOLE)
{
if (Buff.data[0] =='D')
{
//進入數據模式
myprintf0("\r\nenter into data mode\r\n");
SysPara.U0_Mod = U0_WM_DATA;
}
else
{
ExplainConsoleCmd(Buff.data, Buff.len);
MySM_PARAM.TP_UDlen = centSimunator(Buff.data, MySM_PARAM.TP_UD);
if (MySM_PARAM.TP_UDlen > 0)SendSms(&MySM_PARAM);
}
}
else
{
if (Buff.data[0] =='C')
{
//進入console模式
myprintf0("\r\nenter into console mode\r\n");
myprintf0("\r\n#ZF> ");
ClearUpBuff();
SysPara.U0_Mod = U0_WM_CONSOLE;
}
{
myprintf0(Buff.data);
}
}
}
/*---------------------------------------------------------------------------
處理下行數據緩沖區中的數據記錄
-----------------------------------------------------------------------------*/
void DealDownData(void)
{
TBuff Buff ;
Buff.len = ReadDownBuf(Buff.data, MAXLEN);
if ( Buff.len > 0)
{
RunMsgPrintf(Buff.data);
CheckDownData(&Buff);
}
}
/*------------------------------------------------------------------------
功能:從緩沖區取出一條數據
返回: = 0 讀取失敗 =1 讀取成功
輸出:讀取到的數據
---------------------------------------------------------------------------*/
int ReadUpBuf(TBuff*p)
{
if (UpBuf.Buff[UpBuf.BufBegin].state == writeonly )//當起始指針所指向的紀錄不可讀取時,有兩種可能
{ //1 串口正在接收數據,但接收尚未結束,數據記錄不可讀取
return (0) ; //2 串口沒有接收數據,數據記里為空
}
strcpy((*p).data ,(UpBuf.Buff[UpBuf.BufBegin].data)) ;//從數據緩沖區讀取一條記錄后,需要修改當前記錄為可寫不可讀[使用變量而非指針]
(*p).len = UpBuf.Buff[UpBuf.BufBegin].len ;
UpBuf.Buff[UpBuf.BufBegin].len = 0 ;//清空緩沖區
UpBuf.Buff[UpBuf.BufBegin].state = writeonly ;//可寫不可讀
if ( UpBuf.BufBegin ==(UpBufMax-1))//將起始指針后移一位
{
UpBuf.BufBegin =0 ;
}
else
{
UpBuf.BufBegin++ ;
}
if ((*p).len==0)
{
return (0) ;
}
return (1) ;
}
/*------------------------------------------------------------------------
功能:從緩沖區取出一條數據
輸入:nsrclength=讀取的字節數
PStr=讀取到的數據
返回: 讀取到的字節數
---------------------------------------------------------------------------*/
int ReadDownBuf(unsigned char *PStr , int nsrclength )
{
int len;
if (DownBuf.Buff[DownBuf.BufBegin].state == writeonly )//當起始指針所指向的紀錄不可讀取時,有兩種可能
{ //1 串口正在接收數據,但接收尚未結束,數據記錄不可讀取
return (0) ; //2 串口沒有接收數據,數據記里為空
}
myCopy( (DownBuf.Buff[DownBuf.BufBegin].data) , PStr , 0 , nsrclength ) ;
len = DownBuf.Buff[DownBuf.BufBegin].len;
DownBuf.Buff[DownBuf.BufBegin].len = 0 ;//清空緩沖區
DownBuf.Buff[DownBuf.BufBegin].state = writeonly ;//可寫不可讀
if ( DownBuf.BufBegin ==(DownBufMax-1))//將起始指針后移一位
{
DownBuf.BufBegin =0 ;
}
else
{
DownBuf.BufBegin++ ;
}
return (len) ;
}
/*-----------------------------------------------------------------------
GsmReset :重新啟動gsm
-----------------------------------------------------------------------*/
void GsmReset(void)
{
PORTC=0 ;
delay_s(1) ;
PORTC=0x03;
delay_ms(800);
PORTC=0x01;
delay_ms(800);
PORTC=0x03;
}
/*-----------------------------------------------------------------------
GprsOff :關閉Gprs
-----------------------------------------------------------------------*/
void GsmOff(void)
{
PORTA=0 ;
delay_s(5);
}
/*-----------------------------------------------------------------------
功能:GsmInit初始化
返回:=0 初始化失敗 =1 初始化成功
-----------------------------------------------------------------------*/
char GsmInit(void)
{
int num , kk, flag , len=0 ;
unsigned char str[60] ;
GsmReset();
delay_s(5);
ClearDownBuff () ;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -