📄 uartcomm.c
字号:
/*
* 接收数据
* 参数 out: sendBuf 接收到的数据区(包括一位开始位、2位长度位和2位校验位)
* : sendLen 接收到的数据区的长度(byte)
*
* 返回: 0 接收成功 -1 接收失败
*/
short UART_receive(void *recBuf, unsigned short *recLen)
{
typ_msg_word msg_buffer;
typ_UART_stat_word Ustat;
unsigned char *buf;
unsigned char sendBuf[6];
unsigned short checksum,recCount=0;
short result;
// clr_scr();
// move_cursor(0,0);
// puts("UART_receive");
// getch();
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;
SPT_set(64); //time_out = 4s
buf = (unsigned char *)recBuf;
//等到数据到来
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;
}
//接收数据
do {
buf[recCount++] = (unsigned char)UART_get_char();
if(recCount == 1 && buf[0] != 0xBE)//丢弃不是以开始位(0xBE)开始的所有数据
recCount = 0;
//接收完了指定帧长,离开循环
else if ( recCount > 3 && recCount == ( (((unsigned short)buf[1])<<8) + buf[2] ) )
break;
else if (recCount >= MAX_BUF_SIZE)
break;
Ustat.l_word = UART_stat();
} while (Ustat.bits.buff_data_available);//否则一直接收到接收缓冲区没有数据
*recLen = recCount;
//判断数据帧的合法性,并且回应对应的数据帧
checksum = cal_chksum((void *)buf, recCount-2);
//Dispbcd(0,0,buf+recCount-2,2);
sendBuf[0] = checksum >> 8;
sendBuf[1] = checksum & 0xFF;
//Dispbcd(0,6,sendBuf,2);
if ((recCount < 6) ||(buf[0] != 0xBE)||(buf[recCount-2] != sendBuf[0])||(buf[recCount-1] != sendBuf[1]))
{
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0xFF;//0xFF代表接收出错
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
result = 3;
}
else
{
sendBuf[0] = 0xBE;
sendBuf[1] = 0x00;
sendBuf[2] = 0x06;
sendBuf[3] = 0x00;//0x00代表接收正确
checksum = cal_chksum((void *)sendBuf, 4);
sendBuf[4] = checksum >> 8;
sendBuf[5] = checksum & 0xFF;
UART_puts(sendBuf,6);
result = 0;
}
// msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
// if(msg_buffer.bits.time_out)
// return 4;//
return result;
}
/*************************************************************************/
/*MC35 power on and initialize */
/*************************************************************************/
void GSM_on(void)
{
UART_init(UART_MODEM_ON | UART_ON | UART_8_DATA_BITS | UART_BAUD_57600); //UART initlizate
UART_fcntl(UART_fcntl(UART_F_INQ) | UART_F_NO_CTS);
pModem_power_on();
GSM_State = GSM_POWER_ON;
delay_n_ms(2000);
}
/*************************************************************************/
/*MC35 power off */
/*************************************************************************/
void GSM_off(void)
{
if(GSM_State == GSM_POWER_OFF)
GSM_on();
// if(GSM_State == GSM_POWER_OFF)
// {
// return;
// }
Send_AT_Command("AT^SMSO\r"); //Switch off mobile station
delay_n_ms(200);
pModem_power_off();
UART_init(UART_OFF);
GSM_State = GSM_POWER_OFF;
delay_n_ms(2000); //Necessary delay for MC35 off line
}
/*************************************************************************/
/*MC35 config subroutine */
/*************************************************************************/
unsigned char MC35_Configure(void){
char RectCode, *Ptr, Cmd[256], Response[256];
unsigned short Resp_Length, i=0;
typ_RTC_date_rec Date;
typ_RTC_time_rec Time;
char * const AT_Command[] = { "AT\r",
"ATE0\r", //Close echo
"AT+CMGF=0\r", //Set SMS PDU model
// "AT+CSCA=\"+8613010888500\"\r",//Set SMS Center Address
// "AT+CSCA=\"+8613010305500\"\r",//Set SMS Center Address
"AT+CSCA=\"+8613800755500\"\r",//Set SMS Center Address
"AT+CSCS=GSM\r",//Set SMS character set
"AT+CSMP=17,167,0,4\r",
"AT^SSYNC=1\r", //Enables the SYNC pin to control a status LED installed
"AT^SCTM=0,1\r",//Setting for query temperature
"AT^SSMSS=1\r", //Set Short Message Storage Sequence
//"AT+CPMS=\"ME\",\"ME\",\"MT\"\r"
"AT+CPMS=\"SM\",\"SM\",\"MT\"\r",//Set preferred SMS message storage
0};
Send_AT_Command("ATZ\r"); //MC35 software reseat first
delay_n_ms(200);
while(AT_Command[i])
{
memset(Cmd, 0, sizeof(Cmd));
if(i==3)
{
sprintf(Cmd, "AT+CSCA=\"%s\"\r", SMSCenterNo);
Send_AT_Command(Cmd);
// set_console_english();
// move_cursor(0,0);
// puts(Cmd);
// move_cursor(0,1);
// puts(Cmd+16);
// Dispbcd(0,4, Cmd, 30);
// set_console_chinese();
i++;
}
else
Send_AT_Command(AT_Command[i++]);
RectCode = Get_AT_Response(Response, &Resp_Length, 1000);
if(RectCode != AT_OK)
{
#ifdef DEBUG
move_cursor(0,2);
if(RectCode == AT_ERROR)
printf("ERROR=%d", i);
else if(RectCode == AT_TIMEOUT)
printf("TIMEOUT=%d", i);
delay_n_ms(3000);
#endif
return _false;
}
}
// Send_AT_Command("AT+CCLK?\r");
// if(Get_AT_Response(Response, &Resp_Length, 200) == AT_OK)
// {
// set_console_english();
// DispInt(0,0,Resp_Length);
// Ptr = strstr(Response,"\"");
// Dispbcd(0,1,Ptr, 40);
// set_console_chinese();
// Date.fields.year = atoi(Ptr+1) + 2000;
// Date.fields.month = atoi(Ptr+4);
// Date.fields.day = atoi(Ptr+7);
// Time.fields.hour = atoi(Ptr+10);
// Time.fields.minute = atoi(Ptr+13);
// Time.fields.second = atoi(Ptr+16);
// #ifdef DEBUG
// move_cursor(0,4);
// printf("%d/%d/%d,%d:%d:%d", Date.fields.year, Date.fields.month, Date.fields.day, Time.fields.hour, Time.fields.minute, Time.fields.second);
// delay_n_ms(2000);
// #endif
// RTC_set_date(Date.l_word);
// RTC_set_time(Time.l_word);
// return _true;
// }
// else
// return _false;
return _true;
}
/*************************************************************************/
/*MC35 config menu */
/*************************************************************************/
unsigned char GSM_configure(void)
{
int i = 0;
if(GSM_State == GSM_POWER_OFF)
{
return;
}
while(MC35_Configure() == _false)
{
i++;
//if(i>10) return 0;
}
GSM_State = GSM_CONFIGURED;
return 1;
}
/*************************************************************************/
/*Send SMS */
/*************************************************************************/
unsigned char SendSMS(unsigned char *cDataToSend, unsigned char cLen)
{
short ch;
SMS_Type SMS;
if(GSM_State != GSM_CONFIGURED)
{
return 0;
}
memset(&SMS, 0, sizeof(SMS_Type));
SMS.TP_PID = 0x00;
SMS.TP_DCS = GSM_8BIT;
SMS.TP_VP = 0x00;
strcpy(SMS.SCA.Address_Value, SMSCenterNo+1);
// move_cursor(0,0);
// puts(SMS.SCA.Address_Value);
// getch();
SMS.SCA.Address_Type = 0x91;
strcpy(SMS.TPA.Address_Value, CenterNo);
SMS.TPA.Address_Type = 0xa1;
memcpy(SMS.TP_UD, cDataToSend, cLen);
SMS.TP_UDL = cLen;
if(Send_SMS(&SMS) == _true)
return 1;
else
return 0;
}
/*************************************************************************/
/*Read SMS */
/*************************************************************************/
unsigned char ReadSMS(unsigned char *cBuffer)
{
unsigned short Number, Key, CurrentIndex=0;
SMS_Type SMS_Array[32];
if(GSM_State != GSM_CONFIGURED)
{
return 0;
}
Number = Read_SMS(REC_UNREAD, SMS_Array);
if(Number > 0)
{
for(CurrentIndex=0;CurrentIndex<Number;CurrentIndex++)
{
if(memcmp(SMS_Array[CurrentIndex].TP_UD, "EKT", 3)==0)
{
memcpy(cBuffer, &SMS_Array[CurrentIndex].TP_UD, 162);
Delete_SMS(SMS_Array[CurrentIndex].Index);
break;
}
}
}
}
/*************************************************************************/
/*MC35 hang up */
/*************************************************************************/
unsigned char Hang_Up(void)
{
unsigned char Response[256];
unsigned short Resp_Length;
Send_AT_Command("+++");
if(Get_AT_Response(Response, &Resp_Length, 5000) != AT_OK)
return _false;
Send_AT_Command("ATH\r");
if(Get_AT_Response(Response, &Resp_Length, 5000) != AT_OK)
return _false;
Send_AT_Command("AT\r");
if(Get_AT_Response(Response, &Resp_Length, 5000) != AT_OK)
return _false;
return _true;
}
/*************************************************************************/
/*MC35 dial out function menu */
/*************************************************************************/
unsigned char Dial_Out(void)
{
unsigned short KeyIndex=0, URIndex=0;
unsigned char AT_Command[64];
if(GSM_State != GSM_CONFIGURED)
{
return 0;
}
strcpy(AT_Command, "ATD");
strcat(AT_Command, CenterNo);
strcat(AT_Command, "\r");
Send_AT_Command(AT_Command);
if(UART_wait_str("CONNECT", 50000) != _true)
{
return 0;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -