日期:2014-05-18 浏览次数:21200 次
//这里的详细代码没有给出。
openDevice();
openHandles();
//重点:
int result = FileIOApiDeclarations.WriteFile(this._WriteHandle,ref command[0], command.Length,ref TxdBytes, 0);
if (result == 0)
{
int error = Usb.DebuggingDeclarations.GetLastError();
string str = "";
long size = 0;
Usb.DebuggingDeclarations.FormatMessage(Usb.DebuggingDeclarations.FORMAT_MESSAGE_ALLOCATE_BUFFER | Usb.DebuggingDeclarations.FORMAT_MESSAGE_FROM_SYSTEM | Usb.DebuggingDeclarations.FORMAT_MESSAGE_IGNORE_INSERTS, ref size, error, 0, str, 0, 0);
Log.WriteLog("error when set read command" + str);
this.closeHandles();
return retResult;
}
//FileIOApiDeclarations.CloseHandle(this._WriteHandle);
int relReaded = 0;
Usb.FileIOApiDeclarations.OVERLAPPED overlapped = new Usb.FileIOApiDeclarations.OVERLAPPED();
this.PrepareForOverlappedTransfer(ref overlapped);
System.Threading.Thread.Sleep(500);
result = FileIOApiDeclarations.ReadFile(this._ReadHandle, ref data[0], length, ref relReaded, ref overlapped);
/*[color=#FF0000]错误出现在此处,每次到这里程序完全没有响应了,拔掉USB设备时程序下行,GetLastError会返回31
前边的获取GUID,writeFlie都是正确的 [/color]*/
if (result == 0) // error handle
{
int error = Usb.DebuggingDeclarations.GetLastError();
if (error == FileIOApiDeclarations.ERROR_IO_PENDING)
{
FileIOApiDeclarations.WaitForSingleObject(overlapped.hEvent, 30000);
int readBytes = 0;
result = FileIOApiDeclarations.GetOverlappedResult(this._ReadHandle, ref overlapped, ref readBytes, false);
if (result != 0)
retResult = true;
}
init_USBused();
init_TimerA();
init_TimerB();
RWsw = P2IN & BIT5; // for USB Write Data
if(RWsw == 0)
{
FCTL2 = FWKEY + FSSEL0 + FN0;
FlashErase(ipatient);
FlashErase(isetup);
}
MCU_D12RST_0; //片选usb
_NOP();
MCU_D12RST_1; //reset usb 芯片
bEPPflags.value = 0;
_EINT();
reconnect_USB();
P1IE = 0X04;
opcode = 0xff;
index = 0;
while(1)
{
if (bEPPflags.bits.ep2_rxdone) //端点2接收响应
{
bEPPflags.bits.ep2_rxdone = 0; //flag set zero
if(opcode == 0xff)
{
//D12_ReadEndpoint(4, 6, EpBuf);
if(EpBuf[0] == 0x01)//if(EpBuf[0] == 0x01)
{
opcode = 1;
addr = EpBuf[2]*0x100 + EpBuf[3];
length = EpBuf[4]*0x100 + EpBuf[5];
cur_addr = addr;
fileoff = 0;
}
else if(EpBuf[0] == 0x00)
{
opcode = 0;
addr = EpBuf[2]*0x100 + EpBuf[3];
length = EpBuf[4]*0x100 + EpBuf[5];
cur_addr = addr;
fileoff = 0;
}
}
else if(opcode == 1) //将usb接到的数据写入寄存器
{
if(index == 256)
{
index = 0;
for(ptr = 0; ptr < 256