?? uartcomm.c.bak
字號:
//#include <stdio.h>
//#include <string.h>
//#include <stdlib.h>
#include <api.h>
#include <console.h>
//#include <string.h>
//#include <ctype.h>
#include <SMS.h>
//MC35 state
#define GSM_POWER_OFF 0
#define GSM_POWER_ON 1
#define GSM_CONFIGURED 2
unsigned short GSM_State = GSM_POWER_OFF;
#define MAX_BUF_SIZE 1024
extern unsigned char gcCommMsgRow;
extern unsigned char CenterNo[12];
extern unsigned char SMSCenterNo[20];
static unsigned short String2Bytes(const unsigned char* pSrc, unsigned char* pDst, unsigned short nSrcLength)
{
unsigned short i;
for(i=0; i<nSrcLength; i+=2)
{
//輸出高4位
if(*pSrc>='0' && *pSrc<='9')
*pDst = (*pSrc - '0') << 4;
else
*pDst = (*pSrc - 'A' + 10) << 4;
pSrc++;
//輸出低4位
if(*pSrc>='0' && *pSrc<='9')
*pDst |= *pSrc - '0';
else
*pDst |= *pSrc - 'A' + 10;
pSrc++;
pDst++;
}
//返回目標數據長度
return nSrcLength / 2;
}
//---------------------------------------------------------------------------
// 發送短消息
// pSrc: 源PDU參數指針
//---------------------------------------------------------------------------
unsigned char Send_SMS1(const SMS_Type *SMS)
{
unsigned short nPduLength; //PDU串長度
unsigned char nSmscLength; //SMSC串長度
unsigned char Cmd[16], Pdu[256];
nPduLength = Encode_PDU(SMS, Pdu); //根據PDU參數,編碼PDU串
strcat(Pdu, "\x01a"); //以Ctrl-Z結束
String2Bytes(Pdu, &nSmscLength, 2); //取PDU串中的SMSC信息長度
nSmscLength++; //加上長度字節本身
//命令中的長度,不包括SMSC信息長度,以數據字節計
sprintf(Cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); //生成命令
Send_AT_Command(Cmd); //先輸出命令串
if(UART_wait_str("\r\n> ", 3000) == _true)
{
Send_AT_Command(Pdu); //得到肯定回答,繼續輸出PDU串
if(UART_wait_str("+CMGS:", 9000) == _true)
return _true;
}
return _false;
}
/*
* 斷開連接
*/
void UART_disconnect()
{
typ_UART_stat_word Ustat;
// clr_scr();
// move_cursor(0,0);
// puts("UART_receive");
// getch();
Ustat.l_word = UART_stat();
if (Ustat.bits.UART_on)
{
UART_init(UART_OFF);
sys_msg(SM_GOTO_SLEEP);
}
}
/*
* calc checksun as tcp/ip checksun
*/
unsigned short cal_chksum(const void *addr, int len)
{
int nleft=len;
int sum=0;
unsigned short *w= (unsigned short *)addr;
unsigned short answer=0;
while(nleft>1)
{ sum+=*w++;
nleft-=2;
}
if( nleft==1)
{ *(unsigned char *)(&answer)=*(unsigned char *)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return answer;
}
/*
// delay subroutine:
void delay_n_ms(int mscnt) {
for (;mscnt > 0; mscnt--)
delay_1ms();
}
*/
// puts via UART
void UART_puts(unsigned char *buf, int len) {
for(; len > 0; len--) {
while(UART_send_char(*buf));
buf++;
}
}
/*
* 握手建立連接(當作發起端)
*/
/*
short UART_connect()
{
typ_msg_word msg_buffer;
typ_UART_stat_word Ustat;
unsigned char recBuf[MAX_BUF_SIZE];
unsigned char sendBuf[6];
unsigned short checksum=0,recLen=0;
SPT_set(64);
UART_disconnect();
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
UART_init(UART_ON | UART_232_ON | UART_8_DATA_BITS | UART_BAUD_115200);
UART_fcntl(UART_fcntl(UART_F_INQ) | UART_F_NO_CTS);
delay_n_ms(3);
//握手數據幀: 一位的起始位: 0xBE
// 兩位的長度: 0x0006
// 一位的握手數據:0xAA
// 兩位的校驗位
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0xAA;
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
SPT_set(64 );
while(1)
{
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
if (msg_buffer.bits.comm_data)
break;
if (msg_buffer.bits.time_out)
{
UART_disconnect();
return 1;
}
}
//握手回復幀: 一位的起始位:0xBE
// 兩位的長度:0x0001
// 一位的握手數據:0x55
// 兩位的校驗位
memset( (void*)recBuf, 0, sizeof(recBuf) );
do {
recBuf[recLen++] = (unsigned char)UART_get_char();
if( 1 == recLen && recBuf[0] != 0xBE )
recLen = 0;
else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
break;
else if ( recLen == 6 )
break;
Ustat.l_word = UART_stat();
} while (Ustat.bits.buff_data_available);
if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0x55 || cal_chksum( (unsigned short *)recBuf,recLen) )
{
UART_disconnect();
return 3;
}
return 0;
}
*/
/*
* 握手建立連接(當作響應端)
*/
short UART_open()
{
typ_msg_word msg_buffer;
typ_UART_stat_word Ustat;
unsigned char recBuf[MAX_BUF_SIZE];
unsigned char sendBuf[6];
unsigned short checksum=0,recLen=0;
SPT_set(64);
UART_disconnect();
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
UART_init(UART_ON | UART_232_ON | UART_8_DATA_BITS | UART_BAUD_115200);
UART_fcntl(UART_fcntl(UART_F_INQ) | UART_F_NO_CTS);
delay_n_ms(3);
SPT_set(64);
/*
while(1)
{
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
if (msg_buffer.bits.comm_data)
break;
if (msg_buffer.bits.time_out)
{
UART_disconnect();
return 1;
}
}
memset( (void*)recBuf,0,sizeof(recBuf) );
do {
recBuf[recLen++] = (unsigned char)UART_get_char();
if( 1 == recLen && recBuf[0] != 0xBE )
recLen = 0;
else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
break;
else if (recLen == 6)
break;
Ustat.l_word = UART_stat();
} while (Ustat.bits.buff_data_available);
if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0xAA || cal_chksum((unsigned short *)recBuf,recLen) )
{
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0xFF;
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
UART_disconnect();
return 2;
}
else
{
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0x00;
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
return 0;
}
*/
}
/*
* 發送數據
* 參數 in: sendBuf 要發送的數據區(不包括一位開始位、2位長度位和2位校驗位)
* : sendLen 要發送的數據區的長度(byte)
*
* 返回: 0 發送成功 -1 發送失敗
*/
short UART_send(const void *sendBuf, unsigned short sendLen)
{
typ_msg_word msg_buffer;
typ_UART_stat_word Ustat;
unsigned char pBuf[MAX_BUF_SIZE];
unsigned char recBuf[MAX_BUF_SIZE];
unsigned short checksum=0,recLen=0;
if(sendLen + 5 > MAX_BUF_SIZE)
return -1;
Ustat.l_word = UART_stat();
if (!Ustat.bits.UART_on)
return 1;
move_cursor(0,gcCommMsgRow);
puts("發送數據...");
if(gcCommMsgRow<6)
gcCommMsgRow += 2;
else
gcCommMsgRow = 2;
pBuf[0] = 0xBE;
pBuf[1] = (sendLen+5) >> 8;
pBuf[2] = (sendLen+5) & 0xFF;
memcpy( (void *)&pBuf[3], sendBuf, sendLen );
checksum = cal_chksum( (unsigned short *)pBuf, sendLen+3);
pBuf[sendLen+3] = checksum >> 8;
pBuf[sendLen+4] = checksum & 0xFF;
UART_puts( pBuf, sendLen+5);
SPT_set(64);
//等到確認數據到來
while(1)
{
msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
if (msg_buffer.bits.comm_data)
break;
if (msg_buffer.bits.time_out)
return 2;
}
memset( (void*)recBuf,0,sizeof(recBuf) );
do {
recBuf[recLen++] = (unsigned char)UART_get_char();
if( 1 == recLen && recBuf[0] != 0xBE )
recLen = 0;
else if ( recLen > 3 && recLen == ( (((unsigned short)recBuf[1])<<8) + recBuf[2] ) )
break;
else if (recLen == 6)
break;
Ustat.l_word = UART_stat();
} while (Ustat.bits.buff_data_available);
if ( recLen != 6 || recBuf[0] != 0xBE || recBuf[3] != 0x00 || cal_chksum((unsigned short *)recBuf,recLen) )
return 3;
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -