110,538
社区成员
发帖
与我相关
我的任务
分享
public void btnStart_Click(object sender, EventArgs e)
{
//读取数据
DeviceLgcID = 0;
hDevice = PCI8620.PCI8620_CreateDevice(DeviceLgcID); // 创建设备对象
if (hDevice == (IntPtr)(-1))
{
printMessage("请检查设备是否安装正确!");
btnStart.Enabled = true;
return;
}
// 预置硬件参数
//ADPara.ADMode = PCI8620.PCI8620_ADMODE_SEQUENCE;
ADPara.FirstChannel = 0; // 首通道0
ADPara.LastChannel = 1; // 末通道1
ADPara.Frequency = 100000; // 采样频率(Hz)
ADPara.GroupInterval = 1; // 组间间隔(uS)
ADPara.Gains = PCI8620.PCI8620_GAINS_1MULT;
ADPara.InputRange = InputRange; // 模拟量输入量程范围
ADPara.TriggerMode = PCI8620.PCI8620_TRIGMODE_SOFT; // 触发模式为软件触发
ADPara.TriggerSource = PCI8620.PCI8620_TRIGSRC_ATR; // 选择外部ATR作为触发源
ADPara.TrigLevelVolt = 0;
ADPara.TriggerType = PCI8620.PCI8620_TRIGTYPE_EDGE; // 边沿触发
ADPara.TriggerDir = PCI8620.PCI8620_TRIGDIR_NEGATIVE; // 触发方向为负向
ADPara.ClockSource = PCI8620.PCI8620_CLOCKSRC_IN; // 内部时钟
ADPara.bClockOutput = PCI8620.PCI8620_CLOCKOUT_DISABLE; // 禁止本卡上的自带时钟向外输出
bRet = PCI8620.PCI8620_InitDeviceProAD(hDevice, ref ADPara) > 0; // 初始化硬件
if (!bRet)
{
printMessage("初始化设备失败!");
PCI8620.PCI8620_ReleaseDeviceProAD(hDevice);
PCI8620.PCI8620_ReleaseDevice(hDevice);
}
Int32 ChannelCount;
ChannelCount = ADPara.LastChannel - ADPara.FirstChannel + 1;
nReadSizeWords = 8192 - 8192 % (UInt32)ChannelCount; // 将数据长度字转换为双字
bRet = PCI8620.PCI8620_StartDeviceProAD(hDevice) > 0; // 启动设备
if (!bRet)
{
printMessage("启动设备失败!");
PCI8620.PCI8620_ReleaseDeviceProAD(hDevice);
PCI8620.PCI8620_ReleaseDevice(hDevice);
}
collectThread = new Thread(new ThreadStart(CollectData));
handleThread = new Thread(new ThreadStart(HandleData));
handleThread.Start();
collectThread.Start();
printMessage("开启数据接收卡!");
printMessage("开始接收数据!");
btnStart.Enabled= false;
btnStop.Enabled = true;
//读取数据
}
void CollectData()
{
int ReadIndex = 0;
int SegmentCount = 0;
while(true)
{
bRet = PCI8620.PCI8620_ReadDeviceProAD_Npt(hDevice, ref ADBuffer[ReadIndex, 0], nReadSizeWords, ref nRetSizeWords) > 0;//是用的一个dll里面的函数,ADBuffer[ReadIndex, 0]是我的缓冲区一个二维数组(全局定义UInt32[,] ADBuffer = new UInt32[32,8192]; 当ADBuffer[0, 0]相当于第一个缓冲区采集满数据)
SegmentCount++;
ReadIndex++;
if (SegmentCount==31)
{
SegmentCount = 0;
}
if (ReadIndex==31)
{
ReadIndex = 0;
}
nowSegmentCount = SegmentCount;
}
}
//处理数据
void HandleData()
{
Thread.Sleep(1000);
double xx = 0, yy = 0;
int flagCountI1 = int.Parse(sysFile.ReadString("SYSTEM", "INTERVALI1", "5"));
int flagCountI2 = int.Parse(sysFile.ReadString("SYSTEM", "INTERVALI2", "5"));
var closedLoopCie = sysFile.ReadString("SYSTEM", "ClosedloopCoefficient", "");
var clearedNum1 = sysFile.ReadString("SYSTEM", "averageClearedNum1", "");
var clearedNum2 = sysFile.ReadString("SYSTEM", "averageClearedNum2", "");
//配置采样点
var sampLingNum = sysFile.ReadString("SYSTEM", "SAMPLINGNUM", "");
while (true)
{
int handleSegmentCount = nowSegmentCount;//(nowSegmengtCount是全局变量,主要是获取采集里面的那个二维数组采集到那个缓冲区了)
for (int i = 0; i < handleSegmentCount; i++)
{
for (int j = 0; j < 8192; j++)
{
//if (i == 31)
//{
// i = 0;
//}
fVolt = (20000.00 / 8192) * (ADBuffer[i, j] & 0x1FFF) - 10000.00;
..................
............//这里主要是电压的一些转换和一些计算代码很多
}
}
}
for (int j = 0; j < 8192; j++)
{
//if (i == 31)
//{
// i = 0;
//}
//fVolt = (20000.00 / 8192) * (ADBuffer[i, j] & 0x1FFF) - 10000.00;
// ..................
// ............//这里主要是电压的一些转换和一些计算代码很多
}
int handleSegmentCount = nowSegmentCount;//(nowSegmengtCount是全局变量,主要是获取采集里面的那个二维数组采集到那个缓冲区了)
for (int i = 0; i < handleSegmentCount; i++)
while (true)
{
Thread.Sleep(1000);
}