Working With COM Ports From Scripts

Applies to TestComplete 14.10, last modified on June 5, 2019

TestComplete does not include special features for sending data to or receiving them from COM ports. One possible solution is to call the Windows Script Host to create an object associated with the desired port and then work with the port using methods and properties of this object:

JavaScript

function TestCOMPort()
{
  let ForWriting = 2;
  let TriStateFalse = 0;

  let fso = getActiveXObject("Scripting.FileSystemObject");
  let f = fso.OpenTextFile("COM1:", ForWriting, false, TriStateFalse);
  // Write data to the port
  f.Write("A");
  f.Write(" ");
  f.Write("\x1B");
  f.Close();
}

JScript

function TestCOMPort()
{
  var ForWriting = 2;
  var TriStateFalse = 0;

  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var f = fso.OpenTextFile("COM1:", ForWriting, false, TriStateFalse);
  // Write data to the port
  f.Write("A");
  f.Write(" ");
  f.Write("\x1B");
  f.Close();
}

Python

def TestCOMPort():
  ForWriting = 2;
  TriStateFalse = 0;
  
  fso = Sys.OleObject['Scripting.FileSystemObject']
  f = fso.OpenTextFile("COM1:", ForWriting, False, TriStateFalse)
  # Write data to the port
  f.Write("A")
  f.Write(" ")
  f.Write("\x1B")
  f.Close()

VBScript

Sub TestCOMPort
  Const ForWriting = 2, TriStateFalse = 0
  Dim fso, f

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile("COM1:", ForWriting, False, TriStateFalse)
  ' Write data to the port
  f.Write Chr(26)
  f.Write Chr(32)
  f.Write Chr(27)
  f.Close
End Sub

DelphiScript

procedure TestCOMPort;
var
  fso, f, ForWriting, TriStateFalse : OleVariant;
begin
  ForWriting := 2;
  TriStateFalse := 0;

  fso := Sys.OleObject['Scripting.FileSystemObject'];
  f := fso.OpenTextFile('COM1:', ForWriting, false, TriStateFalse);
  // Write data to the port
  f.Write(26);
  f.Write(' ');
  f.Write(Chr(27));
  f.Close();
end;

C++Script, C#Script

function TestCOMPort()
{
  var ForWriting = 2;
  var TriStateFalse = 0;

  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var f = fso["OpenTextFile"]("COM1:", ForWriting, false, TriStateFalse);
  // Write data to the port
  f["Write"]("A");
  f["Write"](" ");
  f["Write"]("\x1B");
  f["Close"]();
}

If you have Microsoft .NET Framework 2.0 installed, you can try another solution: the Framework includes the namespace System.IO.Ports that contains classes for controlling COM ports. You can access this namespace in scripts through the dotNET object. The following code snippet demonstrates how you can send data to and read them from COM port using this object.

The System.IO.Ports namespace is included in the system.dll assembly. This assembly is registered in the Global Assembly Cache (GAC). In order to use the namespace in scripts, register this assembly in the CLR Bridge Options page of the Project Properties editor:
  • Right-click your project’s node in the Project Explorer and select Edit | Properties from the context menu. This will open the project editor in the Workspace panel and bring up the Properties page of the editor.
  • Select CLR Bridge from the left of the page. This will open the CLR Bridge Options page.
  • Press Browse GAC, choose the system assembly in the ensuing Select Assemblies dialog and press OK to close the dialog.
  • Choose File | Save from the TestComplete main menu to save the changes made to the project properties.
See also Calling Functions From .NET Assemblies.

JavaScript, JScript

function Test()
{
  var Port, s;

  Port = dotNET.System_IO_Ports.SerialPort.zctor_4("COM1", 9600);
  Port.Open();

  // Writing data to the port
  Port.Write("A " + String.fromCharCode(27));
  // Waiting for response
  aqUtils.Delay(1000);
  // Processing response
  if (Port.BytesToRead != 0)
  {
    s = Port.ReadExisting;
    Log.Message(s);
  }
  else
    Log.Warning("No data");

  Port.Close();
}

Python

def Test():
  Port = dotNET.System_IO_Ports.SerialPort.zctor_4("COM1", 9600)
  Port.Open()

  # Writing data to the port
  Port.Write("A " + chr(27))
  # Waiting for response
  aqUtils.Delay(1000)
  # Processing response
  if Port.BytesToRead != 0:
    s = Port.ReadExisting()
    Log.Message(s)
  else:
    Log.Warning("No data")

  Port.Close()

VBScript

Sub Test
  Dim Port, i, s

  Set Port = dotNET.System_IO_Ports.SerialPort.zctor_4("COM1", 9600)
  Port.Open

  ' Writing data to the port
  Port.Write "A " & Chr(27)
  ' Waiting for response
  aqUtils.Delay 1000
  ' Processing response
  If Port.BytesToRead <> 0 Then
    s = Port.ReadExisting
    Log.Message s
  Else
    Log.Warning "No data"
  End If

  Port.Close
End Sub

DelphiScript

procedure Test;
var
  Port, s;
begin
  Port := dotNET.System_IO_Ports.SerialPort.zctor_4('COM1', 9600);
 
  Port.Open;

  // Writing data to the port
  Port.Write('A ' + Chr(27));
   // Waiting for response
  aqUtils.Delay(1000);
  // Processing response
  if Port.BytesToRead <> 0 then
  begin
    s := Port.ReadExisting;
    Log.Message(s);
  end
  else
    Log.Warning('No data');

  Port.Close();
end;

C++Script, C#Script

function Test()
{
  var Port, s;

  Port = dotNET["System_IO_Ports"]["SerialPort"]["zctor_4"]("COM1", 9600);
  Port["Open"]();

  // Writing data to the port
  Port["Write"]("A " + String["fromCharCode"](27));
  // Waiting for response
  aqUtils["Delay"](1000);
  // Processing response
  if (Port["BytesToRead"] != 0)
  {
    s = Port["ReadExisting"];
    Log["Message"](s);
  }
  else
    Log["Warning"]("No data");

  Port["Close"]();
}

See Also

Calling Functions From .NET Assemblies

Highlight search results