After many years of trying half-heartedly to get my HP 7475A plotter working under a modern linux kernel, I finally suceeded. Mostly, it involves getting the stty settings correct. I know this is a lame excuse, but I had the devil of a time understanding the typos and other mistakes in a script I found that allows you to test your plotter using a shell script. After correcting the script, lo and behold, the plotter sprang to life and wrote a bunch of garbage. I had to adjust it some more and the final script doesn't really vary much from the original. Most of the adjustments had to do with timing, and making sure the plotter's buffer wasn't over-run. The script is simple enough, so I'll post it here and make comments about it. #!/bin/sh stty 9600 -parenb -parodd cs8 crtscts -cstopb /dev/ttyS0 echo "SP1;^O" >/dev/ttyS0 echo "PA 0,0;^O" >/dev/ttyS0 sleep 5 echo "PA 20000,20000;^O" >/dev/ttyS0 for i in 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000; do for j in 0 2000 4000 6000 8000 10000 12000 14000 16000 18000 20000; do echo "PU;^O" >/dev/ttyS0 echo "PA $i,0;^O" >/dev/ttyS0 echo "PD;^O" >/dev/ttyS0 echo "PA $j,20000;^O" >/dev/ttyS0 done sleep 20 done The stty command is half of what's important. The line from the original script looked like: stty 9600 -parenb -parodd cs8 -crtscst -ostopb 0) { syswrite STDOUT, "Wrote $wrote bytes.\n"; } while ( $linein = ) { chomp $linein; @hp_cmd = split ( ";", $linein ) ; while ( $plt_cmd = (shift (@hp_cmd ) ) ) { $plt_out = "$plt_cmd;\r\n"; syswrite PLOT_DEV, $plt_out; syswrite PLOT_DEV, $esc_e; sysread PLOT_DEV, $esc_e_res, 10; } } } First a note. The ESCapes are escape characters and not the letters E, S and C in the $esc_at and $esc_e variables. If you look at the Programming Manual, it shows these as the necessary escape sequences to use for hardware handshakes. I forget exactly what "ESC.@;17:" sets, but 17 is a bit-mask for specific options. I know that one of those options is to set block mode. This is where you can send a block of data to the plotter and the plotter will accept the block or reject it with an error code. This is better than sending a stream of data, then finding out that the buffer overflowed at some point and you don't really know what data you need to resend or that you've sent an incomplete hpgl command. ESC.E: is used to return any error codes (buffer overflow for one) to determine what kind of corrective action needs to be taken. Basically, the most common use is to determine if the the last block of commands needs to be resent. The really nice thing about this is you don't have to do any buffer housekeeping as you would with software handshakes. One option I never played with is to set the block size. The buffer on the HP7475A is a whopping 1024 bytes and the default block size is 80 bytes. You can assign up to the whole 1024 bytes to the block, but the recommendation is to max out at 512 bytes. I guess if you wanted to be ultra-efficient you could make sure that you could fill up the block with a whole 80 bytes (or whatever size) every time, but in all reality, this plotter is so slow, you could probably program this using qbasic running under an interpreter on a Mac or something like that. One last interesting point. The Programming Manual states that the error light should never go on when plotting. When I plot something with my script, it flashes regularly, but I have yet to lose any commands, so make of that what you will. I welcome any improvements to my scripts or any comments about my analysis.