When I designed this application I wanted things to be robust and as simple as possible especially from the Stamp code point of view The VB contains 2 forms Form 2 has 3 button controls (open port - close port and done) a listbox and 3 radio buttons (4800 - 9600 - 19200) Form 1 has 6 buttons (Switch1 - Switch2 - Switch3 - Switch4 - Stop - Serial Port) a trackbar a serialport and a label Stamp: The Stamp is in control and requests data from the VB switches by sending the string "SW". The data is returned immediately as a byte. Each BIT of the byte represents one switch state, 1=on and 0=off. Doing it this way all the switches can be polled in one serial operation. The same routine is used for each Axis input but this time the SEROUT command is "A1". The data is returned immediately as a word translated directly to a valid value for the PULSOUT statement. Each subroutine has a short pause to allow the serial line to settle. If only the call to the switches is being used and not the Axis the pause can be eliminated and visa versa. Visual Basic: Buttons 1 through 4 toggle a BOOLEAN variable to indicate switch state. The heart of the code lays in the serialport1.DataRecieved routine. The switch variables and the trackbar value(s) are held here until the Stamp requests data. The select case routine looks for a header ( "SW" or "A1") and transmits the corresponding value. After each case statement there is a do while loop to "catch" and remove the echo. Also within this routine each bit of the switch byte is set or reset depending on switch states. In this program you could code as many switches and axis controllers as you wanted just by repeating button and trackbar controls, the Stamp would only call the ones needed by using it's header ("A1" "A2" "A3"....etc). I did not code the ramp function, my intention was to focus on the simplicity of switch and axis control