⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 关于USB驱动查询 并进行上下行传输数据的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//#include "SiUSBXp.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

SI_STATUS My_SI_STATUS;
bool IsShift=true;
bool ShutDown=false;
int FIRST_RUN=0;
BYTE OutArray[32];
BYTE InArray[64];
static BYTE DeviceCon;
DWORD BytesWritten=32;
DWORD dwBytesWritten = 0;
DWORD BytesRead=64;
DWORD dwBytesRead=0;
DWORD BytesReadRequest = 64 ;
int BytesSucceed = 0;
int X_0=0;
float II1;
float II2;

BYTE GetDeviceCon(void);
BYTE HByte(WORD);
BYTE LByte(WORD);
int combine(BYTE,BYTE);
void GatherData();
WORD SetData(float);
int SetCathodeData(int);
int SetIgniteData(int);
float SetACBreadthData(float);
int SetVOffsetData(int);
float SetACOffsetData(float);
float SetIadjBase1Data(float) ;
float SetIadjBase2Data(float);
float SetIadjSet1Data(float);
float SetIadjSet2Data(float);
float CnvLight1(float);
float CnvLight2(float);
float CnvVoffset(float);
float CnvVHV1(float);
float CnvIHV1(float);
float CnvVHV2(float);
float CnvIHV2(float);
float CnvLighVibrate1(float);
float CnvLighVibrate2(float);
float CnvBeatBreadth1(float);
float CnvBeatBreadth2(float);
float CnvTemp(float);
float CnvCathodeOffset(float);
float CnvVIgnite(float);
float CnvACBreadth(float);
float CnvVACVirtual(float);
float CnvIACVirtual(float);
float CnvVolt(float);
AnsiString myError();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::FormCreate(TObject *Sender)
{
  hUSBDevice = INVALID_HANDLE_VALUE;
  DWORD checkRXBytes, queueStatus;
  //get the list of devices that are connected
  DWORD numDevices = 0;
  My_SI_STATUS=SI_GetNumDevices(&numDevices);
  if(My_SI_STATUS==SI_SUCCESS)
    {
      Form1->Caption="已有"+AnsiString(numDevices)+"个USB设备连接。";
      char deviceString[256];
      for (int i=0; i<(int)numDevices;i++)
           {
           My_SI_STATUS = SI_GetProductString(i, deviceString, SI_RETURN_SERIAL_NUMBER);
           Label18->Caption= deviceString;
            //'return true since we found hardware
           if (SI_Open(0, &hUSBDevice) == SI_SUCCESS)
               {
                 My_SI_STATUS = SI_SetTimeouts(1000, 1000);
                 StatusBar1->Panels->Items[0]->Text="成功打开设备"+ myError();
                }
           else
                 StatusBar1->Panels->Items[0]->Text="设备打开错误"+ myError();
           }
    }
  else
     {
     StatusBar1->Panels->Items[0]->Text="没有检测到设备"+ myError();
     Form1->Caption="未检测到USB设备连接。";
     }
for(BYTE i=0;i<32;i++)
       OutArray[i]=0;


}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
GatherData();
OutArray[30] =0xFF;// 'HByte(TxtOut(17))    '保留,为0表示只设置,不回读
OutArray[31] =0xFF;// 'LByte(TxtOut(17))    '保留,为0表示只设置,不回读
for(BYTE i=0;i<64;i++)
       InArray[i]=0;
DWORD lpdwReadTimeout;
DWORD lpdwWriteTimeout;
My_SI_STATUS=SI_GetTimeouts(&lpdwReadTimeout,&lpdwWriteTimeout);
My_SI_STATUS=SI_Write(hUSBDevice,OutArray,BytesWritten ,&dwBytesWritten) ;
 if(My_SI_STATUS==SI_SUCCESS)
  {
  StatusBar1->Panels->Items[1]->Text="成功写"+AnsiString(dwBytesWritten)+"字节";
  Button3->Enabled=true;
  }
 else
  StatusBar1->Panels->Items[1]->Text="写错误:"+myError();//printError();
My_SI_STATUS=SI_Read(hUSBDevice, InArray, BytesRead, &dwBytesRead,0); // (BYTE *)&

