📄 pda.c
字号:
#include "include.h"
/***********************************************************
函数:uchar Pda_input(uchar *TUclen, uchar TUcHzbuf[])
版本:1.0.0.5
日期:20020722 9:47
----------------------------------------------------------
功能:PDA传送汉字内码串到税控机
入口参数:
uchar *TUclen: 汉字内码串长度指针
uchar TUcHzbuf[]: 汉字内码串
出口参数:
uchar *TUclen: 返回汉字内码串的长度指针
uchar TUcHzbuf[]: 返回汉字内码串
函数返回:
通信成功返回0,否则返回错误代码
错误代码:0xFE:按【取消】直接退出
//0x01:校验码错
//0x02:开始标志错
//0x03:汉字内码串长度错
//0x04:汉字内码错
//0xFF:通讯错误,延时退出
通讯协议:
1、 手写板与收款机的通讯波特率: 9600,N,8,1
2、 手写板发送给收款机的数据格式为:
开始标志(一个字节) : ESC (0x1B)
汉字长度(一个字节) : N
数据(N个字节) : 汉字内码
算术检验和(一个字节) : 前 N+2 个字节的算术和
例子:PDA发送汉字"开发科技"
1B 08 BF AA B7 A2 BF C6 BC BC E2
-头-长- 汉字内码串 -算术校验和-
3、 税控收款机应答格式:
接收正确发送十六进制:11 EE ,手写板正确结束;
接收错误发送十六进制:22 DD ,
手写板重发,重发3次还未成功则失败结束;税控机则报警。
4 、硬件特性,RS232通讯,逻辑1为5V,接口第九针接5V直流电源
**************************************************************/
uchar Pda_input(uchar *TUcLen, uchar TUcHzbuf[])
{
#define MAXPDALEN 60 //最大的PDA输入长度(0~255),100相当于50个汉字
uchar JJJ,KKK,i,
LUcSum, //算术和
LUcLen, //汉字内码串长度,<=100
LUcErr, //错误标志,0正确,1错误
LUcErrCount; //错误次数
uchar xdata LUcBufRece[MAXPDALEN+3]; //接收缓冲,1byte(头)+1byte(长)+100byte(汉字内码串)+1byte(尾)
uchar xdata LUcBufSend[2]; //发送缓冲
//uchar LUcBufDisp[10]; //显示缓冲
LUcErrCount=0; //初始化错误计数器
LUcErr=0; //初始化错误标志
// beep(255);
//select_com(0); //选取RS232串口
modify_rate2(3); //选取波特率9600bps
clear_rece_buffer2(); //清除接收缓冲区
do //等待PDA传送汉字,否则按[取消]退出
{
openbacklight();
if(low_pwr)//等1时表示已关掉了交流电
return(POWER_OFF);
JJJ=get_key();
if(JJJ==VOID)
return(VOID); //lyj
if(!rece2(1,LUcBufRece)) //接收包头和长度
{
if((LUcBufRece[0]==0x1B)&&!rece2(1,&LUcBufRece[1]))//开始标志和汉字长度是否正确
{
LUcLen=LUcBufRece[1];
if((LUcLen<=MAXPDALEN)&&!rece2(LUcLen+1,&LUcBufRece[2])) //接收汉字内码串和包尾
{
LUcSum=0;
for(i=0;i<LUcLen+2;i++) LUcSum+=LUcBufRece[i];//计算代数校验和
if(LUcSum==LUcBufRece[LUcLen+2]) //比较校验和
{
delayms(200);
LUcBufSend[0]=0x11;
LUcBufSend[1]=0xEE;
send_str2(2,LUcBufSend);//接收正确发送十六进制:11 EE
memcpy(TUcHzbuf,&LUcBufRece[2],LUcLen);//返回汉字内码串
*TUcLen=LUcLen; //返回汉字内码串长度指针
return 0;
}
}
}
LUcErr++;
}
if(LUcErr>0) //判断是否有错
{
delayms(200);
clear_rece_buffer(); //清除接收缓冲区
LUcBufSend[0]=0x22;
LUcBufSend[1]=0xDD;
send_str2(2,LUcBufSend);//接收错误发送十六进制:22 DD
LUcErr=0;
LUcErrCount++; //错误次数加1
//beep(100);
if (LUcErrCount>3) //错误次数大于3报警
{
do
{
KKK=get_key();
beep(255);
}while(KKK!=CLEAR); //按【清除】退出报警循环,重新等待PDA传送汉字
LUcErrCount=0;
}
}
}while(JJJ!=VOID);//按【取消】退出等待PDA传送汉字循环
return VOID;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -