Hayes AT command set
The Hayes AT command set, also known as the Hayes command set, is a command language originally developed in 1981 by Dale Heatherington and Dennis C. Hayes for the Hayes Smartmodem, the first widely adopted programmable modem for personal computers operating at 300 bits per second.[1][2] This set revolutionized modem control by allowing users to configure and operate devices remotely over a serial RS-232 interface using simple ASCII-based instructions, replacing manual switches and lights with software commands.[3] At its core, the AT command set functions through a prefix "AT" (standing for "ATtention"), which signals the modem to interpret the following alphanumeric instructions, such as ATD for dialing a number or ATA for answering a call, all terminated by a carriage return.[4][5] The modem operates in two primary states: command mode for issuing control instructions and online data mode for transmitting user data, with transitions between modes facilitated by an escape sequence of three plus signs ("+++") preceded and followed by one-second pauses to avoid false triggers during data flow.[5] Configuration is further managed via S-registers, numeric storage locations that hold settings like ring count thresholds or guard times, accessible through commands like ATS0=2 to auto-answer after two rings.[4] Although initially proprietary to Hayes Microcomputer Products, the AT command set quickly became a de facto industry standard due to its simplicity and effectiveness, adopted by virtually all modem manufacturers by the mid-1980s and influencing subsequent technologies including fax machines, GSM cellular modules, and modern IoT devices.[6][7] Later extensions, such as those in ITU-T Recommendation V.250, formalized subsets for broader interoperability while preserving the original Hayes syntax.[8] Its enduring legacy lies in enabling the dial-up era of computing, powering bulletin board systems, early internet access, and the foundational connectivity that paved the way for today's networked world.[3]History and Development
Origins in Early Modem Technology
In the late 1960s and early 1970s, modem technology evolved from acoustic couplers, which required users to manually dial a telephone and place the handset into rubber cups on the device to transmit data over phone lines, to direct-connect modems that plugged straight into telephone jacks for more reliable and convenient operation.[9] Acoustic couplers, developed around 1966 by institutions like Stanford Research Institute, were limited by their dependence on sound transmission, which was susceptible to background noise and required physical handling of the phone, but they enabled early computer-to-computer connections at speeds up to 300 bits per second.[10] By the mid-1970s, direct-connect models began to dominate as FCC regulations in 1976 allowed non-AT&T devices to connect directly to phone lines, reducing the need for couplers and improving signal quality for personal and small business use.[11] Early modems like the Novation CAT, an acoustic coupler released in the late 1970s compatible with the Bell 103 standard at 300 baud, and the Anderson Jacobson AJ880, a direct-connect model from the same era, relied on proprietary control methods that hindered widespread adoption.[11] These devices often required custom software written specifically for each model or manual intervention via front-panel switches to configure settings such as baud rate, dialing, or mode switching, making them incompatible across brands and burdensome for users without technical expertise.[12] Such limitations meant that integrating modems with emerging personal computers demanded bespoke programming efforts, often locking users into vendor-specific ecosystems and complicating remote control or automation.[5] The introduction of personal computers like the Apple II in 1977 and the IBM PC in 1981 amplified the demand for programmable modem interfaces around 1979-1980, as hobbyists and businesses sought to connect these machines to bulletin board systems (BBS) and remote services for data sharing and communication.[13] Apple's 1978 Communications Interface Card, designed for modem integration, exemplified this growing need, but the lack of standardized controls persisted as a barrier until solutions emerged to address the fragmentation.[13] Key to this era were AT&T's Bell 103 standard, developed in the early 1960s for full-duplex 300 bps transmission using frequency-shift keying, and the Bell 212A standard of 1976, which quadrupled speeds to 1200 bps while maintaining backward compatibility, establishing foundational protocols for data transmission over dial-up lines.[14] These developments highlighted the market's readiness for a unified command interface to simplify modem operation amid the personal computing boom.[11]Creation by Hayes Microcomputer Products
In 1981, Hayes Microcomputer Products, founded in 1977 by Dennis Hayes and Dale Heatherington in Atlanta, Georgia, introduced the Smartmodem 300, a groundbreaking 300 baud modem that connected personal computers to telephone lines via an RS-232 port.[15][9] The device was developed to address the limitations of earlier modems, building briefly on standards like the Bell 103 for compatibility with existing telephone systems.[9] Hayes, a former IBM engineer, and Heatherington, an electronics expert, designed the Smartmodem as an external unit with a built-in microprocessor, enabling automated operations that simplified connectivity for early personal computing users.[15] The primary motivation behind the Smartmodem's design was to create a user-friendly interface that allowed software control of the modem, replacing cumbersome hardware configurations such as DIP switches that required manual adjustments for dialing and settings.[15] To achieve this, Heatherington and Hayes invented the AT command set in June 1981, a standardized language for issuing instructions to the modem.[15] The "AT" prefix stood for "Attention," signaling the modem to interpret the following command, such as "D" for dialing a telephone number (e.g., ATD followed by the number).[12] This approach facilitated seamless integration with terminal software on diverse microcomputers, making modem operation accessible without specialized hardware knowledge.[12] The launch of the Hayes Smartmodem 300 revolutionized modem accessibility for hobbyists and small businesses by enabling easy auto-dialing, auto-answering, and configuration through simple text commands sent over serial connections.[9] Priced at around $300, it quickly gained traction, with Hayes selling 140,000 units in 1982 alone and generating $12 million in revenue, demonstrating rapid initial adoption.[15] By the mid-1980s, cumulative sales exceeded one million units, underscoring the product's role in democratizing online access for personal and professional use.[15]Industry Adoption and Evolution
Following the introduction of the Hayes Smartmodem in 1981, the AT command set quickly gained traction as a de facto standard for modem control, largely due to the Federal Communications Commission's (FCC) Computer II decision in 1980, which deregulated customer premises equipment by separating it from regulated network services, and the 1982 Modified Final Judgment in the AT&T antitrust case, which divested AT&T and allowed it to compete in the CPE market, thereby accelerating adoption of affordable, direct-connect modems.[16][15] This regulatory environment enabled Hayes and other manufacturers to sell intelligent modems to personal computer users, with Hayes achieving sales of 140,000 units and $12 million in revenue by 1982.[15] The absence of broad patents on the core AT command set facilitated rapid cloning by competitors, including U.S. Robotics and Telebit, resulting in a proliferation of "Hayes-compatible" modems by 1984 that adhered to the same syntax for dialing, configuration, and status reporting.[15] These clones undercut Hayes' pricing while expanding market access, as software developers could write universal terminal programs supporting the AT interface without proprietary restrictions, leading to Hayes capturing nearly 60% of the 300-baud and 1200-baud markets by mid-1984.[15] By 1986, as the industry shifted to higher speeds, Hayes introduced extensions to the AT set for V.32 full-duplex operation at 9600 bits per second, maintaining compatibility while supporting error correction and compression protocols that became essential for reliable data transfer over analog lines.[17] The AT command set played a pivotal role in fostering Bulletin Board System (BBS) culture and early internet access during the 1980s and 1990s, enabling users to automate connections to remote servers via simple dialing commands like ATDT, which powered the exchange of files, messages, and software among hobbyists before widespread graphical web browsers emerged.[18] This standardization supported the growth of over 100,000 BBSes worldwide by the early 1990s, where AT-compatible modems facilitated asynchronous communication at speeds from 300 to 14,400 baud, bridging isolated personal computers into nascent online communities.[19] Hayes Microcomputer Products experienced a sharp decline in the 1990s amid market saturation, intense competition from low-cost clones, and internal executive conflicts, culminating in Chapter 11 bankruptcy filing in 1994 and eventual acquisition, as the company struggled to innovate amid the transition to 56 kbit/s standards like V.90 and V.92 that demanded advanced digital signaling Hayes had not aggressively pursued.[15]Command Syntax and Fundamentals
Syntactical Structure and Parsing
The Hayes AT command set employs a structured syntax where each command line begins with the prefix "AT", denoting "attention" to synchronize baud rate and parity settings with the host device.[20] This prefix is followed by one or more command identifiers, typically single uppercase letters or symbols (such as "D" for dialing operations), optionally accompanied by parameters that modify the command's behavior, such as numeric values or qualifiers.[21] The entire command line concludes with a carriage return character (ASCII 13, configurable via the S3 register), which signals the modem to parse and execute the buffered input.[20] Command buffering allows the modem to accept and process multiple commands within a single line, typically concatenated without separators (though spaces may be inserted for readability, if not recommended), with execution occurring sequentially from left to right. Specific modifiers like the semicolon (;) after dialing commands return the modem to command mode without entering data mode.[21] Buffer capacity varies by model, typically limited to 40 characters in early Smartmodem implementations, though later V-series modems support up to 255 characters; exceeding this limit triggers an error response without processing further input.[20] During input, line editing is facilitated by the backspace character (ASCII 8, defined by the S5 register) or delete (ASCII 127), enabling correction of the command line before termination.[21] Upon execution, the modem generates response codes to indicate outcomes, available in either numeric or verbose formats controlled by the V register (V0 for numeric, V1 for verbose, with V1 as default).[20] Numeric responses include values such as 0 for OK (successful execution) and 1 for CONNECT (established link), while verbose equivalents render as textual strings like "OK" or "CONNECT".[21] These responses are prefixed and suffixed by carriage return and line feed characters (CRLF) for readability, with additional details like connection speed appended in verbose mode (e.g., "CONNECT 300").[20] Error handling in parsing returns a specific response code—numeric 4 or verbose "ERROR"—for invalid syntax, unrecognized commands, or buffer overflows, halting further processing in the line while allowing subsequent command lines to proceed.[21] To facilitate mode transitions during active connections, an escape sequence of three plus signs ("+++") is used to revert from data mode to command mode, requiring a guard time pause (default 1 second, adjustable via S12 register) before and after the sequence to avoid misinterpretation as data.[20] This sequence confirms the switch with an "OK" response, enabling re-entry of AT commands without disconnecting the line.[21]Command and Data Modes
The Hayes AT command set operates the modem in two primary modes: command mode and data mode, which determine how the modem interprets incoming characters from the data terminal equipment (DTE).[22][23] In command mode, the modem accepts and processes AT commands sent from the DTE, such as those for configuration, dialing, or status queries, but does not transmit user data over the telephone line.[5][22] This mode is the default state upon modem power-up or reset, where characters are buffered until a carriage return is received, allowing multiple commands to be combined in a single line prefixed by "AT" or "at".[23] The modem responds with result codes, such as "OK" or "ERROR", to acknowledge command execution, ensuring controlled interaction without ongoing data exchange.[22] Data mode, also known as online mode, enables transparent transmission of data between the local DTE and a remote device after a successful connection is established.[5][23] In this state, incoming characters from the DTE are forwarded directly to the remote end without interpretation as commands, facilitating bidirectional communication at the negotiated line speed.[22] The modem enters data mode automatically following a dial-out command like ATD or an answer command like ATA that results in carrier detection, or via explicit transition from command mode.[23] Transitions between modes are essential for modem operation. From command mode to data mode, the modem switches upon successful connection or via a command such as ATO, which resumes online data transfer after an escape.[22][23] Conversely, from data mode to command mode, the user initiates an escape sequence consisting of three plus signs (+++), followed by a valid AT command like ATZ for reset, or by dropping the Data Terminal Ready (DTR) signal or issuing a hangup command like ATH.[5][22] The escape sequence requires specific timing to avoid false triggers within the data stream: a guard time of silence, typically 1 second (configurable via S12 register, default 50 units of 20 ms each), must precede and follow the +++ characters.[5][23] This time-independent escape sequence (TIES) ensures reliable mode switching without interrupting legitimate data.[23] These modes have distinct implications for flow control and error correction. In command mode, flow control is generally unnecessary due to the low volume of short command exchanges, which occur at the DTE's baud rate without line transmission; however, hardware signals like RTS/CTS may still modulate command acceptance to prevent buffer overflow.[23] In data mode, flow control becomes critical to manage data rates between the DTE and modem, supporting options such as XON/XOFF software flow or RTS/CTS hardware flow to buffer incoming data and avoid loss during speed mismatches.[23] Error correction protocols, like V.42 or MNP levels 4/5, are active only in data mode to detect and retransmit corrupted packets over the noisy analog line, ensuring reliable end-to-end transfer, whereas command mode relies on simple acknowledgments without such mechanisms.[23][22]Initialization Sequences
Upon power-on, Hayes-compatible modems initialize to a predefined configuration, typically the factory defaults or a user-selected profile stored in non-volatile memory, which governs parameters such as baud rate, speaker volume, echo control, and result code verbosity.[24][5] This non-volatile storage ensures that settings persist through power cycles, with the power-on profile often determined by the&Y command (e.g., &Y0 for profile 0 or &Y1 for profile 1).[24]
The primary reset mechanism during initialization is the ATZ command, which restores the modem to a stored user profile without requiring a hardware reset; ATZ0 recalls profile 0, while ATZ1 recalls profile 1, and a plain ATZ defaults to profile 0 in many implementations.[25][5] Complementing this, the AT&F command loads the manufacturer's factory default settings, clearing custom configurations and S-register values to their original state (e.g., AT&F0 for standard defaults).[25][24] For verification post-reset, the ATI command queries product details, returning lines of information such as model name, firmware revision, and capabilities, with the number of lines controlled by an optional parameter (e.g., ATI0 for minimal output).[25]
Autobaud detection enhances initialization by allowing the modem to automatically sense the host computer's baud rate from the timing and bit patterns of the initial AT command sequence, eliminating the need for manual rate configuration.[26] This process relies on the regular ASCII bit sequences of 'A' (1000001) and 'T' (1010100), which provide distinct transitions suitable for synchronization at standard rates like 300, 1200, 9600, and 115200 baud.[26][27] Enabled by default in most Hayes-compatible modems, autobaud can be disabled via commands like #BDR to fix a specific rate if needed.[24]
A common initialization string combines reset and configuration steps for reliable startup, such as ATZ&F to reset and restore factory defaults, often followed by profile viewing with AT&V to confirm settings like active S-registers and stored profiles.[25][5] More comprehensive examples include AT&F&C1&D2 to set factory defaults with carrier detect control and data terminal ready handling.[25]
While effective for standard baud rates, autobaud detection may encounter compatibility issues with non-standard rates (e.g., 57600 or custom values), as the bit pattern analysis assumes common clock timings, potentially resulting in failed synchronization or fallback to a default rate and requiring manual intervention or hardware adjustments.[28][27]
Basic Command Set
Dialing and Connection Commands
The dialing and connection commands in the Hayes AT command set enable modems to initiate, answer, and terminate telephone connections, forming the core of remote data communication over analog phone lines.[21] These commands, prefixed with "AT" to denote "attention," allow users to specify dialing methods and control call flow without manual intervention.[21] The primary dialing command is ATD, which instructs the modem to enter originate mode and dial the specified telephone number.[21] It supports two dialing modes: pulse dialing (denoted by "P"), which generates rotary-style pulses and serves as the factory default, and tone dialing (denoted by "T"), which produces dual-tone multifrequency (DTMF) signals for faster and more reliable connections on modern telephone systems.[21] The dial string follows the mode specifier, such as ATDP123 for pulse dialing the number 123 or ATDT555-0123 for tone dialing.[21] Key modifiers within the dial string include a comma (,) for inserting a pause—typically 2 seconds as set by the S8 register—and a semicolon (;) to return the modem to command mode after dialing without attempting a full connection, useful for sending tones to automated systems like voice mail.[21] For example, ATDT9,555-1234; dials 9, pauses, dials the number, and then awaits further commands rather than handshaking.[21] To answer incoming calls, the ATA command off-hooks the modem and initiates a handshake with the remote device, provided the auto-answer ring count (S0 register) is set greater than zero, such as S0=1 for answering after one ring.[21] Conversely, the ATH command (or ATH0) terminates an active connection by on-hooking the modem and returning to command mode; ATH1 variants off-hook without handshaking for testing purposes.[21] Pulse and tone dialing can be switched persistently using the ATP command to set pulse dialing as default or ATT to set tone dialing, overriding the per-dial specifier until reset.[21] Connection modifiers like the semicolon in ATDT123; allow the modem to remain in command mode post-dialing, facilitating scenarios such as generating tones for interactive voice response systems without establishing data transfer.[21] In the original Hayes command set, these dialing commands supported connections from 300 baud up to 14400 baud, reflecting the progression from early 300 bps modems to V-series high-speed models by the early 1990s.[21] Successful connections via ATD or ATA typically return result codes like "CONNECT 14400" to indicate the established baud rate.[21]| Command | Syntax | Primary Function | Key Modifiers/Options |
|---|---|---|---|
| ATD | ATD | Initiate outbound dial | P (pulse), T (tone), , (pause), ; (return to command mode) |
| ATA | ATA | Answer incoming call | Requires S0 > 0 for auto-answer |
| ATH | ATH | Hang up connection | ATH1 for off-hook without handshake |
| ATP | ATP | Set pulse dialing as default | Use ATT |
Configuration and Control Commands
The configuration and control commands in the Hayes AT command set allow users to customize modem behavior for optimal data transmission, audio feedback, and protocol handling prior to establishing connections. These commands adjust parameters such as character echoing, result code output, speaker operation, flow control mechanisms, error correction protocols, and data compression options, ensuring compatibility with diverse communication environments. By issuing these commands in the modem's command mode, typically via an initialization string like AT&F followed by specific settings, users can tailor the modem's hardware and software configurations without interrupting ongoing sessions.[21] Echo and result code controls manage user interface feedback during command entry and operation. The E command governs command state character echo, where E0 disables echoing to prevent redundant display on the terminal, and E1 enables it for visual confirmation of typed commands (factory default). Complementing this, the Q command regulates result code transmission, with Q0 enabling codes like "OK" or "CONNECT" to report modem status (factory default), and Q1 suppressing them for silent operation in automated scripts. These settings enhance usability by balancing verbosity and efficiency in terminal interactions.[21] Speaker control commands provide audible cues for dialing and connection processes, aiding troubleshooting in acoustic environments. The M command selects speaker modes, including M0 to keep the speaker always off for quiet operation, and M1 to activate it during off-hook until carrier detection (factory default), allowing users to monitor dialing tones without persistent noise post-connection. This configuration is particularly useful in shared spaces or when integrating with software that relies on silent hardware.[21] Flow control commands prevent data overflow between the modem and connected device by regulating transmission rates. The &K command sets local flow control options, such as &K0 to disable all flow control for direct connections, and &K3 to enable RTS/CTS hardware flow control, which uses dedicated signals to pause and resume data flow dynamically (common factory default in error-corrected modes). This ensures reliable throughput, especially in high-speed asynchronous communications where buffer overruns could lead to data loss.[21] Error correction and guard tone commands configure protocols for robust signal integrity over telephone lines. The \N command selects error correction modes, with \N0 disabling error correction for normal buffered mode, and \N3 enabling auto-reliable mode using MNP 4 or V.42 protocols with fallback to non-error-corrected operation if negotiation fails (factory default in many implementations). For international compatibility, the &G command adjusts guard tones, where &G0 disables tones (standard for North America), &G1 enables a 550 Hz tone, and &G2 a 1800 Hz tone to minimize interference in certain networks. These settings mitigate transmission errors caused by line noise or frequency-specific distortions.[21] Data compression commands optimize bandwidth usage alongside error correction. The %C command enables compression, such as %C0 to disable it entirely, and %C2 to activate V.42bis compression for up to 4:1 data reduction in compatible sessions (factory default). When paired with error correction like \N3, this allows efficient handling of compressible payloads, such as text files, while maintaining link reliability without requiring separate protocol negotiation.[21]Status and Information Commands
The status and information commands in the Hayes AT command set allow users to query the modem's operational state, firmware details, and connection parameters without altering settings, providing essential diagnostics for troubleshooting and verification. These commands are executed in command mode and typically elicit textual or numeric responses followed by an "OK" confirmation, enabling software or users to retrieve real-time data on the modem's configuration and line conditions.[5] The ATI command retrieves product identification and firmware information, helping identify the modem model and revision for compatibility checks. Subvariants like ATI0 display the basic product code (e.g., "Hayes Compatible 2400"), while ATI1 or ATI2 report ROM checksums for integrity verification, and ATI4 lists supported features. The response format varies by implementation but always concludes with "OK" if successful.[29][5] AT&V displays the current and stored configuration profiles, including active S-register values, dialing options, and stored telephone numbers, offering a snapshot of the modem's setup across multiple profiles (e.g., Profile 0 as active with settings like B0 E1 L1 M1). This command is particularly useful for reviewing user-defined presets without needing to read individual registers. The output is a formatted text block ending in "OK".[29][5] To read a specific S-register value, the ATSn? command is used, where "n" specifies the register number (e.g., ATS0? for the ring count threshold). It returns the register's content as a three-digit decimal value (e.g., "000" for S0), padded if necessary, followed by "OK", allowing targeted queries into timing, error correction, and other parameters stored in the modem's non-volatile memory.[29][5] The extended &L command selects line type for dial-up (&L0, default) or leased line (&L1) operation. To view current settings including line type, use AT&V. These integrate with standard result codes like "CONNECT" or "NO CARRIER" for broader status feedback.[5]S-Registers
Purpose and Access Methods
S-registers in the Hayes AT command set serve as software-programmable storage locations within the modem, designed to hold configurable parameters that control operational behaviors such as timeouts, retries, and other persistent settings essential for modem functionality. These registers provide a mechanism for users to customize and maintain modem configurations across sessions, ensuring consistent performance without requiring repeated manual adjustments.[30][5] Access to S-registers is achieved through specific AT commands: the syntaxATSn=m sets the value of register n (where n is the register number) to m (a decimal value), while ATSn? queries and displays the current value of register n.[30][31] Upon modem power-up or execution of the ATZ command, which performs a soft reset, the S-registers are loaded from the selected power-on profile stored in non-volatile memory. Factory defaults, predefined by the manufacturer, are restored using the &F command followed by ATZ.[21][32]
The allowable range for values in most S-registers is 0 to 255 in decimal notation, though certain registers employ bit-mapped structures to encode multiple options within a single value.[30][5] To enable non-volatile persistence, the &W0 or &W1 command writes the current configuration of S-registers (along with other settings) to stored profile 0 or 1 in non-volatile RAM, preventing loss during power cycles; the &Y0 or &Y1 command then selects which profile (0 or 1) is loaded upon subsequent power-on or reset.[30][31] This profile-based system allows for multiple predefined setups, enhancing flexibility in modem deployment.[32]
Key Register Definitions
The S-registers in the original Hayes AT command set store configurable parameters that govern fundamental modem operations, including auto-answer thresholds, character recognition for commands and escapes, and critical timing intervals for dialing and connection management. These registers, accessible via AT commands like ATSn=v (to set) and ATSn? (to read), allow users to tailor the modem's response to network conditions and user needs without altering the core command syntax. Below is a catalog of the most important S-registers from the Hayes Smartmodem era, focusing on their functions, default values, and ranges as defined in early implementations.| S-Register | Function | Default Value | Range | Units/Notes |
|---|---|---|---|---|
| S0 | Specifies the number of incoming rings required before the modem automatically answers a call. | 0 | 0–255 | 0 disables auto-answer; values 1–255 set the ring count for auto-answer activation.[21][5] |
| S2 | Defines the ASCII code for the escape character used to switch from data mode to command mode (typically part of the "+++" sequence). | 43 | 0–255 | 43 corresponds to the "+" character; escape disabled if value >= 128; 0-127 sets the ASCII escape character.[21][20] |
| S3 | Sets the ASCII code for the carriage return character, which terminates command lines entered in command mode. | 13 | 0–127 | 13 is the standard carriage return (CR); values outside this range may cause command parsing issues.[21][20] |
| S6 | Establishes the pause duration after going off-hook before proceeding with blind dialing (without dial tone detection) or wait time for dial tone if detection is enabled. | 2 | 2–255 | Seconds; this prevents premature dialing in pulse-based systems.[5][21] |
| S7 | Determines the maximum time the modem waits to detect a valid carrier signal after initiating a dial or answer command. | 30 | 1–255 | Seconds; if no carrier is detected within this period, the modem times out and returns to command mode.[5] |
| S10 | Sets the time between loss of carrier signal and automatic disconnection (hangup). | 14 | 1–255 | 0.1 seconds; 255 = do not disconnect on carrier loss (default 1.4 s). Aids in handling brief carrier drops.[21][23] |
| S12 | Sets the minimum guard time (silence period) required before and after the escape sequence to recognize it and switch to command mode. | 50 | 0–255 | 1/50 second (default 1 s); 0 disables escape sequence recognition. Prevents accidental mode switches during data.[23] |
| S37 | Configures the maximum desired line speed (DCE rate) for connections (later extensions, not in original 300 bps Smartmodem). | 0 | 0–11 (model-dependent) | 0 enables auto-detection; other values select specific rates (e.g., 5=1200 bps, up to 11=14400 bps in compatible models).[21] |
Extensions and Standards
V.250 and ITU-T Extensions
The ITU-T V.250 recommendation, originally designated as V.25 ter and first approved in August 1995 with revisions in 1997 before being renumbered to V.250 in 1998, standardized the Hayes AT command set for serial asynchronous automatic dialing and control in data terminal equipment (DTE) to data circuit-terminating equipment (DCE) interfaces.[33] This formalization aimed to promote interoperability among V.34 modems operating at speeds up to 33.6 kbit/s, extending the basic Hayes commands to support advanced features required for higher-speed data communications over telephone networks.[34] By codifying the AT syntax and reserving the "+" prefix for future standardized extensions, V.250 ensured orderly evolution of the command set without conflicting with proprietary implementations.[35] Key extensions in V.250 include identification commands such as +GMI to request the manufacturer's identification string, +GMM for the model identification, +GMR for the revision level, and +GSN for the product serial number, which provide standardized ways to query modem capabilities beyond basic Hayes information responses.[36] For enhanced error correction and data compression aligned with V.42 and V.42bis protocols, commands like +ES select error control modes, +DS configure data compression parameters (e.g., dictionary size and maximum code words), and +DR set reporting for compression status during connections.[36] Flow control was improved with +IFC, allowing selection of software (XON/XOFF) or hardware (RTS/CTS) methods to manage data flow at higher rates, while +MS enables modulation selection for V.34, specifying carrier frequencies and symbol rates to achieve optimal line speeds.[36] Compared to the basic Hayes set, V.250 introduced more verbose and standardized result codes (e.g., via extensions to the V and X registers) for detailed connection feedback, including negotiated data rates and protocol modes, which facilitated automated scripting for 56 kbit/s modems under later amendments supporting V.90 and V.92 standards approved in 2001.[37] These enhancements addressed limitations in legacy Hayes commands, such as rudimentary speed reporting, by mandating comprehensive online data state management. V.250's adoption became foundational for post-1990s dial-up modems from manufacturers like Hayes and US Robotics, and it influenced configuration interfaces in early DSL modems for tasks like line diagnostics and protocol negotiation, promoting global compatibility in telecommunication equipment.[34]GSM and Mobile Network Commands
The Hayes AT command set was extended in the 1990s to support GSM mobile networks through ETSI standards GSM 07.05, which defines AT commands for Short Message Service (SMS) and Cell Broadcast Service (CBS), and GSM 07.07, which specifies commands for controlling mobile equipment functions and GSM network access.[38][39] These standards, originating from ETSI's Special Mobile Group, were developed to enable terminal equipment to interact with GSM networks via serial interfaces, building on the basic dialing syntax of the original Hayes commands.[38] They have since evolved under 3GPP into Technical Specifications TS 27.005 for SMS-related commands and TS 27.007 for broader mobile termination control, with the latest versions maintaining compatibility while adding support for later generations like UMTS and LTE fallback.[40] Key commands for SMS operations include AT+CMGS, which sends an SMS-SUBMIT message from the terminal equipment to the network.[38] In text mode (set via AT+CMGF=1), the syntax isAT+CMGS=<da>[,<toda>] followed by the message body and terminated with Ctrl-Z (ASCII 26); <da> specifies the destination address as a string, and <toda> indicates the type of address (e.g., international).[38] Upon success, it returns +CMGS: <mr>, where <mr> is the message reference number; errors yield +CMS ERROR: <err>.[38] For data connectivity, ATD99#[[<cid> selects the context ID, and success prompts a "CONNECT" response entering data mode.[40]
Network registration is managed via AT+CREG?, which queries the circuit-switched (CS) domain status, returning +CREG: <n>,<stat>[,<lac>,<ci>[,<AcT>]]; <stat> values include 0 (not registered, not searching), 1 (registered, home), 2 (searching), 3 (denied), 4 (unknown), or 5 (registered, roaming), with <lac> and <ci> providing location area and cell ID in hexadecimal.[40] Operator selection uses AT+COPS=[<mode> 0 enables automatic selection, 1 manual (specifying <oper> as alphanumeric or numeric PLMN code), 2 deregisters, and 3 sets format only, with query response +COPS: <mode>,<format>,<oper>.[40] For call control, AT+CLCC lists active calls, outputting +CLCC: <id>,<dir>,<stat>,<mode>,<mpty>[,<number>,<type>]; <dir> is 0 (mobile-originated) or 1 (terminated), <stat> ranges from 0 (active) to 7 (held with others active), and <mode> covers voice (0), data (1), or fax (2).[40]
These commands remain relevant in 2025 for IoT applications, particularly in modules like the SIM800 series from SIMCom, which implement the full GSM 07.05/07.07 profile for 2G operations and support 3G fallback where available, enabling low-power SMS, data, and call functions in remote sensors and telemetry devices.[41] The SIM800 supports AT+CMGS for messaging, AT+CREG and AT+COPS for network management, AT+CLCC for calls, and ATD*99# for GPRS, aligning with 3GPP TS 27.005 and 27.007 while adding IoT-specific extensions like TCP/IP stacking.[41]
Voice Modem Command Set
The voice modem command set extends the Hayes AT command framework to enable audio processing and telephony operations, allowing modems to handle voice calls beyond traditional data transmission. Developed in the 1990s, this command set supports features like speakerphones and answering machines by controlling audio routing, compression, tone generation, and buffering. It is based on the TIA IS-101 Voice Control Interim Standard for Asynchronous DCE, prepared by the TIA Technical Subcommittee TR29.2, which defines protocols for asynchronous data circuit-terminating equipment (DCE) to manage voice data streams.[42] A core command is #VLS, used for local speaker and audio device control, which selects the source and destination for voice signals such as the telephone line, handset, speaker, or microphone. The syntax isAT#VLS=<n>, where <n> is a value from 0 to 15 (e.g., 0 for telephone line on-hook, 1 for handset off-hook); this enables configurations for hands-free operation in speakerphone setups.[30]
The #VSM command configures voice sample modes, specifying compression algorithms and sampling rates to optimize audio quality and bandwidth. Its syntax is AT#VSM=<cmi>,<vsr>, with <cmi> indicating the compression method (e.g., 128 for 8 kHz PCM linear) and <vsr> the samples per second (e.g., 8000); this is essential for encoding voice data in answering machine recordings or real-time telephony.[30]
DTMF tone generation is handled by the #VTS command, which transmits dual-tone multi-frequency signals for interactive applications. The syntax is AT#VTS=<string>, where <string> includes digits (0-9), symbols (*, #, A-D), or custom tones specified as [frequency1,frequency2,duration]; for instance, AT#VTS=123 sends the tones for digits 1, 2, and 3 sequentially.[30]
For voice recording and playback, the #VRX command initiates receive mode to capture audio from the line or microphone into the modem's buffer, using the syntax AT#VRX (no parameters), returning a CONNECT result code upon starting. Complementarily, #VTX starts transmit mode to send buffered audio to the line or speaker, with syntax AT#VTX; these commands facilitate full-duplex or half-duplex voice sessions in devices like automated answering systems.[30]
Buffer management is supported by the #VBQ command, which queries the sizes of transmit and receive voice buffers to prevent overflow during audio operations. The syntax is AT#VBQ? (no parameters), responding with values in bytes (e.g., transmit buffer size followed by receive); this aids in applications requiring stable audio flow, such as early VoIP gateways interfacing analog voice with IP networks prior to the 2000s.[30]