求助68013 VC 写问题

[复制链接]
3520|1
 楼主| eqyq 发表于 2011-1-20 10:48 | 显示全部楼层 |阅读模式
TI, AN, TE, pen, ge
  1. USB_API HANDLE X_USBOpen()
  2. {

  3.         HANDLE handle = CreateFile(
  4.                 "\\\\.\\Ezusb-0",           
  5.                 GENERIC_READ | GENERIC_WRITE,
  6.     FILE_SHARE_READ | FILE_SHARE_WRITE,
  7.                 NULL,                       
  8.                 OPEN_EXISTING,               
  9.                 FILE_FLAG_SEQUENTIAL_SCAN,                              
  10.                 NULL                        
  11.                 );


  12.         if( handle == INVALID_HANDLE_VALUE)
  13.         {
  14.                 AfxMessageBox("Open device error!");
  15.                 return NULL;
  16.         }


  17.         const int byte_per_each_time=512;
  18.         const int valid_each_line=50;//valid number of char for each line
  19.         const int valid_total_line=8500;

  20.     unsigned char initial_buf[(valid_each_line*valid_total_line)/2];

  21.        



  22.         char FileName[MAX_PATH];
  23.         GetModuleFileName(AfxGetInstanceHandle(), FileName, MAX_PATH);
  24.         CString FilePath;
  25.         FilePath = FileName;
  26.         FilePath = FilePath.Left(FilePath.ReverseFind('\\'));
  27.         FilePath += "\\data\\00000001.prb";

  28.         CFile file;
  29.     BOOL opened = file.Open(_T(FilePath),CFile::modeRead);

  30.         if(!opened)
  31.     {
  32.       AfxMessageBox("No file found!");
  33.       
  34.     }

  35.     DWORD FileLen = file.GetLength();

  36. TCHAR *p = new TCHAR[FileLen] ;
  37. memset(p, 0, sizeof p);

  38. file.Read(p,FileLen);
  39. file.Close();

  40.                         int d=0;

  41.                         while(*p&&p)
  42.                         {
  43.                                 if(*p==' ')
  44.                                 {
  45.                                         p++;
  46.                                 }

  47.                                 else

  48.                                 {
  49.                      if(*p!='\r')
  50.                                          {

  51.                                        initial_buf[d++]=c2i(tolower(p[0]))*16 + c2i(tolower(p[1]));
  52.        
  53.                                          }

  54.                                    p += 2;

  55.                                 }
  56.                         }


  57.   delete p;


  58. //Download the initial_buf array

  59. int t_address=0;
  60. int m=0;

  61. int test=0;

  62. unsigned char download_buffer[byte_per_each_time];


  63.         BULK_TRANSFER_CONTROL BulkControl;
  64.         DWORD nBytes;
  65.         BulkControl.pipeNum = 1;

  66.   for(;m<d;){

  67.     for(int v=0;v<byte_per_each_time;v++){
  68.       download_buffer[v] = initial_buf[t_address];
  69.           t_address++;
  70.      

  71.     }
  72.    
  73.         m=m+byte_per_each_time;


  74.                         BOOL bResult = DeviceIoControl (
  75.                                 handle,
  76.                                 IOCTL_EZUSB_BULK_WRITE,
  77.                                 //&(BulkControl),
  78.                                 (LPVOID)&BulkControl,
  79.                                 sizeof (BULK_TRANSFER_CONTROL),
  80.                                 download_buffer,
  81.                                 byte_per_each_time,
  82.                                 &(nBytes),        
  83.                                 NULL
  84.                                 );

  85.                         if(!bResult){
  86.                                 if (test==0){
  87.                    display(::GetLastError());
  88.                                    test++;
  89.                                 }
  90.                         }


  91.   }


  92.         return handle;
  93. }












1.现在的现象是,有时执行到DeviceIoControl时就卡住了,拔掉USB硬件的电源后GetLastError()返回值为1162(指出的元素不存在)但有时又能正常写入,不稳定,不知道哪里有问题?

2.另外,想请教下用一个CreateFile创建一个Handle,用DeviceIOContrl向设备写数据,写完后要从设备读取数据,是用CloseHandle先把这个Handle 关闭后再新建一个来读,还是不用关闭掉这个Handle直接用DeviceIOControl继续读?
dqyubsh 发表于 2011-1-23 21:00 | 显示全部楼层
不明白你为什么还在用IOCTL函数,这是10年前才不得不采用的API,如果不是有特殊需求,现在可以采用CYAPI编程,简单得多得多得多得多。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

24

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部