Support »
Sample C# Program for Communicating with the TReX and TReX Jr
The following program, written using Visual C# 2008, provides a simple example of how you can send and receive data from the TReX or TReX Jr using Microsoft’s visual C# and your computer’s serial port. It sends the TReX a “get signature” command when the Get Signature button is pressed and displays the response from the TReX in the text box.
The sendCommandPacket method is a simplified version of the one used by the TReX Configurator utility (297k zip).
You can download the project files here: trex.zip (60k zip). Don’t forget to configure the serialPort1 object’s portName property for the COM port to which your TReX or TReX Jr is connected.
![]() |
Sample C# TReX program: configuring the SerialPort object. |
|---|
using System;
using System.Windows.Forms;
namespace TReX
{
public partial class Form1 : Form
{
int deviceNum = 7; // default device number for the TReX and TReX Jr
bool serialEcho; // does the TReX echo everything you transmit? (true for RS-232)
byte[] buffer; // array to hold our command packets and received data
public Form1()
{
InitializeComponent();
buffer = new byte[32];
}
private bool sendCommandPacket(byte[] packet, int sendBytes, int readBytes, ref string str)
{
/* This function transmits the specified command packet and then waits to receive
* the specified number of bytes in response. Bytes to transmit are provided via the
* 'packet' array, and received bytes are stored in the 'packet' array.
* It blocks execution until the desired number of bytes have been received from the
* the TReX or until the serial read times out (150 ms).
* packet - an array of bytes to transmit to the TReX; when the function is through,
* this array will contain any bytes received from the TReX, so the size of
* this array must be greater than or equal to Max(sendBytes, readBytes)
* sendBytes - the number of bytes in the command packet
* readBytes - the number of bytes to try to receive from the TReX in response
* str - a string that contains information about what was sent and received;
* used for debugging/feedback purposes
*/
int i;
str = "";
try
{
// if there are any unread bytes in the read buffer, they are junk
// read them now so the buffer is clear to receive anything the TReX
// might send back in response to the command
while (serialPort1.BytesToRead > 0)
serialPort1.ReadByte();
str += " TX={ ";
if (expandedProtocolCheckBox.Checked)
{
for (i = sendBytes - 1; i >= 0; i--)
packet[i + 2] = packet[i];
packet[0] = 0x80;
packet[1] = (byte)deviceNum;
packet[2] -= 0x80; // clear MSB of command byte
sendBytes += 2;
}
for (i = 0; i < sendBytes; i++)
str += packet[i].ToString("X2") + " ";
serialPort1.Write(packet, 0, sendBytes);
if (serialEcho)
{
str += "}; Echo={ ";
for (i = 0; i < sendBytes; i++)
str += serialPort1.ReadByte().ToString("X2") + " ";
}
str += "}; RX={ ";
for (i = 0; i < readBytes; i++)
{
packet[i] = (byte)serialPort1.ReadByte();
str += packet[i].ToString("X2") + " ";
}
str += "}";
}
catch (Exception)
{
str += " *TIMEOUT*";
return false;
}
return true;
}
private void signatureButton_Click(object sender, EventArgs e)
{
try
{
logTextBox.Text = "";
serialPort1.Open();
buffer[0] = 0xFF;
serialPort1.Write(buffer, 0, 1); // send the null command
try
{
int data = serialPort1.ReadByte(); // look for an echo
if (data == 255)
serialEcho = true; // we get here if we are using RS-232
}
catch (TimeoutException)
{
serialEcho = false; // we get here if we are using TTL serial
}
// read the device signature
string str = "";
buffer[0] = 0x81;
if (!(sendCommandPacket(buffer, 1, 7, ref str)))
logTextBox.Text += "failure\r\n" + str;
else
{
logTextBox.Text += "" + str + "\r\n";
for (int i = 0; i < 7; i++)
logTextBox.Text += (char)buffer[i];
}
}
catch (Exception)
{
logTextBox.Text += "Exception!";
}
if (serialPort1.IsOpen)
serialPort1.Close();
}
}
}





