📄 sk.c
字号:
length = LongToStr(DT->tm_min,Data_Buf); if(length<2) { Data_Buf[1] = Data_Buf[0]; Data_Buf[0] = 0x30;} DT_buf[5]=CharToBCD(Data_Buf); //分钟 memmove(DATE,DT_buf,6);}//---------------------------------------------------------------------------//功能: 设置linux下的系统时间 (红旗2000郭永仕提供)//参数: datestr: 所要设置的系统时间 格式为:"YYYYMMDDHHMMSS" 例:"20040305100101"表示2004年3月5日10点1分0秒//注意: 此功能只能在root用户下使用//该函数不检查datestr的正确性,调用前确保datestr的正确.//时间秒在这里没用到int GYSSetSystemDate(unsigned char *datestr){ char date[13]; char datecmd[25]; memset(date,0,13); //date的格式是mmddhhmmyyyy,跟datestr不一样 memcpy(date,datestr+4,8); memcpy(date+8,datestr,4); sprintf(datecmd,"date %s",date); system(datecmd); //执行date MMDDHHMMYYYY命令 system("hwclock --systohc"); //执行hwclock --systohc命令更新bios时间 return 1;}/*//功能: 设置linux下的系统时间 (红旗2000郭永仕提供)//参数: datestr: 所要设置的系统时间 格式为:"YYYYMMDDHHMMSS" 例:"20040305100101"表示2004年3月5日10点1分0秒//注意: 此功能只能在root用户下使用int GYSSetSystemDate(unsigned char *datestr){ char year[5]; char month[3]; char day[3]; char hours[3]; char minutes[3]; char seconds[3]; time_t when; struct tm t; struct timeval tv; int ret; if(strlen(datestr)!=14) { printf("invalid date\n"); return -1; } //初始化变量 memset(year,0,5); memset(month,0,3); memset(day,0,3); memset(hours,0,3); memset(minutes,0,3); memset(seconds,0,3); //将 年月日时分秒 信息填入日期时间结构 memcpy(year,datestr,4); memcpy(month,datestr+4,2); memcpy(day,datestr+6,2); memcpy(hours,datestr+8,2); memcpy(minutes,datestr+10,2); memcpy(seconds,datestr+12,2); t.tm_year=atoi(year)-1900; //年 年减去1900,如2004年是104 t.tm_mon=atoi(month)-1; //月 0是一月,1是二月...... t.tm_mday=atoi(day); //日 1~ t.tm_hour=atoi(hours); //时 0~23 t.tm_min=atoi(minutes); //分 0~59 t.tm_sec=atoi(seconds); //秒 0~59 if(t.tm_year<104 || t.tm_mon<0 || t.tm_mon>11 || t.tm_mday<1 || t.tm_mday>31 || t.tm_hour<0 || t.tm_hour>23 || t.tm_min<0 || t.tm_min>59 || t.tm_sec<0 || t.tm_sec>59) { printf("invalid date\n"); return -1; } when=mktime(&t); tv.tv_sec=when; tv.tv_usec=0; ret=settimeofday(&tv,(struct timezone *)0); return ret;}*///---------------------------------------------------------------------------//功能: 设置时间//参数: timeInfoStr: 所要设置时间 格式为:"HH-MM" 例:"1001"表示设置时间为当天10点1分//返回: 0:正常 -1:设置系统时间参数错int MySetTime(unsigned char *timeInfoStr){ unsigned char sys_date_time[20]; unsigned char tmp_data[10]; int i,err; memset(sys_date_time,0x0,20); memset(tmp_data,0x0,10); SystemDateToBcd(tmp_data); //得到当前系统日期 for(i=0;i<4;i++) BCDtoChar(&sys_date_time[i*2],tmp_data[i]); memmove(&sys_date_time[8],timeInfoStr,2); //得到需要设置的时间 memmove(&sys_date_time[10],&timeInfoStr[3],2); memmove(&sys_date_time[12],"00",2); //当前秒为'00' err = GYSSetSystemDate(sys_date_time); //设置当前时间 if(err == -1) return 0xa3; //参数错误 return 0; }//---------------------------------------------------------------------------/* 功能: 延时 2001.11.22 增加 *//* 参数: MSEL:延时毫秒数 */void Morra(int MSEL){ usleep(MSEL);}//---------------------------------------------------------------------------//工作状态握手//ESC,CMD81,SUB00,LEN=5,CheckSum//ESC,CMD81,SUB00,LEN=6,err,CheckSumint WorkHandshake(void){ int err=0; unsigned char work_handshake_command[] = {0x1b,0x81,0,5,0,0}; unsigned char return_buf[20]; memset(return_buf,0x0,20); err = SendCommand(work_handshake_command,work_handshake_command[3],return_buf); //接收数据 if(err || return_buf[4]) { if(err) return err; else return return_buf[4]; } return err;}//---------------------------------------------------------------------------//ESC,CMD81,SUB01,LEN=7+数据长,addr(int),data数据,CheckSum (MAX数据长=132)//ESC,CMD81,SUB01,LEN=6,err,CheckSum 见err表//功能:向 eeprom 写//参数: add: 写入Eeprom的地址// length: 写入数据长度// buf: 写入数据内容//返回: =0:操作成功 !=0:见错误对照表int WriteEeprom(int add,int length,unsigned char *buf){ unsigned char write_eeprom_command[200] = {0x1b,0x81,0x01,0,0,0}; int err=0; unsigned char return_buf[20]; short write_address; memset(&write_eeprom_command[3],0,190); //初始化write_eeprom_command[200]数据部分 write_eeprom_command[3] = 7 + length; //发送全部数据长度 write_address = add; memmove(&write_eeprom_command[4],(unsigned char *)&write_address,2); //写Eeprom地址 memmove(&write_eeprom_command[6],buf,length); //需要写的数据内容 memset(return_buf,0x0,20); err = SendCommand(write_eeprom_command,write_eeprom_command[3],return_buf); //发送命令 if(err || return_buf[4]) { if(err) return err; else return 0x85; //return return_buf[4]; //Eeprom写失败 } return err;}//---------------------------------------------------------------------------//ESC,CMD81,SUB02,LEN=8,addr(int),len,CheckSum (MAX len =132)//ESC,CMD81,SUB02,LEN=5+数据长,data数据,CheckSum//功能:从 eeprom 读//参数: add: 写入Eeprom的地址// length: 写入数据长度// buf: 写入数据内容//返回: =0:操作成功 !=0:见错误对照表int ReadEeprom(int add,int length,unsigned char *buf){ unsigned char read_eeprom_command[10] = {0x1b,0x81,0x02,8,0,0,10,0,0}; int err=0; short addr; unsigned char return_buf[200]; memset(return_buf,0x0,200); addr = add; memmove(&read_eeprom_command[4],(unsigned char *)&addr,2); if(length>132) read_eeprom_command[6] = 132; else read_eeprom_command[6] = length; err = SendCommand(read_eeprom_command,read_eeprom_command[3],return_buf); //接收数据 if(err) return err; memmove(buf,&return_buf[4],length); return err;}//---------------------------------------------------------------------------//向 flash rom 写//ESC,CMD81,SUB03,LEN=9+数据长,addr(long),data数据,CheckSum (MAX数据长=132)//ESC,CMD81,SUB03,LEN=6,err,CheckSum 见err表int WriteFlash(int dataLength,int dataAddress,unsigned char *data){ int err=0; unsigned char write_flash_command[200] = {0x1b,0x81,0x03,0,0,0}; unsigned char return_buf[20]; memset(&write_flash_command[3],0x0,197); write_flash_command[3] = 9 + dataLength; //命令长度 memmove(&write_flash_command[4],(unsigned char *)&dataAddress,4); memmove(&write_flash_command[8],data,dataLength); memset(return_buf,0x0,20); err = SendCommand(write_flash_command,write_flash_command[3],return_buf); //接收数据 if(err || return_buf[4]) { if(err) return err; else return 0x86; //return return_buf[4]; //Flash页读写失败 } return err;}//---------------------------------------------------------------------------//从 flash rom 读//ESC,CMD81,SUB04,LEN=10,addr(long),len,CheckSum (MAX len =132)//ESC,CMD81,SUB04,LEN=5+数据长,data数据,CheckSumint ReadFlash(int dataLength,unsigned long dataAddress,unsigned char *data){ int err; unsigned char read_flash_command[20] = {0x1b,0x81,0x04,10,0}; unsigned char return_buf[200]; memset(&read_flash_command[4],0x0,16); memset(return_buf,0x0,200); memmove(&read_flash_command[4],(unsigned char *)&dataAddress,4); //读数据起始地址 read_flash_command[8] = dataLength; //读出数据长度 err = SendCommand(read_flash_command,read_flash_command[3],return_buf); //发送命令 if(err) return err; memmove(data,&return_buf[4],dataLength); return err;}//---------------------------------------------------------------------------//Eeprom_Add_18 3个字节 为本次税控器命令执行状态 // 第一个字节 是命令号 // 第二个字节 命令执行状态(如果和第一个字节相同表示命令已完成) // 第三个字节 打印执行状态(如果和前两个字节相同表示打印已完成)// 需要相应的命令包括: 82 83 84 85 87 88 8c 8d 93 98int WriteFunAppState(unsigned char command_number){ int err; unsigned char state[5]; //状态 memset(state,0x0,5); state[0] = command_number; err = WriteEeprom(EepromAdd_18+2,1,state); //EepromAdd_18+2 //写此标志表示此命令已执行完成 return err;}//---------------------------------------------------------------------------//得到卡状态//ESC,CMD81,SUB05,LEN=5,CheckSum//ESC,CMD81,SUB05,LEN=7,card_in(卡插入),type(卡类型),CheckSum//卡插入=1; 卡类型 >= 0x10->45db041卡,>=0x01->用户卡,>=0x02->管理卡int GetCardState(unsigned char *ifCardInfix,unsigned char *cardType){ int err; unsigned char get_card_state_command[] = {0x1b,0x81,0x05,5,0,0}; unsigned char return_buf[20]; memset(return_buf,0x0,20); err = SendCommand(get_card_state_command,get_card_state_command[3],return_buf); //发送命令 if(err) return err; *ifCardInfix = return_buf[4]; *cardType = return_buf[5]; return err;}//---------------------------------------------------------------------------//向 IC 卡 写 (AT45DB041)//ESC,CMD81,SUB06,LEN=9+数据长,addr(long),data数据,CheckSum (MAX数据长=132)//ESC,CMD81,SUB06,LEN=6,err,CheckSum 见err表int Write45DB041Card(int dataLength,unsigned char *writeData,int writeAddress){ int err; unsigned char write_45DB041card_command[150] = {0x1b,0x81,0x06,0,0}; unsigned char return_buf[20]; memset(&write_45DB041card_command[3],0x0,147); write_45DB041card_command[3] = 9+dataLength; memmove(&write_45DB041card_command[4],(unsigned char *)&writeAddress,4); memmove(&write_45DB041card_command[8],writeData,dataLength); err = SendCommand(write_45DB041card_command,write_45DB041card_command[3],return_buf); //发送命令 if(err || return_buf[4]) { if(err) return err; else return return_buf[4]; } return err;}//---------------------------------------------------------------------------//显示 一个字//ESC,CMD81,SUB08,LEN=7,pos(显示位置0--15),char(要显示的asc字符),CheckSumvoid LCDShowChar(unsigned char buf,int position){ unsigned char show_command[30] = {0x1b,0x81,0x08,7,0,0,0,0}; int err; show_command[4] = position; //字符显示位置 show_command[5] = buf; //所显示的字符 //idComm1 = ComPortInit( SKPORT , 9600 ); idComm1 = ComPortInit( SKPORT , 38400 ); if(idComm1 == -1) return; //打开串口失败 err = SendOneCommand(show_command,show_command[3]); //发送命令 close(idComm1); //关闭串口 sleep(1); printf("LCDShowChar Function err=%d\n",err);}//---------------------------------------------------------------------------//显示 一行字//ESC,CMD81,SUB09,LEN=5+16,str[16](要显示的字符串,不足补0x20),CheckSumvoid LCDShowLineString(unsigned char *buf){ unsigned char show_command[30] = {0x1b,0x81,0x09,5+16,0}; int err,length; memset(&show_command[4],0x20,10); length = strlen(buf); if(length > 16) length = 16; memmove(&show_command[4],buf,length); //idComm1 = ComPortInit( SKPORT , 9600 ); idComm1 = ComPortInit( SKPORT , 38400 ); if(idComm1 == -1) return; //打开串口失败 err = SendOneCommand(show_command,show_command[3]); //发送命令 close(idComm1); //关闭串口 sleep(1); printf("LCDShowLineString Function err=%d\n",err);}//---------------------------------------------------------------------------//显示 时钟//ESC,CMD81,SUB0A,LEN=5,CheckSumvoid LCDShowData(void){ unsigned char show_command[10] = {0x1b,0x81,0x0a,5,0}; int err; //idComm1 = ComPortInit( SKPORT , 9600 ); idComm1 = ComPortInit( SKPORT , 38400 ); if(idComm1 == -1) return; //打开串口失败 err = SendOneCommand(show_command,show_command[3]); //发送命令 close(idComm1); //关闭串口 printf("LCDShowData Function err=%d\n",err);}//---------------------------------------------------------------------------//进入 自检//ESC,CMD81,SUB0B,LEN=5,CheckSum//ESC,CMD81,SUB0B,LEN=6,err,CheckSumint IntoTest(void){ int err=0; unsigned char into_test_command[] = {0x1b,0x81,0x0b,5,0,0}; unsigned char return_buf[20]; memset(return_buf,0x0,20); err = SendCommand(into_test_command,into_test_command[3],return_buf); //接收数据 if(err || return_buf[4]) { if(err) return err; else return return_buf[4]; } return err;}//---------------------------------------------------------------------------//税控初始化时向Flash写一页日期//ESC,CMD81,SUB0d,LEN=5+24,DATA...,CheckSum//ESC,CMD81,SUB0d,LEN=6,err,CheckSum//参数: DATA格式: 页号(short int)、写入日期个数(1byte)、本页起始偏移地址(1byte)、写入第一个日期字节数(1byte)// 、写入第二个日期字节数(1byte)写入第三个日期字节数(1byte)、日期数据(12byte) 19个字节int WritePageFlash(unsigned char *data){ int err=0; unsigned char write_page_flash_command[30] = {0x1b,0x81,0x0d,5+19,0,0}; unsigned char return_buf[20]; memmove(&write_page_flash_command[4],data,19); err = SendCommand(write_page_flash_command,write_page_flash_command[3],return_buf); //接收数据 if(err || return_buf[4]) { if(err) return err; else return return_buf[4]; } usleep(50); return err;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -