Measurement Studio for .NET Languages

cancel
Showing results for 
Search instead for 
Did you mean: 

problems with asynchronous acquisition and NI-DAQmx

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

0 Kudos
Message 11 of 12
(1,727 Views)

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

0 Kudos
Message 12 of 12
(1,722 Views)