扫描头是能够进行配置的,使其支持与禁用某些条码类型,设置有两种方式,一种是扫一下相应的设置条码,还有一种是通过SSI(simple serial interface)来设置,以下就讲一下SSI的设置方式。
扫描头在上电以后,就能够对其发送相应參数设置了,摩托罗拉建议设置暂时參数。设置永久生效的參数会损害扫描头内部的flash,flash损坏后扫描头将无法使用,比方出现一个点的激光,正常情况是一条线。flash寿命有限,请谨慎。暂时设置会在扫描头断电以后丢失。每次上电的时候都要设置一次,所以建议将须要设置的參数写入到注冊表中。每次上电以后从注冊表读取。
附上设置的基本代码,细致阅读凝视部分(请依据自身平台改动部分实现):
static CHAR wakeup[] = {0x00};//2's complement sum of message contents excluding checksum.
static size_t __CheckSum(CHAR data[],size_t d_size)
{size_t count=0;size_t sum=0;if(data == NULL || d_size <= 0){return 0;}while(d_size--){sum+=(data[d_size] & 0xFF);}return ((~sum)+1);
}
//store params to register,when power off
int SetScannerSetValueToLocal(void *data,size_t len)
{
#ifdef WINCEHKEY hk;ULONG dw=REG_BINARY,dwDisp;ULONG dwSize=sizeof(dw);CHAR param[1024]={0};size_t iRetVal=0;assert(data!=NULL && len>0);if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWARE\\SCANDev\\SETTING"),0,0,&hk)){if(RegQueryValueEx(hk,_T("Value"),0,&dw,(LPBYTE)param,&dwSize)==ERROR_SUCCESS){RegDeleteValue(hk,_T("Value"));RegSetValueEx(hk,_T("Value"),0,dw,(LPBYTE)data,len);}else{iRetVal=-1;}}else{if(ERROR_SUCCESS == RegCreateKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWARE\\SCANDev\\SETTING"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hk, &dwDisp)){RegSetValueEx(hk,_T("Value"),0,dw,(LPBYTE)data,len);}else{iRetVal=-1;}}RegCloseKey(hk);return iRetVal;
#endif
}static void __GetScannerSetValueFromLocal(void *data,size_t in_len,size_t * out_len)
{
#ifdef WINCEHKEY hk;ULONG dw=REG_BINARY;ULONG dwSize=sizeof(dw);CHAR param[1024]={0};if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWARE\\SCANDev\\SETTING"),0,0,&hk)){if(RegQueryValueEx(hk,_T("Value"),0,&dw,(LPBYTE)param,&dwSize)==ERROR_SUCCESS){if(dwSize <=0){return;}else{memcpy(data,param,dwSize);*out_len=dwSize;}}}RegCloseKey(hk);
#endif /*end of macro WINCE*/
}//when scanner engine power on,you can call this function
static size_t SetParamValues(void)
{
#ifdef WINCEsize_t check_sum=0;CHAR param_list[1024]={0};size_t count=0;size_t len=0,i=0;CHAR buffer[4096]={0};//Attention!!! Temporary change - lost when power removed//Failure to meet these conditions can corrupt the scan engine's memory.//must be 0x00,0xFF,not is 0x01,0xFFCHAR temp[]={0xC6,0x04,0x00,0xFF};__GetScannerSetValueFromLocal(param_list,sizeof(param_list),&count);if(param_list == NULL || count <= 0){return -1;}len=sizeof(temp)/sizeof(CHAR);buffer[0]=((count+len+1)&0xFF); //lengthmemcpy(buffer+1,temp,len);memcpy(buffer+len+1,param_list,count);check_sum=__CheckSum(buffer,len+count+1);buffer[len+count+1]=((check_sum>>8)&0xFF); //height bytebuffer[len+count+2]=(check_sum&0xFF); //low bytewrite_com_data(wakeup,sizeof(wakeup));_Sleep(100); //change from 70 to 100ms waiting for scanner wakeupwrite_com_data(buffer,len+count+3); //Length: 1 byte,CheckSum: 2 bytereturn 0;
#endif /*end of macro WINCE*/
}
write_com_data的API是平台相关性的,请依据自身平台不同改动实现。