---
name: "nqc"
section: "1"
platform: "linux"
package: "nqc"
version: "3.1.r6-13"
release: "Debian 13 (Trixie)"
platforms: ["linux"]
url: "https://new.carta.tech/nqc"
---

# nqc(1)

A simple C-like language for Lego's RCX programmable brick

## NAME

nqc - A simple C-like language for Lego's RCX programmable brick

## SYNOPSIS

**nqc** \[ *options* \] \[ *actions* \] \[ **-** \| *filename* \] \[ *actions* \]

## DESCRIPTION

NQC stands for Not Quite C, and is a simple language for programming the LEGO RCX.  The preprocessor and control structures of NQC are very similar to C.  NQC is not a general purpose language -- there are many restrictions that stem from limitations of the standard RCX firmware. This man page does not attempt to describe the NQC programming language or the RCX API, merely the options of the nqc command-line program.  References to more complete documentation are given at the end of this man page.

nqc is normally used to process a single source file given as *filename*.  You can also read from stdin by using **-** instead.  If the filename ends in *.rcx*, it is assumed to be a RCX image file from a previous compile, and will be used as is (for downloading or listing).

## OPTIONS

**-1** use NQC 1.x compatibility mode.  The RCX API changed significantly with version 2.0.  This flag makes the compiler grok old code. **-T***target* **generate code and use communications methods for "smart** **bricks" other than the RCX.  Currently, can be either CM** or **Scout**.   **-d** download program to the RCX.  When this option is given, code is sent directly over the serial port to the brick and no output file is generated by default. **-n** prevent the standard *nqc.h* file from being automatically included. **-D***sym*\[=*value*\] define macro *sym* as *value*. **-E**\[*filename*\] write compiler errors to *filename* (or to stdout, if no name specified) instead of to stderr. **-I***path* search *path* for include files.  Multiple directories should be separated as normal for the platform (under Linux / Unix, that'd be "").  Can also be set with the NQC\_INCLUDE environment variable. **-L**\[*filename*\] generate a human-readable bytecode listing to *filename* (or to stdout) instead of generating a binary file. **-O***outfile* output code to *outfile*.  This option causes a file to be written even if **-d** or **-L** is also given.  If no filename is specified, the output file will have the same basename as the input file but an extension of *.rcx* instead of *.nqc*. **-S***portname* use serial port *portname*.  Under Linux, */dev/rcx* is the default.  (This will differ on other platforms.)  The port can also be specified via the RCX\_PORT environment variable, but the command line option takes precedence. **-U***sym* undefine macro *sym*. ACTIONS  Actions look similar to options, but they have some subtle differences.  In general, options set up things (such as a serial port) for later use, while actions cause something to happen.  Actions are executed in the order that they appear on the command line.  In addition, actions appearing before the source file happen before compilation, while actions after the source file happen after compilation.  For historical reasons, downloading the compiled file (**-d**) works as an option and not an action. **-run** run the current program.  This causes the program selected on the RCX to execute. **-pgm** *number* select program number.  This changes the program slot on the RCX. **-datalog** get the datalog from the RCX and print it to stdout. **-datalog-full** same as **-datalog** but with more verbose output. **-near** set the IR port to short-range mode. **-far** set the IR port to long-range mode. **-watch** *time* set the RCX's clock to the specified time.  If you use **now**, then the host's current time is used.

- **-firmware** *filename*

  downloads the firmware to the RCX.  You'll need the official Lego RCX
   firmware from the CD-ROM -- the current (and so far only) file is called
   *firm0309.lgo*.  This will probably be necessary the first time you use
   your RCX, and whenever it's been without batteries for more than a few
   minutes.
   **-firmfast** *filename*
   same as **-firmware**, but at quad speed.  Requires the tower to be in
   near mode (see **-near**).   If you have trouble getting the fast
   download to work, please revert to the older (and slower) method.

- **-sleep** *timeout*

  set RCX auto-shutoff timeout, in minutes.

- **-msg** *number*

  send IR message to RCX. The brick will respond to this just as it would a
   communication from another RCX.
   **-raw** *data*
   send an arbitrary packet to the RCX and print the reply (if any) to stdout.
   The data should be a hexadecimal string, with no spaces, zero-padded so that
   it is an even number of characters (although it may be an odd number of
   bytes). For example, to read the contents of variable 1, you could use
   **-raw 120001**. The bytecodes for raw messages can be found on web sites
   that document the RCX protocol.
   **-remote** *value* *repeat*
   send a repeating remote command to the RCX.
   **-clear**
   erase all programs and datalog from the RCX.

## ENVIRONMENT VARIABLES

- RCX\_PORT

  sets the default serial port.  See the **-S** option.
   NQC\_OPTIONS
   specifies extra options to be inserted into the command line.  For example,
   setting NQC\_OPTIONS to **-TScout** would cause nqc to target the Scout
   by default.
   NQC\_INCLUDE
   specifies additional paths to search for include files.  See also the
   **-I** option.

## EXAMPLES

To compile *foo.nqc*, download the bytecode to program slot three, and make the RCX start executing it immediately: To just compile *bar.nqc*, resulting in *bar.rcx*: To download *bar.rcx* to the RCX: To set the IR tower to short-range mode and download the firmware at high speed: To compile */usr/share/doc/nqc/examples/test.nqc* and print the resulting bytecode listing to the screen in human-readable format: (This should result in the following output under nqc 2.1.0: )

## FILES

Older versions of nqc required a separate *rcx.nqh* or *rcx2.nqh* file.  This is now integrated into the binary and no longer necessary, but for reference, *rcx2.nqh* is included with the package.  (If you installed the RPM, try */usr/share/doc/nqc-2.1.0/rcx2.nqh*).

## SEE ALSO

*https://bricxcc.sourceforge.net/nqc/* The main Not Quite C web site.  You'll definitely want to look here.  Notably, you'll find the *NQC Programmer's Guide*, which covers the NQC language itself. *https://web.archive.org/web/20240620153414/http://www.crynwr.com/lego-robotics/* A great site for alternative RCX / Mindstorms development. *https://www.mralligator.com/rcx/* Details on the internals of the RCX and the RCX protocol.

- *https://www.lugnet.com/robotics/rcx/nqc/*

  Discussion group for NQC.  Also available via NNTP at *lugnet.com*.

## BUGS

None known.  But be aware that Scout support is still preliminary and may change significantly.

## COPYRIGHT

nqc is Copyright (C) 1998-2000 David Baum and released under the terms of the Mozilla Public License.  See the documentation included with the program for more details.

## AUTHOR

The Not Quite C programming language and the nqc program were written and are maintained by Dave Baum.  Various contributions have been made by other people -- a full list of these can be found on Dave's web site. This man page was written by Matthew Miller (mattdm@mattdm.org), with extremely large amounts of borrowing from other NQC documentation.