StatusBar1->Panels->Items[2]->Text="读错误:"+ myError();//printError();
     if(My_SI_STATUS==SI_SUCCESS)
     {
      StatusBar1->Panels->Items[2]->Text="成功读"+AnsiString(dwBytesRead)+"字节";

     //阴极偏压采样
     float CCOS=-CnvCathodeOffset(combine(InArray[26], InArray[27]));
     Edit5->Text=AnsiString(CCOS);
     Series1->AddXY(X_0,CCOS,"",clBlue);
     //引燃高压采样
     float CVI=CnvVIgnite(combine(InArray[28], InArray[29]));
     Edit6->Text=AnsiString(CVI);
     Series2->AddXY(X_0,CVI,"",clBlue);
     //高压调流1电压采样
     float CVHV1=-CnvVHV1(combine(InArray[8], InArray[9]));
     Edit9->Text=AnsiString(CVHV1);
     Series5->AddXY(X_0,CVHV1,"",clBlue);
     //高压调流1电流采样
     float CVHI1=-CnvIHV1(combine(InArray[10], InArray[11]));
     Edit7->Text=AnsiString(CVHI1);
     Series3->AddXY(X_0,CVHI1,"",clBlue);
     //高压调流2电压采样
     float CVHV2=-CnvVHV2(combine(InArray[12], InArray[13]));
     Edit10->Text=AnsiString(CVHV2);
     Series6->AddXY(X_0,CVHV2,"",clBlue);
     //高压调流2电流采样
     float CVHI2=-CnvIHV2(combine(InArray[14], InArray[15]));
     Edit8->Text=AnsiString(CVHI2);
     Series4->AddXY(X_0,CVHI2,"",clBlue);

     Label26->Caption=AnsiString(InArray[48]);             //机器号
     Label27->Caption=AnsiString(InArray[49]);             //状态字
     Label29->Caption=AnsiString(OutArray[26]);            //控制字

     X_0++;  //横坐标累加
//     for(int i=0;i<64;i++)
//     Memo2->Lines->Add(AnsiString(i)+":"+InArray[i]);
//     if(CVHV1<100|CVHV2<100)
//        {
//        if(Edit1->Text.ToInt()>2400)
//        {
//        Edit1->Text=Edit1->Text.ToInt()+100;
//        Button2Click(Sender);
//        }
//        }
//     if(CVHV1>300|CVHV2>300)
//        {
//        if(Edit1->Text.ToInt()>100)
//        {
//        Edit1->Text=Edit1->Text.ToInt()-100;
//        Button2Click(Sender);
//        }
//        }
     Form1->Caption=OutArray[10];
     }
     else
     {
      StatusBar1->Panels->Items[0]->Text= myError();
     }
}
//---------------------------------------------------------------------------

//'设置数转换
void GatherData()
{
    WORD  IadjSet1= SetData(SetIadjSet1Data(Form1->Edit3->Text.ToDouble()));//
    WORD  IadjSet2= SetData(SetIadjSet2Data(Form1->Edit4->Text.ToDouble()));
    WORD  CathodeSet = SetData(SetCathodeData(Form1->Edit1->Text.ToInt()));
    WORD  IgniteSet = SetData(SetIgniteData(Form1->Edit2->Text.ToInt()));
    WORD  VOffsetSet1 = SetData(SetVOffsetData(0));
//    WORD  VOffsetSet2 = SetData(SetVOffsetData(0));
    WORD  ACBreadthSet = SetData(SetACBreadthData(0));
    WORD  ACOffsetSet = SetData(SetACOffsetData(0));
    WORD FreqAdjStepMin =0;         // '稳频调节小步距
    WORD FreqAdjStepMax =0;        // '稳频调节大步距
    //WORD FreqVoltBase = 0;       //    '稳频电压初始点
    WORD FreqVoltBase = SetData(SetVOffsetData(0));
    WORD IadjBase1 = SetData(SetIadjBase1Data(0));        //      '高压调流初始值1
    WORD IadjBase2 = SetData(SetIadjBase2Data(0));        //      '高压调流初始值2
    DeviceCon = GetDeviceCon();          //'控制字
    //高压调流设定值1
    OutArray[0] = HByte(IadjSet1);
    OutArray[1] = LByte(IadjSet1);
    // 高压调流设定值2
    OutArray[2] = HByte(IadjSet2);     
    OutArray[3] = LByte(IadjSet2);
    //阴极偏压设定值
    OutArray[4] = HByte(CathodeSet);    
    OutArray[5] = LByte(CathodeSet);
    //阳极引燃设定值
    OutArray[6] = HByte(IgniteSet);     
    OutArray[7] = LByte(IgniteSet);
    //偏压电压1设定值
    OutArray[8] = HByte(VOffsetSet1);
    OutArray[9] = LByte(VOffsetSet1);
    //偏压电压2设定值
    OutArray[10] =BYTE(0);// HByte(VOffsetSet2);
    OutArray[11] =BYTE(0);// LByte(VOffsetSet2);
    //交流驱动幅值设定值
    OutArray[12] = HByte(ACBreadthSet); 
    OutArray[13] = LByte(ACBreadthSet);
    //交流驱动偏置设定值
    OutArray[14] = HByte(ACOffsetSet);   
    OutArray[15] = LByte(ACOffsetSet);
    //保留
    OutArray[16]=0;
    OutArray[17]=0;
    OutArray[18] = FreqAdjStepMin;//       '稳频调节小步距
    OutArray[19] = FreqAdjStepMax;//       '稳频调节大步距
    OutArray[20] = HByte(FreqVoltBase);//  '稳频电压初始点
    OutArray[21] = LByte(FreqVoltBase);
    OutArray[22] = HByte(IadjBase1);//     '高压调流初始值1
    OutArray[23] = LByte(IadjBase1);
    OutArray[24] = HByte(IadjBase2);//     '高压调流初始值2
    OutArray[25] = LByte(IadjBase2);
    OutArray[26] = DeviceCon;           //'控制字
//  OutArray(27)  '保留
//  OutArray(28)  '保留
//  OutArray(29)  '保留
    OutArray[27] = 0x4;//    '抖动频率高8位
    OutArray[28] = 0xEA;//  '抖动频率中8位'450Hz
    OutArray[29] = 0x4A;//   '抖动频率低8位'450Hz
    OutArray[30] =0;// 'HByte(TxtOut(17))    '保留,为0表示只设置,不回读
    OutArray[31] =0;// 'LByte(TxtOut(17))    '保留,为0表示只设置,不回读
    }
