All EMR serial interface messages transferred between the Refractor 900 (VIS900) and an external computer system begin with the ASCII Start of Text character (STX, 0x02) and end with the ASCII End of Text character (ETX, 0x03). Within each message, individual lines are separated by Carriage Return + Line Feed (CR LF, 0x0D 0x0A).
The receiving system must acknowledge each complete message within 2 seconds:
ACK (0x06) if no error is detected
NAK (0x15) if an error is detected
If a NAK character is received, the sender should retransmit the entire message.
The EMR interface may use None or Hardware flow control. In both cases, the CTS input signal on the Refractor 900 must be active before any message is sent. This can be achieved either by wiring RTS and CTS correctly between the VIS900 and the EMR system, or by implementing a loopback connection between RTS and CTS on the Refractor 900 (with flow control set to None).
The serial communication parameters for the EMR connection can be configured on the Ports settings page (see Installation Guide chapter 10) of the Refractor 900. These parameters must match the EMR system configuration.
| Parameter | Options | Comment |
|---|---|---|
| Baud Rate | 300, 600, 1'200, 2'400, 4'800, 9'600, 14'400, 19'200, 28'800, 38'400, 56'000, 57'600, 76'800, 115'200, 128'000, 230'400, 256'000, 460'800, 500'000, 576'000, 921'600, 1'000'000, 1'152'000, 3'125'000, 12'000'000 |
Serial connection baudrate |
| Data Bits | 6, 7, 8, 9 | Bytesize of serial data |
| Stop Bits | 1, 1.5, 2 | Stop bits for serial communication |
| Parity | None, Even, Odd, Mark, Space | Parity for serial communication |
| Flow Control | Off, Hardware, Software | Set flowcontrol to Hadware(rts/cts), Software or Off |
| Enable ACK check | On, Off | Enable ACK 604 error detection (can only be set over API) |
| ACK Timeout | defaut 3s | Timeout for ACK 604 error (can only be change over API) |
The chosen configuration is stored in non-volatile memory and automatically restored at power-up.
The VIS900 EMR driver allows sending final refraction data to an EMR system, and receiving previously recorded data from an EMR system.
⚠️ Note on formatting in this documentation
In the message examples, the "·" character represents a single space that must be transmitted literally.
Other visible alignments or multiple spaces in the examples are only for readability in this documentation and should not be included in the actual message.
A data output message is transmitted when the "Export" button on the controller is pressed. The EMR system must respond within 3 seconds with ACK/NAK.
Message layout example
<STX> # Start character (0x02)
VIS900<CR><LF> # Device identifier
DATA<CR><LF> # Start of data section
VI<CR><LF> # Data source: VI = VIS900
RIGHT<CR><LF> # Eye side
SPH_F_R:·+·3.75<CR><LF> # Far sphere, diopters
SPH_N_R:·+·4.50<CR><LF> # Near sphere, diopters
CYL_R··:·-·2.50<CR><LF> # Cylinder, diopters
AXIS_R·:·····47<CR><LF> # Axis, degrees
PRISM_R:···5.50·XX<CR><LF> # Total horizontal prism, in cm/m (XX = IN or OUT)
ACC_R··:·+·0.25<CR><LF> # Accommodation, diopters, always transmitted as positive values
VIS_S_R:···0.50<CR><LF> # Uncorrected (S.C) visual acuity
VIS_C_R:···0.80<CR><LF> # Corrected (C.C.) visual acuity
PD_R···:··31.50<CR><LF> # Pupil distance, mm
LEFT<CR><LF> # Eye side
SPH_F_L:·-·1.50<CR><LF> # Far sphere, diopters
SPH_N_L:·-·0.50<CR><LF> # Near sphere, diopters
CYL_L··:·-·3.25<CR><LF> # Cylinder, diopters
AXIS_L·:····162<CR><LF> # Axis, degrees
PRISM_L:···2.50·XX<CR><LF> # Total vertical prism, in cm/m (XX = UP or DOWN)
ACC_L··:·+·0.25<CR><LF> # Accommodation, diopters, always transmitted as positive values
VIS_S_L:···0.67<CR><LF> # Uncorrected (S.C) visual acuity
VIS_C_L:···0.80<CR><LF> # Corrected (C.C.) visual acuity
PD_L···:··32.50<CR><LF> # Pupil distance, mm
BOTH<CR>·<LF>
HSA····:··13.50<CR><LF> # Corneal vertex distance, mm
PD_G···:··64.00<CR><LF> # Total pupil distance, mm
BLUR···:·+·1.50<CR><LF> # Blur point, cm/m
VIS_S_B:···0.67<CR><LF> # Uncorrected (S.C) binocular visual acuity
VIS_C_B:···1.00<CR><LF> # Corrected (C.C.) binocular visual acuity
PATNAME:Hans·Guenther<CR><LF> # Patient name (maximum 250 characters)
PAT_ID·:123456789*abc<CR><LF> # Patient ID (maximum 250 alphanumeric characters)
REF_DATE:30.04.2015<CR><LF> # Date of the refraction
REF_TIME:09:51<CR><LF> # Time of the refraction
<ETX> # End character (0x03)
⚠️ NOTE — Visual acuity encoding (input)
When the device scale is Snellen, the Refractor 900 provide only the denominator (the part after20/) as a numeric value with two decimals (e.g.,25.00).
⚠️ NOTE — Precision and truncation (export)
All numeric values exported by the Refractor 900 are transmitted with exactly two decimals (xx.xx).
If an internal value contains three decimals (xx.xxx), it is truncated — not rounded — to two decimals to ensure maximum compatibility with EMR systems.
Examples:0.032 → 0.03,0.063 → 0.06,0.125 → 0.12; 1/8‑D steps0.125 → 0.12,0.375 → 0.37,0.625 → 0.62,0.875 → 0.87.
The VIS900 accepts input messages from the EMR system. If the ETX character is not received within 10 seconds after STX, a communication timeout occurs. The VIS900 will then respond with ACK or NAK.
If invalid data is received, a NAK is sent back. Upon receiving a second invalid data message, the refractor sends another NAK. However, if a third invalid data message is received, no further NAK is sent to prevent an infinite loop.
Only available data values must be included. Keywords RIGHT, LEFT and BOTH may be omitted when section not used.
Message layout example
<STX> # Start character (0x02)
COMP900<CR><LF> # Device identifier (external computer)
DATA<CR><LF> # Start of data section
AR<CR><LF> # Data source (AR or LM or CO)
RIGHT<CR><LF> # Eye side
SPH_F_R:·+·3.75<CR><LF> # Far sphere, diopters
SPH_N_R:·+·4.50<CR><LF> # Near sphere, diopters
CYL_R··:·-·2.50<CR><LF> # Cylinder, diopters
AXIS_R·:·····47<CR><LF> # Axis, degrees
PRISM_R:···5.50·XX<CR><LF> # Total horizontal prism, in cm/m (XX = IN or OUT)
ACC_R··:·+·0.25<CR><LF> # Accommodation, diopters, always transmitted as positive values
VIS_S_R:···0.50<CR><LF> # Uncorrected (S.C) visual acuity
VIS_C_R:···0.80<CR><LF> # Corrected (C.C.) visual acuity
PD_R···:··31.50<CR><LF> # Pupil distance, mm
LEFT<CR><LF> # Eye side
SPH_F_L:·-·1.50<CR><LF> # Far sphere, diopters
SPH_N_L:·-·0.50<CR><LF> # Near sphere, diopters
CYL_L··:·-·3.25<CR><LF> # Cylinder, diopters
AXIS_L·:····162<CR><LF> # Axis, degrees
PRISM_L:···2.50·XX<CR><LF> # Total vertical prism, in cm/m (XX = UP or DOWN)
ACC_L··:·+·0.25<CR><LF> # Accommodation, diopters, always transmitted as positive values
VIS_S_L:···0.67<CR><LF> # Uncorrected (S.C) visual acuity
VIS_C_L:···0.80<CR><LF> # Corrected (C.C.) visual acuity
PD_L···:··32.50<CR><LF> # Pupil distance, mm
BOTH<CR>·<LF>
HSA····:··13.50<CR><LF> # Corneal vertex distance, mm
PD_G···:··64.00<CR><LF> # Total pupil distance, mm
BLUR···:·+·1.50<CR><LF> # Blur point, cm/m
VIS_S_B:···0.67<CR><LF> # Uncorrected (S.C) binocular visual acuity
VIS_C_B:···1.00<CR><LF> # Corrected (C.C.) binocular visual acuity
PATNAME:Hans·Guenther<CR><LF> # Patient name (maximum 250 characters)
PAT_ID·:123456789*abc<CR><LF> # Patient ID (maximum 250 alphanumeric characters)
<ETX> # End character (0x03)
⚠️ NOTE — Visual acuity encoding
When the device scale is Snellen, the protocol transmits only the denominator (xxx.xx), to be interpreted as20/xxx.xxby the EMR.
⚠️ NOTE — Precision on import
The Refractor 900 accepts numeric input values with two or three decimals (xx.xx,xx.xxx,xxx.xxx).
Values received with three decimals are supported without error. However, if these values are later exported back to an EMR, they will be truncated to two decimals (xx.xx,xxx.xx) to comply with the VIS900 output specification.
Examples: input0.125is accepted, stored as0.125, but exported as0.12.
When the EMR sends multiple datasets in succession (AR, LM, or CO), it must wait for the VIS900 to return either ACK or NAK before transmitting the next dataset. Systems that cannot interpret ACK/NAK responses must instead enforce a minimum delay of 1 second between datasets to prevent buffer overruns. Example: transmit an AR dataset, wait for the ACK, then send the LM dataset; if acknowledgements are not supported, pause at least 1 second before sending LM.
| Point | Moeller Vis900 protocol | Reichert Vis900 protocol | Current Implementation in Refractor 900 | Impact | Suggested Fix |
|---|---|---|---|---|---|
| Date/Time labels | REFDATE, REFTIME |
REF_DATE, REF_TIME |
REF_DATE, REF_TIME |
None | N/A |
| HSA format | Integer only 16 |
Decimal with two digits 16.00 |
Decimal with two digits 16.00 |
None | N/A |
| ACC positive values | No + sign (0.25) |
Includes + sign (+0.25) |
Includes + sign (+0.25) |
None | N/A |
| PRISM base | Accepted any data, because the prism was ignored | Accepted any data, because the prism was ignored | See 5. Prism Data Handling | Risk of invalid data | Correct data send from EMR system |
| VIS (VIS_S*/VIS_C*) – format | Decimal (ex. 0.80) |
Inconsistent: examples show decimal (0.50, 1.00), Appendix B allows Snellen (20/x) or 0 | Decimal (xxx.xx) |
Risk of incompatibility if EMR applies strict Snellen interpretation | Keep decimal output |
| Terminology: “Decimal” (scale vs. encoding) | Ambiguous | Ambiguous | Clarified distinction (Visual Acuity Scale vs. Data Encoding Format) | Prevents EMR misinterpretation | Add clarification in Appendix D and short notes in §§3.1/3.2 |
Prism values are transmitted as diopters together with a base direction. The VIS900 protocol defines:
IN or OUTUP or DOWNAccepted Input Formats (Computer → VIS900)
value [base] where base is IN or OUT✔️ Valid examples:
PRISM_R:·0 # Prism value is zero → no base required
PRISM_R:·5.50·IN # Prism 5.50 with base "IN" (full word)
PRISM_R:·10·OUT # Prism 10.00 with base "OUT" (full word)
PRISM_R:·10·O # Prism 10.00 with base "O" (abbreviated form, still valid)
PRISM_R:·3.0·in # Lowercase accepted
PRISM_R:·3.0·i # Lowercase accepted (abbreviated form, still valid)
PRISM_R: # Field present but empty → interpreted as null
# Field completely missing → interpreted as null
❌ Invalid examples:
PRISM_R:·5.50 # Missing base
PRISM_R:·-1.0·OUT # Negative value not supported
value [base] where base is UP or DOWN✔️ Valid examples:
PRISM_L:·0 # Prism value is zero → no base required
PRISM_L:·2.50·UP # Prism 2.50 with base "UP" (full word)
PRISM_L:·4·DOWN # Prism 4.00 with base "DOWN" (full word)
PRISM_L:·4·D # Prism 4.00 with base "D" (abbreviated form, still valid)
PRISM_L:·3·up # Lowercase accepted
PRISM_L:·3·u # Lowercase accepted (abbreviated form, still valid)
PRISM_L: # Field present but empty → interpreted as null
# Field completely missing → interpreted as null
❌ Invalid examples:
PRISM_L:·2.5 # Missing base
PRISM_L:·-1·DOWN # Negative value not supported
If you experience issues with the VIS900 EMR serial interface, please contact your local Haag-Streit distributor for assistance.
To help with troubleshooting, always provide both the communication logs and the raw data.
The VIS900 makes these resources available through the following web interfaces:
http://<device-ip>:8001/data/viewerhttp://<device-ip>:8001/logs/viewerPlease include exported information from these viewers when reporting an issue to ensure faster and more accurate support.
The Refractor 900 uses a standard DB9 connector for its RS232 interface.
The table below lists the relevant pin functions and their signal directions as seen from the Refractor 900:
| Pin | Signal | Direction (from VIS900 perspective) |
|---|---|---|
| 2 | RXD | Input (data received by VIS900) |
| 3 | TXD | Output (data sent from VIS900) |
| 5 | GND | Ground reference |
| 7 | RTS | Output (request to send) |
| 8 | CTS | Input (clear to send) |

All input data should lie within the specified ranges to be correctly displayed at the phoroptor head. Out-of-range values may trigger an error message (DATA INVALID).
| Data | Min | Max | Unit |
|---|---|---|---|
| SPH_F, SPH_N | - 20.00 | + 20.00 | diopters |
| CYL | - 8.00 | + 8.00 | diopters |
| AXIS | 000 / 180 | 179 / 359 | degrees |
| PRISM | 0.00 | 20.00 | prism diopters |
| ACC_R, ACC_L | + 0.00 | + 20.00 | diopters |
| HSA | 0.00 | 18.00 | mm |
| PD_R, PD_L | 24.0 | 40.0 | mm |
| PD_G | 48.0 | 80.0 | mm |
| BLUR | 0.00 | 20.00 | prism diopters |
| VIS_S, VIS_C | 0.032 | 2.0 | Decimal |
| PATNAME, PAT_ID | 0 | 32 | characters |
Input messages can be mapped to different internal datasets. The fourth line of an input message indicates the source:
| Code | Instrument type | Refractor 900 dataset |
|---|---|---|
| AR | Refractometer/Keratometer | AR |
| LM | Lensometer | LM |
| CO | Computer/Other | Prev. Ref. |
The Refractor 900 provides visual acuity results through the fields VIS_S_x (without correction) and VIS_C_x (with correction).
Values are transmitted using a decimal numeric encoding format with two decimals (e.g., 0.80, 1.00). This encoding format is independent of the visual acuity scale selected on the device.
If the device is configured to output Snellen notation, only the denominator is transmitted as xxx.xx, which must be interpreted by the EMR as 20/xxx.xx.
⚠️ NOTE — Terminology clarification
The word “decimal” is used in two distinct ways in this documentation.
Visual Acuity Scale (device setting): Decimal, logMAR, or Snellen (20/xx).
Data Encoding Format (protocol output): a numeric value with two decimals (xxx.xx).
If the scale is Snellen, only the denominator is transmitted asxxx.xxand must be interpreted as20/xxx.xxby the EMR.
Examples: Snellen 20/25 → transmitted as25.00; Snellen 20/40 → transmitted as40.00.
| Decimal | 0.032 | 0.04 | 0.05 | 0.063 | 0.08 | 0.10 | 0.125 | 0.16 | 0.20 | 0.25 | 0.32 | 0.40 | 0.50 | 0.63 | 0.80 | 1.00 | 1.25 | 1.60 | 2.00 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Snellen | 20/630 | 20/500 | 20/400 | 20/320 | 20/250 | 20/200 | 20/160 | 20/125 | 20/100 | 20/80 | 20/63 | 20/50 | 20/40 | 20/32 | 20/25 | 20/20 | 20/16 | 20/12.5 | 20/10 |
| LogMar | 1.5 | 1.4 | 1.3 | 1.2 | 1.1 | 1.0 | 0.9 | 0.8 | 0.7 | 0.6 | 0.5 | 0.4 | 0.3 | 0.2 | 0.1 | 0.0 | -0.1 | -0.2 | -0.3 |