/// <summary> /// 回调方式获取数据 /// </summary> public void DataCallBackReceiveFun() { if (!Connected) { return; } if (_heightData != null) { for (var i = 0; i < _heightData.Length; i++) { _heightData[i] = -1000000; } } //开始批处理 var _currentDeviceId = 0; var rc = -1; var dataObject = new IntPtr(); rc = _bIoTrigger ? SR7LinkFunc.SR7IF_StartIOTriggerMeasure(_currentDeviceId, 20000, 0) : SR7LinkFunc.SR7IF_StartMeasure(_currentDeviceId, 20000); if (rc < 0) { var t3X1 = "批处理操作失败,返回值:" + rc.ToString(); MessageBox.Show(t3X1, @"提示", MessageBoxButtons.OK); return; } // 获取批处理总行数 var tempBatchPoint = SR7LinkFunc.SR7IF_ProfilePointSetCount(_currentDeviceId, dataObject); // 获取轮廓宽度 _mDataWidth = SR7LinkFunc.SR7IF_ProfileDataWidth(_currentDeviceId, dataObject); // 数据x方向间距(mm) _mXPitch = SR7LinkFunc.SR7IF_ProfileData_XPitch(_currentDeviceId, dataObject); var tmt = ""; var tx1 = "批处理行数:" + tempBatchPoint; var tx2 = "轮廓宽度:" + _mDataWidth; var tx3 = "数据x方向间距(mm):" + _mXPitch; tmt = tx1 + "\r\n" + tx2 + "\r\n" + tx3; }
/// <summary> /// 回调接受数据 /// </summary> /// <param name="buffer"></param> 指向储存概要数据的缓冲区的指针. /// <param name="size"></param> 每个单元(行)的字节数量. /// <param name="count"></param> 存储在pBuffer中的内存的单元数量. /// <param name="notify"></param> 中断或批量结束等中断的通知. /// <param name="user"></param> 用户自定义信息. public void ReceiveHighSpeedData(IntPtr buffer, uint size, uint count, uint notify, uint user) { if (notify != 0) { if (Convert.ToBoolean(notify & 0x08)) { SR7LinkFunc.SR7IF_StopMeasure(0); System.Console.Write(@"批处理超时!\n"); MessageBox.Show(@"批处理超时", @"提示", MessageBoxButtons.OK); _mCurBatchNo = 0; } } if (count == 0 || size == 0) { return; } var profileSize = (uint)(size / Marshal.SizeOf(typeof(int))); //轮廓宽度 // 获取批处理总行数 var dataObject = new IntPtr(); var tempBatchPoint = SR7LinkFunc.SR7IF_ProfilePointSetCount(0, dataObject); _batchCallBackPoint = tempBatchPoint; _mBatchWidth = Convert.ToInt32(profileSize); //数据拷贝 var bufferArray = new int[profileSize * count]; Marshal.Copy(buffer, bufferArray, 0, (int)(profileSize * count)); var tmpNum = Convert.ToInt32(_mCurBatchNo * profileSize); if (_mCurBatchNo >= _batchCallBackPoint) { return; } if (_mCurBatchNo + count > _batchCallBackPoint) { var tmpCount = _batchCallBackPoint - _mCurBatchNo; Array.Copy(bufferArray, 0, _heightData, tmpNum, count * tmpCount); GC.Collect(); } else { Array.Copy(bufferArray, 0, _heightData, tmpNum, profileSize * Convert.ToInt32(count)); GC.Collect(); } _mCurBatchNo += Convert.ToInt32(count); _bCall = true; if (notify == 0) { return; } if (notify == 0x10000) { SR7LinkFunc.SR7IF_StopMeasure(0); System.Console.Write(@"数据接收完成!\n"); _bCall = false; _mCurBatchNo = 0; var tmpys = (int)(Convert.ToDouble(_batchCallBackPoint) / 560); //Y方向缩放倍数 var tmpxs = (int)(Convert.ToDouble(_mBatchWidth) / 800); //X方向缩放倍数 if (_batchCallBackPoint < 560) { tmpys = 1; } if (_mBatchWidth < 800) { tmpxs = 1; } _bCall = false; _bStop = false; BatchDataRollShow(_heightData, HeightRange, -HeightRange, 255, _mBatchWidth, _batchCallBackPoint, tmpxs, tmpys); //显示高度数据 } if (Convert.ToBoolean(notify & 0x80000000)) { System.Console.Write(@"批处理重新开始!\n"); _mCurBatchNo = 0; } if (Convert.ToBoolean(notify & 0x04)) { System.Console.Write(@"新批处理!\n"); } }