SSI2.0使用说明 一 更新说明 ssi2.0可以被多个应用程序打开,扫描到的条码会按调用初始化函数 SSI_Register的顺序发到每一个应用程序。 二 函数接口 初始化 BOOL SSI_Register(HWND hwnd, UINT msgID); 参数 hwnd [in] 注册接收ssi2.0库消息的窗口 msgID [in] 注册接收ssi2.0库消息的消息 ID 返回值 非0表示成功,0表示失败。 备注 这是ssi2.0的初始化函数,也是应用程序调用的第一个函数。扫描的所有消息会发送 到注册的窗口。用户在应用程序中处理此消息。 注销 void SSI_Unregister(HWND hwnd, UINT msgID); 参数 hwnd [in] 注册接收ssi2.0库消息的窗口句柄 msgID [in] 注册接收ssi2.0库消息的消息 ID 备注 这是ssi2.0的注销函数,也是应用程序调用的最后一个函数。切记在退出程序前一定 要调用此函数,并且参数要和调用SSI_Register时一致,否则ssi2.0库会仍然向hwnd发消息,而此时hwnd已经无效,会引发不可预料的问题。 获取条码队列中的第一个条码获取条码队列中的第一个条码 BOOL SSI_GetData(PBARCODE pBarCode); 参数 pBarCode [out] 指向一个BARCODE类型的结构,里面存放获取到的条码信息。 返回值 非0表示成功,0表示失败。 备注 ssi2.0有两种触发扫描的方式,一种是按扫描键,另一种是调用SSI_StartScan()函数。触发扫描之后,如果扫到条码,会放到一个先进先出的条码队列中,用户可随时调此函数取出位于第一个位置的条码。此函数的调用并不影响条码队列,只有SSI_ResetData()才会删除位于第一个位置的条码。 获取条码队列中的第一个条码的名称 , UINT len); BOOL SSI_GetBarcodeName(LPTSTR buffer 参数 buffer [out] 指向一个字符串缓冲区,用于接收条码的名称。 len [in] 指示buffer可容纳的字符数。 返回值 非0表示成功,0表示失败。 删除条码队列中的第一个条码 void SSI_ResetData(); 判断条码队列中是否有条码 BOOL SSI_IsDataReady(); 返回值 非0表示成功,0表示失败。 内置的提醒 void SSI_ReadOK(UINT remind); 参数 remind 0x02表示震动提醒,0x03表示既发声又[in] 提醒方式。0x01表示声音提醒, 震动。 备注 ssi2.0内置的提醒方式,支持声音提醒、震动提醒,或两者组合。成功扫到条码后可 调用此函数提醒用户。 打开扫描功能 BOOL SSI_EnableScan(); 返回值 非0表示成功,0表示失败。 备注 打开扫描功能。默认扫描功能是开启的。 关闭扫描功能 BOOL SSI_DisableScan(); 返回值 非0表示成功,0表示失败。 备注 关闭扫描功能。默认扫描功能是开启的,可用此函数暂时关闭扫描功能。 开始扫描 BOOL SSI_StartScan(); 返回值 非0表示成功,0表示失败。 备注 调用此函数触发一次扫描,扫到条码后激光关闭,或者超时后激光关闭。 停止扫描 BOOL SSI_StopScan(); 返回值 非0表示成功,0表示失败。 备注 调用SSI_StartScan()触发扫描后,如果想中止,调用此函数停止扫描。 向扫描头发送命令 BOOL SSI_SendCommandString(BYTE *command,int len); 参数 command [in] 发送给扫描头的命令,格式请参阅symbol文档。 len [in] 指示command的长度,以字节为单位。 返回值 非0表示成功,0表示失败。 备注 直接通过串口向扫描头发送命令的函数。 获取扫描头的配置参数 BOOL SSI_GetParams(PSCANNER_PARAMS pParams); 参数 pParams 类型的结构,里面存放获取到的扫描头配[out] 指向一个SCANNER_PARAMS置参数。 返回值 非0表示成功,0表示失败。 设置扫描头的配置参数 BOOL SSI_SetParams(PSCANNER_PARAMS pParams); 参数 pParams [in] 指向一个SCANNER_PARAMS类型的结构,里面是扫描头配置参数。 返回值 非0表示成功,0表示失败。 获得symbol se955扫描头出厂时的参数 BOOL SSI_GetFactoryDefault(PSCANNER_PARAMS pParams); 参数 pParams 类型的结构,里面存放获取到的symbol [out] 指向一个SCANNER_PARAMSse955出厂时的参数。 返回值 非0表示成功,0表示失败。 三 数据结构 条码信息 typedef struct tagBARCODE { UINT type; UINT len; TCHAR code[MAX_BARCODE_LEN]; }BARCODE, *PBARCODE; 成员说明 type 条码的类型。取值为以下之一: enum { BCT_CODE_39, // Code 39 BCT_CODABAR, // CodaBar BCT_CODE_128, // Code 128 BCT_DISCRETE_2OF5, // Discrete 2 of 5 BCT_INTERLEAVED_2OF5, // Interleaves 2 of 5 BCT_CODE_93, // Code 93 BCT_UPC_A, // UPC A BCT_UPC_A_2SUPPS, // UPC A with 2 Supps BCT_UPC_A_5SUPPS, // UPC A with 5 Supps BCT_UPC_E0, // UPC E BCT_UPC_E0_2SUPPS, // UPC E with 2 Supps BCT_UPC_E0_5SUPPS, // UPC E with 5 Supps BCT_EAN_8, // EAN 8 BCT_EAN_13, // EAN 13 BCT_EAN_13_2SUPPS, // EAN 13 with 2 Supps BCT_EAN_13_5SUPPS, // EAN 13 with 5 Supps BCT_MSI_PLESSEY, // MSI Plessey BCT_EAN_128, // EAN 128 BCT_UPC_E1, // UPC E1 BCT_UPC_E1_2SUPPS, // UPC E1 with 2 Supps BCT_UPC_E1_5SUPPS, // UPC E1 with 5 Supps BCT_TRIOPTIC_CODE_39, // TRIOPTIC CODE 39 BCT_BOOKLAND_EAN, // Bookland EAN BCT_COUPON_CODE, // Coupon Code BCT_RSS_14, // RSS-14 BCT_RSS_LIMITED, // RSS-Limited BCT_RSS_EXPANDED, // RSS-Expanded BCT_CODE_11, // Code 11 BCT_CODE_32, // Code 32 BCT_CODE_39_FULLASCII, // Code 39 full ascii BCT_ISBT_128, // ISBT-128 BCT_UNIDENTIFY, // unidentifiable code }; len 条码的长度。 code 条码的字符串。 扫描头配置参数 typedef struct tagSCANNER_PARAMS { // common BYTE BeeperVolume; BYTE BeeperTone; BYTE BeeperFrequencyAdjustment; BYTE LaserOnTime; BYTE AimDuration; BYTE ScanAngle; BYTE PowerMode; BYTE TriggerMode; BYTE TimeoutBetweenSameSymbol; BYTE BeepAfterGoodDecode; BYTE TransmitNoReadMessage; BYTE ParameterScanning; BYTE LinearCodeTypeSecurityLevels; BYTE BidirectionalRedundancy; // UPC/EAN BYTE UPC_A; BYTE UPC_E; BYTE UPC_E1; BYTE EAN_8; BYTE EAN_13; BYTE Bookland_EAN; BYTE Decode_UPC_EAN_Supplementals; BYTE BYTE BYTE BYTE BYTE BYTE BYTE BYTE BYTE BYTE BYTE BYTE BYTE Decode_UPC_EAN_SupplementalRedundancy; Transmit_UPC_A_CheckDigit; Transmit_UPC_E_CheckDigit; Transmit_UPC_E1_CheckDigit; UPC_A_Preamble; UPC_E_Preamble; UPC_E1_Preamble; Convert_UPC_E_to_A; Convert_UPC_E1_to_A; EAN_8_ZeroExtend; Convert_EAN_8_to_EAN_13_Type; UPC_EAN_SecurityLevel; UCC_CouponExtendCode; // Code 128 BYTE Code128; BYTE UCC_EAN_128; BYTE ISBT_128; // Code 39 BYTE Code39; BYTE TriopticCode39; BYTE Covert_Code39_to_Code32; BYTE Code32Prefix; BYTE SetLengthForCode39; BYTE SetLengthForCode39_2; BYTE Code39CheckDigitVerification; BYTE TransmitCode39CheckDigit; BYTE Code39FullAsciiConversion; // Code 93 BYTE Code93; BYTE SetLengthForCode93; BYTE SetLengthForCode93_2; // Code 11 BYTE Code11; BYTE SetLengthForCode11; BYTE SetLengthForCode11_2; BYTE Code11CheckDigitVerification; BYTE TransmitCode11CheckDigit; // Interleaved 2 of 5 BYTE Interleaved_2_5; BYTE BYTE BYTE BYTE BYTE SetLengthFor_I2_5; SetLengthFor_I2_5_2; I2_5_CheckDigitVerification; Transmit_I2_5_CheckDigit; Convert_I2_5_to_EAN_13; // Descrete 2 of 5 BYTE Descrete_2_5; BYTE SetLengthFor_D2_5; BYTE SetLengthFor_D2_5_2; // Chinese 2 of 5 BYTE Chinese_2_5; // Codabar BYTE Codabar; BYTE SetLengthsForCodabar; BYTE SetLengthsForCodabar_2; BYTE CISI_Editing; BYTE NOTIS_Editing; // MSI BYTE MSI; BYTE SetLengthsForMSI; BYTE SetLengthsForMSI_2; BYTE MSICheckDigits; BYTE TransmitMSICheckDigit; BYTE MSICheckDigitAlgorithm; // RSS BYTE RSS_14; BYTE RSS_Limited; BYTE RSS_Expanded; BYTE Covert_RSS_to_UPC_EAN; // Data options BYTE TransmitCodeIDCharacter; BYTE Prefix; BYTE Suffix1; BYTE Suffix2; BYTE ScanDataTransmissionFormat; // Serial interface BYTE BaudRate; BYTE Parity; BYTE SoftwareHandshaking; BYTE DecodeDataPacketFormat; BYTE HostSerialResponseTimeout; BYTE StopBitSelect; BYTE InterCharacterDelay; BYTE HostCharacterTimeout; // Event reporting BYTE DecodeEvent; BYTE BootupEvent; BYTE ParameterEvent; }SCANNER_PARAMS, *PSCANNER_PARAMS; 成员说明 成员较多,请参阅symbol se955文档《 SE955 Rev-A_June 06.pdf》,Table8-1,第92页。 四 示例代码 ssi2.0库通过消息机制通知应用程序扫描结果,用户调用SSI_Register函数将窗口句柄 和一个自定义的消息ID发给ssi2.0库,当有事件发生时,ssi2.0库发送相应的消息。目 前只有一种消息需要处理:SM_DATAREADY 。 #include \"ss2.h\" #define WM_SCANNER_MSG WM_USER + 100 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { WORD wEvent; switch (message) { case WM_CREATE: // 初始化 if (!SSI_Register(hWnd, WM_SCANNER_MSG)) { } // 提示用户扫描头始化失败 …… PostQuitMessage(0); return FALSE; } break; case WM_SCANNER_MSG: wEvent = LOWORD(wParam); switch (wEvent) { case SM_DATAREADY: // 收到消息后的处理 if (SSI_IsDataReady()) { BARCODE BarCode = {0}; TCHAR szTypeName[64] = {0}; // 获取条码 SSI_GetData(&BarCode); // 获取条码类型的名称,没有需要可以不调用 SSI_GetBarcodeName(szTypeName, 64); // 提醒,没有需要可以不调用 SSI_ReadOK(0x01); // 清除条码 SSI_ResetData(); …… } break; default: break; } break; case WM_DESTROY: SSI_Unregister(hWnd, WM_SCANNER_MSG); PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; // 初始化