// 设置转换
WORD SetData(float Volt )  //设置电压数转为16进制数
{
return (Volt/10.24*0x7FFF)+0x8000;
}
//阴极偏压设置
int SetCathodeData(int Volt)
{
return Volt/250; //'500
}
//阳极引燃电压设置
int SetIgniteData(int Volt)
{
return Volt/300;// '600 '* 2
}
//'偏置电压
int SetVOffsetData(int Volt)
{
return Volt*8.0/160.0;
}
//'交流幅值设定
float SetACBreadthData(float Volt)
{
return Volt / 65.0 * 10.24;
}
//'交流偏置设定
float SetACOffsetData(float Volt)
{
return Volt/10.0;//#
}
//'高压调流1初始值
float  SetIadjBase1Data(float Current)
{
float SetIadjBase1Data0 = -(Current / 1000 * 4700 + 0.65);
if (IsShift)
    SetIadjBase1Data0 = -(Current / 1000 * 824.561 + 0.65);  //'换档
return   SetIadjBase1Data0;
}
//'高压调流2初始值
float SetIadjBase2Data(float Current)
{
float SetIadjBase2Data0 = -(Current / 1000 * 4700 + 0.65);
if (IsShift)
    SetIadjBase2Data0 = -(Current / 1000 * 824.561 + 0.65); //'换档
return   SetIadjBase2Data0;
}
//'高压调流1设置值
float SetIadjSet1Data(float Current)
{
float SetIadjSet1Data0 = -Current / 1000 * 4700 ;//'7186
if(IsShift)
SetIadjSet1Data0 = -Current / 1000 * 824.561;
return  SetIadjSet1Data0;
}
//'高压调流2设置值
float SetIadjSet2Data(float Current)
{
float SetIadjSet2Data0 = -Current / 1000 * 4700; //'7186
if(IsShift)
SetIadjSet2Data0 = -Current / 1000 * 824.4561;
return  SetIadjSet2Data0;
}
//'获得一个整数的高字节
BYTE HByte(WORD data)
{
WORD Temp;
Temp = data&0xFF00;
Temp = Temp/256;
//if (Temp < 0) Temp =Temp+ 256;     //  temp=temp>>8;
return Temp;
}
//'获得一个整数的低字节
BYTE LByte(WORD data)
{
WORD  Temp;
Temp = data;
Temp = Temp&0x00FF;
return Temp;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
GatherData(); 
My_SI_STATUS=SI_Write(hUSBDevice, OutArray,BytesWritten ,&dwBytesWritten);
 if(My_SI_STATUS==SI_SUCCESS)
  {
  StatusBar1->Panels->Items[1]->Text="成功写"+AnsiString(dwBytesWritten)+"字节";
  Button1Click(Sender);
  Button2->Enabled=true;   
  Button3->Enabled=true;
  Button6->Enabled=true;
  }
 else
  StatusBar1->Panels->Items[1]->Text="写错误:"+myError();//printError();
}
//---------------------------------------------------------------------------
BYTE GetDeviceCon(void)
{
    BYTE Temp= 0;
//    If (ChkFreeOn.Value) Then Temp = Temp Or &H1 ': ChkFreeOn.Value = False  '引燃
    if(Form1->CheckBox1->Checked)
        Temp=Temp|0x1;
// 1路开

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -