5 memory considerations – Campbell Scientific CR3000 Micrologger User Manual
Page 214

Section 7. Installation
214
Example (humidity, temperature, and pressure sensor):
SerialInString
= "RH= 60.5 %RH T= 23.7 °C Tdf= 15.6 °C Td=
15.6 °C a= 13.0 g/m3 x= 11.1 g/kg Tw= 18.5 °C H2O=
17889 ppmV pw=17.81 hPa pws 29.43 hPa h= 52.3 kJ/kg dT=
8.1 °C"
• Hex Pairs: Bytes are translated to hex pairs, consisting of digits 0 - 9 and
letters a - f. Each pair describes a hexadecimal ASCII / ANSI code. Some
codes translate to alpha-numeric values, others to symbols or non-printable
control characters.
Example (temperature sensor):
SerialInString
= "23 30 31 38 34 0D",
which translates to:
#01 84 cr
• Binary: Bytes are processed on a bit-by-bit basis. Character 0 (Null, &b00) is
a valid part of binary data streams. However, the CR3000 uses Null
terminated strings, so anytime a Null is received, a string is terminated. The
termination is usually premature when reading binary data. To remedy this
problem, the SerialInBlock() or SerialInRecord() instruction is required
when reading binary data from the serial port buffer to a variable. The
variable must be an array set As Long data type, as in,
Dim
SerialInString
As Long
7.8.8.5.5 Memory Considerations
Several points regarding memory should be considered when receiving and
processing serial data.
• Serial buffer: The serial port buffer, which is declared in the SerialOpen()
instruction, must be large enough to hold all the data a device will send. The
buffer holds the data for subsequent transfer to variables. Allocate extra
memory to the buffer when needed, but recognize that added memory to the
buffer reduces memory available for long term data storage.
Note SerialInRecord() running in pipeline mode, with the number of bytes
parameter = 0. For the digital measurement sequence to know how much room to
allocate in the Scan() instruction
buffers
(default of 3), SerialInRecord() has to
allocate itself the buffer size specified by SerialOpen() (default 10,000, an
overkill), or default 3*10,000 = 30 kB of buffer space. So, while making sure
enough bytes are allocated in SerialOpen() (the number of bytes per record *
((records/Scan)+1) + at least one extra byte), there is reason not to make the
buffer size too large. (Note that if the
NumberOfBytes
parameter is non-zero, then
SerialInRecord() needs to allocate itself only this many bytes instead of the
number of bytes specified by SerialOpen()).
• Variable declarations: Variables used to receive data from the serial buffer
can be declared as Public or Dim. Declaring variables as Dim has the effect
of consuming less telecommunications bandwidth. When public variables are
viewed in software, the entire Public table is transferred at the update
interval. If the Public table is large, telecommunications bandwidth can be
taxed such that other data tables are not collected.