📄 gsmv100.c
字号:
#include <stdio.h>
#include <absacc.h>
#include "at89c51rc2.h"
#include "GSMv100.h"
#include "CPLD_CONTROLv100.h"
#include <string.h>
#include "generic_operation.h"
#include <intrins.h>
#include "LCDTP_APIv100.H"
#include "flashApi.h"
//#include "unicode.h"
//#include "hzk16.h"
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
extern bit TP_TOUCHED;
extern void setCsrDir(uchar dir);
extern void putcharLcd(char ch);
extern int putsLcd(unsigned char *str);
extern void ScrGotoxy (unsigned char x,unsigned char y);
extern int printfLcd(char *str);
unsigned char * Changed_No;
unsigned char *DestinationNo;
unsigned int nDstLength;
//unsigned char GB_UnicodeData[];
unsigned char *MessageData;
unsigned int Length;
unsigned idata unicode;
unsigned char *qw;
//定义通讯端口
#define RS232 0
#define GSM 1
#ifndef ON
#define ON 1
#endif
#ifndef OFF
#define OFF 0
#endif
#define DONE 0x00
#define FAILURE 0x20
#define UNICODE_BASE_ADD 460800 //从FLASH 450K 开始
#define GB_BASE_ADD 563200 //从FLASH 550K 开始
#define ASC_BASE_ADD 307200 //从FLASH 300K 开始
#define INBUF_LEN 1000
uchar xdata rcv_buf[INBUF_LEN];
uint rcv_buf_len = 0;
bit rcv_ovflw_flag = 0;
uchar endflag_counter =0;
bit rcvend_flag = 0;
extern void ScrGotoxy (unsigned char x,unsigned char y);
/*
函数名:unsigned char PortOpen(unsigned char channel,unsigned char *para)
功能: 打开指定的通信口。
输入: channel -> 通信口编号
0 -> RS232
1 -> GSM
para -> 打开通讯口的参数串,例如:
"9600,8,n,1"含义是:波特率9600,8个数据位,无校验,1个停止位
RS232支持的波特率有:300,600,1200,2400,4800,9600, 19200, 38400,和115200
数据位:可以是7或8
校验方式:o是奇校验;e是偶校验;n是无校验(对数据位为7时,不支持无校验方式)
停止位:只能是1
输出: 0x00 打开成功
0x02 通讯参数不支持
全局变量: 无
调用函数: 无
创建人: SunnyZ
创建日期: 2003-8-20
-----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
unsigned char PortOpen(unsigned char channel, unsigned char *para)
{
switch (channel)
{
case RS232: //RS232
GSM_switch(0);
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
BDRCON = 0x00; //BDRCON: set baud rate created by timer
T2CON = 0x00; //T2CON: set baud rate controlled by timer1
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //Baud:115200 fosc=22.1184MHz
TL1 = 0xF4;
//IEN0 |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
//ES = 1;
break;
case GSM: //GSM
GSM_switch(1);
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
BDRCON = 0x00; //BDRCON: set baud rate created by timer
T2CON = 0x00; //T2CON: set baud rate controlled by timer1
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF4; //Baud:4800 fosc=22.1184MHz
TL1 = 0xF4;
//IEN0 |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
// ES = 1;
break;
default:
return(0x02);
break;
}
}
/*
函数名: unsigned char PortSendChar(unsigned char channel,unsigned char ch)
功能: 使用指定的通信口发送一个字节的数据
参数: channel - 通信口编号
0 - RS232
1 - GSM
ch - 待发送的数据(一个字节)
返回值: 0 成功
0x01 该通讯口未打开
0x02 非法通道号
输入: 无
输出: 无
全局变量: 无
调用函数: 无
创建人: ZLJ
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
unsigned char PortSendChar(unsigned char channel,unsigned char ch)
{
if(channel>1)
{
return(0x02);
}
do{
SBUF = ch;
delay(10);
}while(!TI);
TI=0;
return(0x00);
}
/*
函数名: void send_string_com(unsigned char *str,unsigned int strlen)
功能: 发送字符串,strlen为字符串长度
输入: 无
输出: 无
全局变量: 无
调用函数: 无
创建人: ZLJ
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
void PortSendString(unsigned char channel,unsigned char *str)
{
unsigned int k=0,l;
unsigned char *temp_point;
l = strlen(str);
temp_point = str;
do
{
if( PortSendChar(channel,*temp_point) == DONE )
{
temp_point++;
k++;
}
else
{
beep_switch(ON);
delay(10);
beep_switch(OFF);
disp_str(3,7,"Send Failure!");
return;
}
} while(k < l);
// disp_str(3,7,"Send Completed!");
}
/*
函数名: unsigned char PortRecv(unsigned char channel, unsigned char *ch, unsigned int ms)
功能: 从指定的通信口, 接收一个字节的数据.
参数:channel - 通信口编号
0 - RS232
1 - GSM
ms - 接收超时时间(毫秒)
ch - 存放接收到字符的指针.
返回值:0x00 接收字节成功
0x01 该通讯口未打开
0x02 非法通道号
0xff 接收失败(超时)
输入: 无
输出: 无
全局变量: 无
调用函数: 无
创建人: ZLJ
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
unsigned char PortRecv(unsigned char channel, unsigned char *ch, unsigned int ms)
{
uint i=0, j=0;
if (channel >1)
{
return(0x02);
}
while(!RI)
{
i++;
if(i >= 100 )
{
i = 0;
j++;
if(j > ms)
{
return(0xff);
}
}
}
RI = 0;
*ch = SBUF;
//disp_str(0,10,ch);
return(0x00);
}
/*
函数名: void receive_string(unsigned char *str,unsigned int strlen)
功能: 发送字符串,strlen为字符串长度
输入: 无
输出: 无
全局变量: 无
调用函数: 无
创建人: ldq
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
void receive_string(unsigned char *str,unsigned int strlen)
{
unsigned int i;
unsigned char *s;
uchar *temp;
uint j=0;
i = 0;
//str = str + strlen;
temp = str;
for(i=0;i<strlen;i++)
{
RECV_STR:
if (PortRecv(1, s, 1000)==0x00)
{
*str = *s;
str++;
}
else
{
j++;
if (j>1000)
{
memcpy(temp,"com error",9);
break;
}
else
{
goto RECV_STR;
}
}
}
}
//==========================================================================
/*
函数名: void serial () interrupt 4 using 3
功能: 串口接收中断函数
输入: 无
输出: 无
全局变量:
调用函数:
创建人: ZLJ
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
void serial () interrupt 4 // using 3
{
unsigned int i;
unsigned char *temp_point;
char sbuf_p[2];
i = 0;
if(RI)
{
RI = 0;
/*
if((SBUF>0x80) || (SBUF<0x20))
{
putcharLcd(0x5f); //显示不可见字符占位符
}
else
{
putcharLcd(SBUF); //显示接收到的字符
}*/
rcv_buf[rcv_buf_len] = SBUF;
rcv_buf_len++;
/*if( rcv_buf_len >= 1000 ) //判断接收缓冲区是否溢出
{
rcv_ovflw_flag = 1;
rcv_buf_len = 0; //重置缓冲区
}
temp_point = &(rcv_buf[rcv_buf_len-6]);
temp_point = strrpbrk(temp_point, "\r\nOK\r\n");
if( temp_point != NULL )
{
rcvend_flag = 1;
// rcv_buf_len = 0;
} */
}
}
/*
函数名: format_nm(char *nms_buf,char * nms)
功能: 将内码串格式化,主要将半角字符格式化为双字节,输出到nms_buf;
输入: nms
输出: nms_buf
全局变量:
调用函数: readFlash()
创建人: SunnyZ
创建日期: 2003-12-18
----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
void format_nm( char *nms_buf,char * nms)
{
uint idata len_temp;
uint idata i;
//char nms_buf[500];
char * nms_p;
char * nms_pt;
uchar temp;
char disp_temp[10];
//bit bit_temp;
/*bit_temp = EX0;
EX0 = 1;*/
nms_pt = nms;
//memset(nms_buf,0,500);
nms_p = nms_buf;
len_temp = strlen(nms);
for(i=0; i<len_temp; i++)
{
temp = *nms;
/*sprintf(disp_temp,"nm:%4x", temp);
ScrGotoxy(3,7);
putsLcd(disp_temp);
while(!TP_TOUCHED);
TP_TOUCHED = 0;*/
if(temp < 0x80)
{
*nms_p = 0xf8;
nms_p++;
*nms_p = 0x80 + temp;
/*ScrGotoxy(3,8);
putsLcd("COME HERE!");
while(!TP_TOUCHED);
TP_TOUCHED = 0;*/
}
else
{
*nms_p = *nms;
/*ScrGotoxy(3,9);
putsLcd("GO HERE!");
while(!TP_TOUCHED);
TP_TOUCHED = 0;*/
}
nms_p++;
nms++;
}
//EX0 = bit_temp;
//memcpy(nms_pt, nms_buf, strlen(nms_buf));
}
/*
函数名: Nm_Unicode(uint Qw_Number)
功能: 将机内码转换为unicode码;
输入: 机内码(十六进制)
输出: unicode码(十六进制)
全局变量:
调用函数: readFlash()
创建人: SunnyZ
创建日期: 2003-12-17
----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
char * Nm_Unicode(uint Jnm_Number)
{
unsigned long add_p;
uint gbm;
char temp[5];
char disp_temp[10];
/*bit bit_temp;
bit_temp = EX0;
EX0 = 1;*/
gbm = Jnm_Number - 0x8080; //机内码转换为国标码
memset(temp,0,5);
add_p = gbm;
add_p = add_p - 0x2121;
add_p = add_p*4;
add_p = add_p + UNICODE_BASE_ADD;
//add_p = UNICODE_BASE_ADD + (gbm - 0x2121)*4;
/*memset(disp_temp,0,10);
sprintf(disp_temp,"%4x:",gbm);
ScrGotoxy(2,3);
putsLcd(disp_temp);*/
readFlash(add_p,4,temp); //从FLASH中查找对应的UNICODE
/*putsLcd(temp);
while(!TP_TOUCHED);
TP_TOUCHED = 0;
EX0 = bit_temp;*/
return(temp);
}
/*
函数名: Unicode_Nm(uint Unicode)
功能: 将unicode码转换为机内码;
输入: unicode码(十六进制)
输出: 机内码(十六进制)
全局变量:
调用函数: 无
创建人: SunnyZ
创建日期: 2003-12-17
----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
uint Unicode_Nm(uint Unicode_number)
{
uint unicode = 0x0000;
long int add_p;
uint gbm;
uint i = 0;
char temp[5]={0x00,0x00,0x00,0x00,0x00};
add_p = GB_BASE_ADD;
add_p = add_p - 2;
readFlash(add_p,2,temp);
gbm = *((int *)temp); //从FLASH里查国标码对应的UNICODE
//getkeycode(0);
return(gbm + 0x8080);
}
/*
函数名: Nms_Unicode(uint *dent_buf, uint *src_buf)
功能: 将一串机内码转换为相应的unicode码;
输入: 源串src_buf
输出: 目标串dent_buf
全局变量: GB_UnicodeData[],GB_UnicodeDataZF[][2];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -