1. Introduction

This document describes the interface for the ANB Sensor S Series pH sensor when tethered to a remote operating system.

2. Electrical Connection

The ANB S Series pH sensor uses an MCBH4M connector with the following pin-out:

2Sensor Receive/485 (RS-485B)
3Sensor Transmit/485 (RS-485A)

3. Message Protocol

The following section defines the message protocol.

3.1 Serial Configuration

The serial connection protocol and settings are:

  • RS232/485
  • 9600 bps
  • 8 Data bits
  • 1 Stop bit
  • No Parity

3.2 Protocol


After power-up, a scan command must be issued to the sensor with a valid communication protocol in order to commence sampling (scanning). The sensor will then stream samples when they become available. The streaming interface minimizes interruptions to the sensor’s processing which would otherwise occur with a polled interface.

A shutdown command should be issued to the sensor before power is removed to allow it to shut down safely. However, provision is also made within the sensor to shut down safely in the event of unexpected power loss.

To restart scanning the unit must be power cycled.

3.3 Command Format

All commands consist of a single line of ASCII characters terminated by the ASCII character <CR> (0x0D). No CRC is used. The maximum length of any command line is 100 characters, including the terminator.

Note: Command strings are case sensitive

3.4 Sample/Response Format

All samples/responses consist of a single line of ASCII characters terminated by the ASCII character <CR> (0x0D). A <LF> (0x0A) may follow the <CR>, but this should be ignored when handling the sample/response. Each sample/response begins with the start delimiter $ANB, followed by two or more comma-separated parameter values. The first parameter is the checksum (see section 3.4.1). The next parameter is the status. The status will be set to 0 to indicate success or will otherwise signal an error condition.

The maximum length of any sample/response line is 100 characters, including the terminator. Sample/Response strings are case sensitive.

3.4.1 Checksum

The checksum in all samples/responses is a 16-bit CRC16-CCITT cyclic redundancy check (CRC) calculated for all bytes between (and including) the <STATUS> parameter and the <CR> terminator (but not the optional <LF>). It is represented as a 4-digit hexadecimal string. See Section 5 of this document for details of the CRC implementation.

3.5 SCAN command

Command Format: SCAN<CR>

The SCAN command instructs the sensor to commence scanning immediately, and to stream samples over the serial interface. This command should be issued at power on after a 1000ms start up time has elapsed, but within a window of 4 minutes. This is to accommodate variants of the sensor, which automatically begin sampling and disable the serial interface 4 minutes from power-on if no serial communication has been received.

If the SCAN command succeeds the sensor responds immediately with a basic status. The format of the response is as follows:

Response format: $ANB,<CRC>,<STATUS>,<SN>,<TIME><CR>

<CRC>See 3.4.1
<SN>Sensor serial numberUnsigned integer
<TIME>Current sensor clock time (seconds since the Unix epoch)Unsigned integer

If the SCAN command fails (invalid command or sensor error), the status parameter is set appropriately, and no additional parameters follow. The format of the response is as follows:

Response format: $ANB,<CRC>,<STATUS><CR>

<CRC>See 3.4.1Hex string
<STATUS>Status: 1 (Invalid command) 2 (Sensor error)Unsigned integer

In either case the sensor begins its response to the SCAN command within 500ms.

– If a timeout is incurred waiting for the response, the command should be retried.

– If still no response is received the sensor should be power cycled.

3.5.1 Sample format

Once scanning is enabled, the sensor will automatically send samples as soon as they are available. The status parameter in a streamed sample is always 0. The format of the streamed samples is defined as follows:


<CRC>See 3.4.1
<TIMESTAMP>Sample timestamp (seconds since the Unix epoch)Unsigned integer
<PH>Sample pH value (pH)Float (3 decimal places)
<ELECTODE>Electrode numberUnsigned integer
<TEMP>Sample temperature (°C)Float (3 decimal places)
<HEALTH>Sensor health status code (0=OK)Unsigned integer

The minimum interval between samples is currently around 30s. If the interval between samples exceeds 180s the sensor should be power cycled.

3.6 SHUTDOWN command

Command Format: SHUTDOWN<CR>

The SHUTDOWN command notifies the sensor that power will be removed imminently. A period of 500ms should be allowed between sending the command and removing power. This allows the sensor to perform a clean shutdown prior to power loss.

No response is required to the SHUTDOWN command.

4. Data Retrieval – to be used only if required


  1. Install Tera Term before using the S1100 https://osdn.net/projects/ttssh2/releases/
  2. Plug the Data Retrieval Unit (DRU) into the USB port of a computer ensuring the S1100 is disconnected from the DRU
  3. Launch Tera Term
  4. On Set-up menu select serial port from the drop down. In the resulting window select the correct comm port.
  5. Select speed = 9600, Data = 8bit, Parity = none, Stop bits = 1, flow control = none. Click OK
  6. On Set-up menu select terminal and new line options in resulting window should be Receive = Auto and Transmit = CR+LF.
  7. Ensuring the sensor is dry and disconnected from power, plug the DRU connector to the subconn connector on the S1100.
  8. Wait for the system to beep once, the sensor is now ready to operate.
  9. Set Tera Term to save data to a log file. On Tera Term Select File>>log>>[(enter filename of choice).csv] and browse to location you wish to save the file. Ensure timestamp is deselected and click Save.
  10. Type “PHFILE” and then “Enter” to download the data from the S1100. This will download all pH files since last download.

5. CRC16-CCITT Generation

The following section provides example code for calculating the 16 bit CRC16-CCITT cyclic redundancy check

5.1 Function

uint16_t crc16_ccitt(const uint8_t *data, uint32_t data_length) 
    uint32_t i; uint16_t crc; 
    crc = 0; 
    for (i = 0U; i < data_length; i++) 
       crc = (crc << 8) ^ crc16_ccitt_table[(crc >> 8) ^ data[i]]; 
    return (crc); 

5.2 Lookup-table

static const uint16_t crc16_ccitt_table[] =
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 };

Please do not hesitate to contact us at support@anbsensors.com if you have any questions.