TDSScreenCap – An RS232/GPIB screen capture program for the Tektronix TDS3000 series

I whipped up this little utility a while back as a quick and easy way to get screen captures from the TDS3000 series’s serial port.

New 2022 version. Pretty much the same as the old. No timeout setting anymore. It wasn’t necessary.

2022 Overhaul

There is now a new version of this tool which includes GPIB support. For RS-232 it can read the image a few seconds faster than the previous version. NI-VISA installation and supported hardware is required if using GPIB. It’ll still work for RS-232 only without NI-VISA.

Choice of serial cable

Note that if you are building your own Null-Modem serial cable to connect to the scope, please connect all signals as per standard Null Modem cable wiring. This program requires hardware flow control. It is not sufficient to connect only the RX and TX lines.


27 thoughts on “TDSScreenCap – An RS232/GPIB screen capture program for the Tektronix TDS3000 series

  1. I’ve tried this utility for my TDS340A. Serial dialog works but at the end of receiving PC stops with “no valid image received”. What’s wrong?

    1. The problem is that is written for the TDS3000 series.

      Assuming the TDS300 even supports screen grabs, I do not have one to experiment with.

  2. Thanks very much, works really well. Others note that you have to set the System I/O values to RS232, 38400 Baud, Flagging – None, EOL – LF for this to work.

    You can use Alt Print Screen to capture the whole window into the Clip Board, or use something like Snaggit or 5 clicks to copy just the TDS Screen part.

    Pleased 🙂

  3. Hi, I have a TDS3014 scope which has a floppy drive (pretty much useless these days), but it also has a parallel port at the back for connecting to a printer. If I obtain a parallel to serial converter and cable, would I be able to use your screen capture utility? Are there any other things I need to know. Thanks! Mark

    1. No chance of that working sorry. Getting it to work over parallel would require emulating an entire printer – a feat of engineering.

    2. A late reply, but in the event someone else stumbles over this looking for a solution:

      I have just tested such a setup with my TDS220 oscilloscope. … and …
      It works fine using the [Wait for print button press] feature of the TDS-ScreenCap
      program and the [HARDCOPY] button on the scope.

      I’ve recently build myself a Parallel-to-USB/VCP (Virtual-COM-Port) converter using
      an Arduino Nano wired up to a DB-25 connector. I use this in conjuction with a Python script on the PC.
      To work with the TDS-ScreenCap software, I had to modify the Arduino and connect RTS with CTS on the USB-UART bridge IC to satisfy/emulate the hardware-handshake required by the TDS-ScreenCap software. (for a CH340C/G on nano-clones: pins 9 and 14).
      (Note: This should work on any standard Arduino-Nano / Arduino-Nano clone using a dedicated USB-UART bridge chip [FT232RL, CH340, CP2104, …].
      It most probably does not work for boards with a second AVR chip as USB-UART bridge such as the Arduino Nano-EVERY [as RTS and CTS are not accessible on any pins].)

      The Arduino Baudrate setting needs to match that of the TDS-ScreenCap software (38400).
      The transfer time of a BMP screenshot is about 10 s and the software needs another 4 s until the screenshot is displayed. (perhaps conversion from BMP to PNG)

      The Adapter is connected to the TDS220/TDS2MM centronics port and the Arduino USB-port to the PC. [Capture] does not work as the scope can not be controlled over the parallel port.

      For building a parallel-to-USB/VCP adapter this way, I recommend to start with the code
      linked in the thread below and possibly removing everything related to serialEvent:

      (This is based on the code here:
      and somewhat more optiomized.)

      1. Hang on, so you’re using my software via a parallel to to serial conversion solution? That sounds a bit crazy. The 4s delay is because the TDS3000 series does not send a termination sequence, so a timeout is used.

        You can always make modifications to it if needed. It’s built with Visual Studio 2017 IIRC, or I could modify it.

        Anyway, very interesting sounding project. I wonder if I could use it on the parallel port of a TDS3000 and get it up and running here?!

        1. Hi Matt,
          yeah – sounds a bit weird, but waiting 40 seconds for a screenshot of my TDS220 (@9600 baud) was really nerve-stretching.

          Thus the idea of using the parallel port present on the TDS2MM extension module.

          After some optimization of the Arduino code, I ended up at 8 seconds transfer time. That’s the absolut best case transfer for my TDS220/TDS2MM.
          To put this in context here are some figures for compatrison:
          32 s via RS232 at 19200 baud (loosing ability to start a Capture from the PC)
          16 s via GPIB (ProLogix USB-to-GPIB adapter)
          10 s via Centronics-to-USB/VCP converter (*1) set to 38400 baud
          8 s via Centronics-to-USB/VCP converter (*1) set to 57600 baud or higher

          (*1) Arduino Nano based DIY converter
          Note, except for the 40 s at 9600 baud, all these times are limited by TDS220/TDS2MM internal processing, not by limitations of the communication channel.

          I expect significantly better times (average transfer rates) for newer scope models (with faster microcontrollers).

          Thanks for the info regarding the tools suite. I was wondering about this already. This would be my first excurse into C#, .NET VS – so it will take some lead time for me to get going. But it’s perhaps time to do so.

          And YES, if you had such a Centronics-to-USB/VCP converter at hand (configured to 38400 baud and RTS-CTS connected) it would work right away with any device spitting out BMP files (or whatever else your software can deal with).

          If you’re interested just drop me an email. I can mail you some pictures and my now strongly optimized Arduino code.

          BR, Joe

          Thanks for the hint to the 4s timeout. I’ve ovelooked that and set it to 50 ms. The screenshot is now instantly displayed and the overall time from pressing the [HARDCOPY] button is now less than 10 s. (exe patched to 115200 baud)

          1. Really interesting project. I wouldn’t mind doing this as a custom PCB which fits into a DB-25 backshell. Maybe I’ll pick this up and support it officially in the near future. I have some other instruments I’d like try this on too…

            You won’t have any trouble modifying the UI assuming you can get the dev env installed, there’s barely even 30 lines of code to the whole thing.

  4. I really like it. These additions would make it great:
    1. A button to stop triggering.
    2. A button to start triggering.

    That way I could work remote to it, stop the scope, capture the screen image, and then restart trigger.

    Thanks all the same for a good little app.

    1. Interesting idea. I will look into it at some point… If you can tell me the serial commands that would make it a lot easier.

  5. Thanks a lot for sharing this. I tried to get this job done using NI VISA drivers and a Perl interface, but it always hanged after receiving a few bytes.

    Would you be willing to share the code you are using to retrieve the hard copy?

    In turn I would answer your question about which serial commands are required to start and stop triggering:

    “ACQUIRE:STATE RUN” starts

    the triggering (or acquisition).

  6. Hi, that is exactly what I have been looking for: Avoiding to save screenshots to floppy disc.
    But I have problems with the program under win10 (tested on two different PCs). The program starts and opens the window, but after I have clicked on “Capture” or “Wait for print button press” the program freezes. I even cannot close the program except by using the Task-Manager. The serial transmision from my TDS3014 to a standard terminal program works well.

    Can you give me some hints how to solve that problem? Unfortunately I don’t have experience with C# and compilation of the mentioned github files. Perhaps you can update the exe file and I can try to test this version?

    Thanks, Ralf

    1. I’ve not had anyone else report this behaviour, certainly haven’t seen it myself on Win 10.

      I think it’s going to be something specific to your computer or serial interface hardware and its compatibility with the .NET Serial interface. My guess is that hardware flow control (required by this application) isn’t working. The lock-up is because it’s trying to write data to the serial port, but the hardware or driver is blocking it. Beyond that I wouldn’t be able to help sorry.

      1. Thanks for your feedback! I’ve just made an other test with my win7 netbook and USBtoSerial adapter: Same behaviour. Print for example to “CoolTerm” with 38400, 8N1 and SW flow control is working. Do I need a special cable? I just have connected RxD, TxD and GND. Also if the TDS is not connected to the cable I cannot abort after I have clicked on “Capture” or “Wait for print button press”. Is that normal behaviour? Ralf

          1. Problem solved, I have just modified my cable with RTS/CTS connected and program is running! Thank you very much again, very good work and just the only program found with this great functionality and easy usability!

  7. TDS3000 Screen Capture

    I have been controlling and getting data from my TDS3000 series scopes for many years via GPIB/USB VISA-COM interface software that I have written. I can set the scopes up, acquire all kinds of data, etc. One thing in my programs I have never been able to figure out how to do is create a PNG, or BMP file on my local drive from the scope’s screen shot.

    I know how to set it up to send the screen show and all, I just do not know how to capture the data and save it. Do you have VISA-COMM (Globl.MGR) experience that you would be willing to share? Hell I would pay for example code that actually works. I am still using easy VB6 – lol.

    I have numerous VB6 and VBA programs that I would love to add that capability to. I know I can use (and do use) Openchoice Desktop and it works perfect with my TDS3000 and MSO4104 scopes, but it would be cool if my programs could do the same thing, giving each one a unique name and know where they are to include in Access Reports (hence the VBA that I use a lot to control instruments and get data with).

    For data structures to read all the data from a hardcopy start request, I do not have, or have an API for. There is not a lot of good documentation on GLOBMGR.DLL. I know all the basics of using it, but for instance, it doesn’t have a readraw data function. As I said getting the scope to shoot the data to me over GPIB is easy. Intercepting that data, I do not have experience with.

    I would appreciate any help that you can, or are willing to provide.

Leave a Reply

Your email address will not be published. Required fields are marked *