If you’re doing this inside a Paint event then you will be clearing the “old” data points with your fillrect every paint.
Try moving the drawing outside the paint, draw on a picture instead then use DrawPicture inside the paint to actually put the image on the canvas.
You then have the ability to add points to the picture when you want (as you get data on from serial port) and just call invalidate, refresh or refrectrect (on the portion of the image you want to update) to show the change.
Here’s a really simple example I wrote for someone a while back