03-31-2009 02:16 PM
Hi Jonathan,
I have the similar situation . I want to read sample from the buffer every 1 millisecond. the frequency is 1KHz. I've used the code you mentioned above. And it works except for one problem: I've canceled all calculation part, only reading code left in the callback function.
Private Sub AnalogInCallback(ByVal ar As IAsyncResult)
data = analogInReader.EndReadMultiSample(ar)
myTask.Stream.ReadOverwriteMode = ReadOverwriteMode.OverwriteUnreadSamples
Dim freshSamples As Integer = myTask.Stream.TotalSamplesAcquiredPerChannel - myTask.Stream.CurrentReadPosition
If freshSamples < myTask.Stream.AvailableSamplesPerChannel Then
myTask.Stream.ReadRelativeTo = ReadRelativeTo.CurrentReadPosition
myTask.Stream.ReadOffset = 0
Else
myTask.Stream.ReadRelativeTo = ReadRelativeTo.MostRecentSample
myTask.Stream.ReadOffset = -myTask.Stream.AvailableSamplesPerChannel
End If
Loop
analogInReader.BeginReadMultiSample(Convert.ToInt32(samplesPerChannelNumeric.Value), analogCallback, myTask) ' call itself again
End sub
However even so, the callback function's execution lasts about 5~10 milliseconds which I think is unnormal. And this appearently cannot meet my request. How to reduce the execution interval of the callback function? Any suggestion is appeaciated. Thanks for attention!
Jeff Zhang
03-31-2009 02:20 PM
Hi Jonathan,
I think there is a problem in the sub program I poste. Here is the right one:
Private Sub AnalogInCallback(ByVal ar As IAsyncResult)
data = analogInReader.EndReadMultiSample(ar)
myTask.Stream.ReadOverwriteMode = ReadOverwriteMode.OverwriteUnreadSamples
Dim freshSamples As Integer =
myTask.Stream.TotalSamplesAcquiredPerChannel -
myTask.Stream.CurrentReadPosition
If freshSamples < myTask.Stream.AvailableSamplesPerChannel Then
myTask.Stream.ReadRelativeTo = ReadRelativeTo.CurrentReadPosition
myTask.Stream.ReadOffset = 0
Else
myTask.Stream.ReadRelativeTo = ReadRelativeTo.MostRecentSample
myTask.Stream.ReadOffset = -myTask.Stream.AvailableSamplesPerChannel
End If
analogInReader.BeginReadMultiSample(Convert.ToInt32(samplesPerChannelNumeric.Value),
analogCallback, myTask) ' call itself again
End sub
Thanks!
Jeff Zhang