⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 datasol.c

📁 可以对北京汽车所产生的故障进行诊断的电脑解码器
💻 C
字号:
/******************************************************************************************
 *  目的:文本及资料查询模块
 *  功能:提供基本 资料库 提取接口
 *  模块依赖:FlashCI.h
 ******************************************************************************************/
#include "compiler.h"
#include "FlashIC.h"
#ifdef DEBUGDATASOL
#include <stdio.h>
#include "Display.h"
#include "Keyboard.h"
#endif
/*
**-----------------------------------------------------------------------------------------
** 根据不同的系统读入故障码
** libbaddr:码库起始地址
** sys:系统号
** mcode:待提取的文本号
** TempBuf:输出字符串
**-----------------------------------------------------------------------------------------
*/
char  GetOneMessage( long libbaddr,char sys,unsigned int mcode,unsigned char *TempBuf )
{
#ifdef DEBUGMODE
     DebugString( "GetOneMessage()" );
#endif
     int  i,j,m;
     int sysmcode_n;
     unsigned char page;
     unsigned char Temp,Temp1;
     long addr;
     long address;
#ifdef DEBUGDATASOL
     unsigned char Debug[ 20 ];
#endif
     SPSeek( BEGIN, libbaddr );
     sysmcode_n = 0;
     while ( 1 )
     {
          //获取该故障码库的系统ID -> systemID 库所需的页面大小  ->
          //pagesize 库起始地址 -> addr 鼓掌码的数量 sysmcode_n
          //systemID(1BYTE)+pagesize(1BYTE)+addr(2BTYE)+sysmcode_n(2BTYE)
          Temp = SPGetCH();
          if ( Temp == 0xff )
          {
               return FAIL;
          }
          if ( Temp == (sys&0xff) )  //判断系统号.
          {
               page = SPGetCH();   //系统起始页面
               addr = SPGetCH();   //页内偏移地址高字节
               addr <<= 8;
               addr |= SPGetCH();  //页内偏移地址低字节
               Temp = (unsigned char)SPGetCH();   //故障码数量高字节.
               Temp1 = (unsigned char)SPGetCH();  //故障码数量低字节.
               sysmcode_n = (int)Temp*256 + (int)Temp1;
               address = addr+(long)page*PAGESIZE+libbaddr;
               SPSeek( BEGIN, address );  // 加上起始偏移量
               break;
          }
          else
          {
               SPSeek(CURRENT,5);
          }
     }
#ifdef DEBUGDATASOL
     sprintf( Debug, " %lx" ,address );
     LcdStr86( 1, 8, Debug, BLACK );
     GetAKey( 0 );
#endif
     // 查询故障码
     //xxXXX?xxXXX?xxXXX 形式:码号(2BTYE) + 地址(3BTYE=1BTYE页+2BTYE页内偏移) + 间隔(1BTYE)
     for ( i = 0,m = 0; i < sysmcode_n; i++ )
     {
          //提取码号
          j = SPGetCH();
          j <<= 8;
          j |= SPGetCH();
          if ( j == mcode ) //如果故障码相同.
          {
#ifdef DEBUGDATASOL
               sprintf( Debug, "j=%x" , j );
               LcdStr86( 1, 16, Debug, BLACK );
#endif
               // 确定故障码内容起始地址
               m = (int)SPGetCH();
               j = SPGetCH();
               j <<= 8;
               j |= SPGetCH();
               addr = j;
               addr += (long)m*PAGESIZE;
#ifdef DEBUGDATASOL
               sprintf( Debug, "addr=%lx" , addr );
               LcdStr86( 1, 24, Debug, BLACK );
#endif
               address = addr+libbaddr;
               SPSeek( BEGIN, address );
#ifdef DEBUGDATASOL
               sprintf( Debug, "address=%lx" , address );
               LcdStr86( 1, 32, Debug, BLACK );
               GetAKey( 0 );
#endif
               break;
          }
          else //否则,查找下一条.
          {
               SPSeek( CURRENT,3 );
          }
     }
     //未找到
     if ( i == sysmcode_n )
     {
          return FAIL;
     }
     else
     {
          //NULL
     }
     //提取故障码内容
     for ( i = 0; i < 1200; i++ )  //复制故障码内容到缓存中
     {
          TempBuf[i] = SPGetCH();
          if( TempBuf[i] == 0 ) //两个0代表结束 1个0代表换行
          {
               TempBuf[i] = SPGetCH();
               if( TempBuf[i] == 0 )
               {
                    i=5000;
               }
               else
               {
                    TempBuf[i] = '\0';
                    i=0;
               }
          }
     }
     return SUCCESS;
}

//----------------------------------------------------------------- End Of File --------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -