📄 usbulkctl.cpp
字号:
0x8033,0x0036,0x003c,0x8039,0x0028,0x802d,0x8027,0x0022,
0x8063,0x0066,0x006c,0x8069,0x0078,0x807d,0x8077,0x0072,
0x0050,0x8055,0x805f,0x005a,0x804b,0x004e,0x0044,0x8041,
0x80c3,0x00c6,0x00cc,0x80c9,0x00d8,0x80dd,0x80d7,0x00d2,
0x00f0,0x80f5,0x80ff,0x00fa,0x80eb,0x00ee,0x00e4,0x80e1,
0x00a0,0x80a5,0x80af,0x00aa,0x80bb,0x00be,0x00b4,0x80b1,
0x8093,0x0096,0x009c,0x8099,0x0088,0x808d,0x8087,0x0082,
0x8183,0x0186,0x018c,0x8189,0x0198,0x819d,0x8197,0x0192,
0x01b0,0x81b5,0x81bf,0x01ba,0x81ab,0x01ae,0x01a4,0x81a1,
0x01e0,0x81e5,0x81ef,0x01ea,0x81fb,0x01fe,0x01f4,0x81f1,
0x81d3,0x01d6,0x01dc,0x81d9,0x01c8,0x81cd,0x81c7,0x01c2,
0x0140,0x8145,0x814f,0x014a,0x815b,0x015e,0x0154,0x8151,
0x8173,0x0176,0x017c,0x8179,0x0168,0x816d,0x8167,0x0162,
0x8123,0x0126,0x012c,0x8129,0x0138,0x813d,0x8137,0x0132,
0x0110,0x8115,0x811f,0x011a,0x810b,0x010e,0x0104,0x8101,
0x8303,0x0306,0x030c,0x8309,0x0318,0x831d,0x8317,0x0312,
0x0330,0x8335,0x833f,0x033a,0x832b,0x032e,0x0324,0x8321,
0x0360,0x8365,0x836f,0x036a,0x837b,0x037e,0x0374,0x8371,
0x8353,0x0356,0x035c,0x8359,0x0348,0x834d,0x8347,0x0342,
0x03c0,0x83c5,0x83cf,0x03ca,0x83db,0x03de,0x03d4,0x83d1,
0x83f3,0x03f6,0x03fc,0x83f9,0x03e8,0x83ed,0x83e7,0x03e2,
0x83a3,0x03a6,0x03ac,0x83a9,0x03b8,0x83bd,0x83b7,0x03b2,
0x0390,0x8395,0x839f,0x039a,0x838b,0x038e,0x0384,0x8381,
0x0280,0x8285,0x828f,0x028a,0x829b,0x029e,0x0294,0x8291,
0x82b3,0x02b6,0x02bc,0x82b9,0x02a8,0x82ad,0x82a7,0x02a2,
0x82e3,0x02e6,0x02ec,0x82e9,0x02f8,0x82fd,0x82f7,0x02f2,
0x02d0,0x82d5,0x82df,0x02da,0x82cb,0x02ce,0x02c4,0x82c1,
0x8243,0x0246,0x024c,0x8249,0x0258,0x825d,0x8257,0x0252,
0x0270,0x8275,0x827f,0x027a,0x826b,0x026e,0x0264,0x8261,
0x0220,0x8225,0x822f,0x022a,0x823b,0x023e,0x0234,0x8231,
0x8213,0x0216,0x021c,0x8219,0x0208,0x820d,0x8207,0x0202
};
// *计算长度为len的buf缓冲区中字节的CRC-16校验和
// *返回的CRC-16校验和是字长型的无符号数
// *crc是用于累计的CRC-16校验和
// *buf是字节型的指针
// *len是按字节buf的长度*/
unsigned int GetCRC16(unsigned char *buf,unsigned int len)
{
unsigned int i;
unsigned int crc;
unsigned int comb_val;
crc = 0;
comb_val = 0;
for(i=0;i<len;i++)
{
comb_val = ((crc>>8) ^ *buf++) & 0xff;
crc = (crc<<8) ^ crctab[comb_val];
}
return (crc);
}
BSTR CUsbulkCtrl::WriteUsbFile(LPCTSTR sPath, LPCTSTR dPath, LPCTSTR fileName)
{
CString strResult;
CString filePath;
HANDLE hFile;
ULONG fileSize;
USHORT cs=0;
////unsigned long threadResult;
//int crc;
DWORD res;
UINT rxLength=64;
ULONG respLen;
char *rxBuf;
filePath = sPath;
filePath.Replace("//","\\");
if (filePath.Right(1)!="\\")
filePath = filePath + "\\";
filePath = filePath + fileName;
hFile=CreateFile(filePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
strResult =TEXT("Err: file is not exist\n") ;
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
fileSize=GetFileSize(hFile,NULL);
if(fileSize>0x2800000) //如果文件大于40M,提示用户写入的文件过大
{
strResult.Format(TEXT("Err: filesize is %d, must be less than 41943040.\n"),fileSize);
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
//发送目录名
filePath = dPath;
filePath.Replace("\\","/");
if (filePath.Right(1)!="/")
filePath = filePath + "/";
int NameLen = filePath.GetLength();
//txBufSize = NameLen+10;
txBufSize = NameLen+8;
txBuf=(char *)malloc(txBufSize);
if(txBuf==NULL)
{
strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),txBufSize; //内存不够
CloseHandle(hFile);
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
*((DWORD *)txBuf+0) = 0x0006101B;
*((DWORD *)txBuf+1) = txBufSize-2;
memcpy((char *)txBuf+8, filePath,NameLen);
//crc = GetCRC16((unsigned char *)txBuf,txBufSize-2);
//*((WORD *)(txBuf+8+NameLen))=crc; //attach checksum
res = SendToUSB64((void *)0); //发送
if (res==(int)txBufSize)
{
rxBuf = (char *)malloc(rxLength);
if(rxBuf==NULL)
{
strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength; //内存不够
CloseHandle(hFile);
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
hRead = open_file(inPipe);
UINT success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);
if (*((WORD *)rxBuf+0)!=0x4B4F)
{
strResult = "Err: Create Directory Failed!"; //创建目录失败
CloseHandle(hFile);
free((void *)rxBuf);
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
free((void *)rxBuf);
// close devices if needed
//if(hRead != INVALID_HANDLE_VALUE)
CloseHandle(hRead);
}
//发送文件名
filePath = fileName;
NameLen = filePath.GetLength();
//txBufSize = NameLen+10;
txBufSize = NameLen+8;
txBuf=(char *)malloc(txBufSize);
if(txBuf==NULL)
{
strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),txBufSize; //内存不够
//strResult = "1";
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
*((DWORD *)txBuf+0) = 0x0002101B;
*((DWORD *)txBuf+1) = txBufSize-2;
memcpy((char *)txBuf+8, filePath,NameLen);
//crc = GetCRC16((unsigned char *)txBuf,txBufSize-2);
//*((WORD *)(txBuf+8+NameLen))=crc; //attach checksum
res = SendToUSB64((void *)0); //发送
//free((void *)txBuf);
if (res==(int)txBufSize)
{
rxBuf = (char *)malloc(rxLength);
if(rxBuf==NULL)
{
strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength; //内存不够
//strResult = "1";
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
hRead = open_file(inPipe);
UINT success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);
if (*((WORD *)rxBuf+0)!=0x4B4F)
{
strResult = "Err: Create File Failed!"; //创建文件失败
//strResult = "1";
free((void *)rxBuf);
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
free((void *)rxBuf);
// close devices if needed
//if(hRead != INVALID_HANDLE_VALUE)
CloseHandle(hRead);
}
//发送写文件命令
hWrite = open_file(outPipe);
if(hWrite==INVALID_HANDLE_VALUE)
{
MessageBox(TEXT("Err: Can't open USB device.\n"),TEXT("Error"),
MB_OK | MB_ICONINFORMATION );
strResult = TEXT("Err:Can't open USB device.\n");
//strResult = "1";
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
txBufSize=fileSize+10;
txBufSize=fileSize+fileSize/60*4+8;
txBuf=(char *)malloc(txBufSize);
if(txBuf==NULL)
{
strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),txBufSize;
//strResult = "1";
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
*((DWORD *)txBuf+0) = 0x0003101B;
*((DWORD *)txBuf+1) = txBufSize-2;
unsigned long readSize;
//+++++++++++++++++ReadFile(hFile,(char *)txBuf+8,fileSize,&readSize,NULL);
//+++++++++++++++++
unsigned long i;
unsigned long p=0;
int pSize=60;
for(i=0;i<fileSize;i++)
{
*((char *)txBuf+i+4*p) = 0x1B;
*((char *)txBuf+i+4*p+1) = 0x11;
*((char *)txBuf+i+4*p+2) = 0x01;
*((char *)txBuf+i+4*p+3) = 0x40;
if((i+pSize)<fileSize)
{
pSize = 60;
}
else
{
pSize = fileSize-i;
*((char *)txBuf+i+4*p) = 0x1B;
*((char *)txBuf+i+4*p+1) = 0x11;
*((char *)txBuf+i+4*p+2) = 0x00;
*((char *)txBuf+i+4*p+3) = pSize+4;
}
p++;
ReadFile(hFile,(char *)txBuf+i+4*p,pSize,&readSize,NULL);
i = i + pSize - 1;
}
readSize=fileSize;
//-----------------
if(readSize!=fileSize)
{
strResult = TEXT("Err: Read File Error\n") ;
CloseHandle(hFile);
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
iTxBuf=0;
CloseHandle(hFile);
//crc = GetCRC16((unsigned char *)txBuf,txBufSize-2);
//*((WORD *)(txBuf+8+fileSize))=crc; //attach checksum
////////////////////单线程方式开始
//初始化进度框
//
void *txBlk;
ULONG txBlkSize;
DWORD nBytesWrite;
_hDlgDownloadProgress=NULL;
HINSTANCE hInstance=AfxGetInstanceHandle();
CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),m_hWnd,DownloadProgressProc); //modaless
InitDownloadProgress();
DWORD txBufSize100=txBufSize/100;
if(txBufSize100==0) txBufSize100=1;
while(1)
{
CheckMessageQueue();
if((txBufSize-iTxBuf) > TX_SIZE)
txBlkSize=TX_SIZE;
else
txBlkSize=txBufSize-iTxBuf;
txBlk=(void *)(txBuf+iTxBuf);
if(!WriteFile(hWrite,txBlk,txBlkSize,&nBytesWrite,NULL))
{
strResult.Format("Err: Write %d\n",iTxBuf);
break;
}
iTxBuf+=TX_SIZE;
/*
if((iTxBuf%0x100000)==0)
{
//延时1000毫秒,等待隔离器关闭文件
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do
{
CheckMessageQueue();
dwEnd = GetTickCount()-dwStart;
}while(dwEnd <3000);
}
*/
if(((iTxBuf/txBufSize100)%2)==1)
DisplayDownloadProgress(iTxBuf/txBufSize100);
if(downloadCanceled==1)break; //download is canceled by user.
if(iTxBuf>=txBufSize)break;
}
free((void *)txBuf);
CloseHandle(hWrite);
if(downloadCanceled==1) //exit by user.
{
strResult = "Err: Write is canceled by user";
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
//接收Device返回的4F4B
DisplayDownloadProgress(100); //数据传输完成,进度条显示100%
rxBuf = (char *)malloc(rxLength);
if(rxBuf==NULL)
{
strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength; //内存不够
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
hRead = open_file(inPipe);
UINT success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);
if (*((WORD *)rxBuf+0)!=0x4B4F)
{
strResult = "Err: Write USB Failed!"; //创建目录失败
free((void *)rxBuf);
RecordLog("WriteUsbFile",fileName,strResult);
CloseHandle(hRead);
CloseDownloadProgress();
return strResult.AllocSysString();
}
free((void *)rxBuf);
// close devices if needed
//if(hRead != INVALID_HANDLE_VALUE)
CloseHandle(hRead);
//接收4F4B完成
CloseDownloadProgress();
/////////////////单线程方式结束
/*****************************
threadResult=_beginthread( (void (*)(void *))UsbTxFile,0x2000,(void *)0);
//threadResult=_beginthread( (void (*)(void *))UsbTxFile64,0x2000,(void *)0);
if(threadResult!=-1)
{
//Create the download progress dialogbox.
HINSTANCE hInstance=AfxGetInstanceHandle(); //获得当前程序的实例句柄
HWND hwnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),m_hWnd,DownloadProgressProc); //modaless
if(NULL == hwnd){
DWORD dwerr = GetLastError();
}
//ShowWindow(_hDlgDownloadProgress,SW_SHOW);
//isn't needed because the dialog box already has WS_VISIBLE attribute.
}
else
{
strResult =TEXT("Err: Can't creat a thread. Memory is not sufficient\n") ;
//strResult = "1";
free((void *)txBuf);
return strResult.AllocSysString();
}
//The dialog box will be closed at the end of TxFile().
//free(txBuf) & CloseHandle(hWrite) will be done in TxFile()
//strResult =TEXT("OK\n") ;
//*****************************/
strResult = "0";
RecordLog("WriteUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
BSTR CUsbulkCtrl::ReadUsbFile(LPCTSTR sPath, LPCTSTR dPath, LPCTSTR fileName)
{
UINT rxLength=64;
ULONG respLen;
long success;
char *rxBuf;
void *txBlk;
ULONG txBlkSize;
CString filePath;
CString strResult;
//int crc;
DWORD res;
long nSumLength;
CFile nTargetFile;
CString tFileName;
/*
//获取文件大小
nSumLength = -1;
nSumLength = GetFileLength(sPath,fileName);
if (nSumLength<0)
{
strResult = "Err: file is not exist."; //源文件不存在
//strResult = "1";
RecordLog("ReadUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
*/
//发送文件名(sPath+fileName)
filePath = sPath;
if ((!filePath.IsEmpty()) && (filePath.Right(1)!="/")) //路径名与文件名之间加"/"
filePath = filePath + "/";
filePath = filePath + fileName;
int NameLen = filePath.GetLength();
//txBufSize = NameLen+10;
txBufSize = NameLen+8;
txBuf=(char *)malloc(txBufSize);
if(txBuf==NULL)
{
strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),txBufSize; //内存不够
//strResult = "1";
RecordLog("ReadUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
*((DWORD *)txBuf+0) = 0x0005101B;
*((DWORD *)txBuf+1) = txBufSize-2;
memcpy((char *)txBuf+8, filePath,NameLen);
//crc = GetCRC16((unsigned char *)txBuf,txBufSize-2);
//*((WORD *)(txBuf+8+NameLen))=crc; //attach checksum
res = SendToUSB64((void *)0); //发送
if (res==(int)txBufSize)
{
rxBuf = (char *)malloc(rxLength);
if(rxBuf==NULL)
{
strResult = TEXT("Err: Memory Allocation Fail:(%d)\n"),rxLength; //内存不够
//strResult = "1";
RecordLog("ReadUsbFile",fileName,strResult);
return strResult.AllocSysString();
}
hRead = open_file(inPipe);
nSumLength = -1;
UINT success = ReadFile(hRead,rxBuf,rxLength,&respLen,NULL);
WORD crc = *((char *)rxBuf+*((char *)rxBuf+3)+0);
WORD CRC = *((char *)rxBuf+*((char *)rxBuf+3)+1);
crc = crc<<8 ;
crc = (crc & 0xFF00) + (CRC & 0x00FF);
CRC = GetCRC16((unsigned char *)rxBuf+0,*((char *)rxBuf+3));
//Crc=(Crc>>8)+(Crc<<8);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -