Sampling from serial port with different frequency than refresh rate

Hello,

I am trying to read from a force sensor (in a grasp task) while I am showing the participant in real time how much they are pressing the force sensor. I will also have EEG neural recording so it is important for me to be able to record the readings from the force sensor with the highest frequency possible.

When I am using a “While” for 5 seconds (the trial duration), if there is no win.flip(), I can record from the sensor around 20000 samples during the 5 seconds trial. However, if I have win.flip() within the while (which I need to have for the experiment) then the number of samples becomes 300 samples (60 (refresh rate) * 5 (seconds)). Is there a way to record from the sensor with the highest frequency within the while loop?

t_start = time.time()
t_end = t_start + 5
while time.time() <= t_end:
    # show the blank screen
    keepPush_msg.draw()
    win.flip()
    # save time stamp of force
    force_timeStamp.append(time.time())
    # recording the force
    data = ser.readline()
    force_valueExp.append(data)

When you create the window, is waitBlanking set to True? If so try running with it as False.

The other option if that doesn’t work is to use multi-threading, querying the serial port in a different thread so it isn’t tied to the flip call returning.

Hey Todd! Thanks for your reply! I tried setting waitBlanking set to False, but it did not help. I have started working on multi-threading, since I have never done multi-threading I was reading some tutorials on it. I have made a class for reading the force sensor as:

class ForceRead:
    def __init__(self):
        self.data = np.array([])  # to store the data of the measurement
        self.timeStamp = np.array([])  # to store the timeStamp of the measurement

    def make_measurement(self, start, stop):
        while start <= stop:
            self.timeStamp = np.append(self.timeStamp, time.time())
            tmp_data = ser.readline()
            try:
                tmp_data = float(tmp_data.strip())
            except ValueError:
                tmp_data = np.nan
            self.data = np.append(self.data, tmp_data)
        return self.data, self.timeStamp

The problems I have right now are: 1) It seems this approach slows down the sampling the force sensor a lot, maybe because of appending the numpy array? 2) While I am recording the force sensor in the thread, I need to have another while loop reading the real time of values of sensor during the screen refresh and flip it on the screen. This is the part I am not quite sure how to write the second while. Currently, I have something like this for the flip on the screen

            # find the time that starts the max pressure
            t_start = time.time()
            t_end = t_start + 5
            t = threading.Thread(target=force.make_measurement, args=(t_start, t_end))
            t.start()
            while time.time() <= t_end:
                # show the keep pushing screen
                keepPush_msg.draw()
                win.flip()
                # print the values of force sensor
                # ?