Newer
Older
DStat communications protocol
Lines replied starting with '#' are human-readable info messages that should be logged
Lines replied starting with '@' are status codes from the DStat
The DStat can be restarted by simply disconnecting from the virtual serial port.
Disconnecting and reconnecting will return the DStat to the root command menu.
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
Send '!' - Other characters sent first will not produce a response
Send number of characters in command to follow (0–65535)
DStat will reply '@ACK %u\n' where %u is the number of characters requested.
If 0, DStat will reply '@RCV 0 \n' immediately (Can use to check if DStat is communicating properly)
Send command and arguments (see below), terminated by '\n' (use spaces not \n to separate arguments)
DStat will reply '@RCV %u\n' where %u is the number of characters read and then '#%s\n' where %s is the command string received
If there is a problem reading the string, the DStat will reply '@ERR' instead followed by a message
Some commands require additional parameters:
If so, DStat will send '@RQP %u\n' where %u is the number of parameters expected.
Send the parameters one at a time.
DStat will reply `@RCVC %\n' where % is the parameter just sent.
If there's an error, DStat will reply `@RCVE\n', and will wait for the last parameter to be resent.
When all parameters have been sent, DStat will reply '@RCP %u\n' where %u is the number of parameters received.
All commands terminate by replying '@DONE\n'
Main Command menu - single letter commands :
Restart USB Stack:
*Will disconnect USB device from computer and need to be reenumerated*
Send 'R'
Check Version:
Send 'V'
DStat will return a string containing the PCB version and firmware git revision:
"V%u.%u.%u-%lu\n", BOARD_VER_MAJOR, BOARD_VER_MINOR, BOARD_VER_MICRO, GIT_COMMIT
*GIT_COMMIT is in decimal, not hex*
Perform Experiment:
Send 'E'
Send one of the commands below:
Experiments can be aborted while running by sending 'a'
Results are returned in ADC/DAC units:
For voltages (potentiometry experiments): Volts = adc_code/(adc_PGA_gain/2)*(1.5/8388607.)
For currents: Amps = (adc_code/(adc_PGA_gain/2))*(1.5/iv_gain/8388607)
adc_PGA_gain: the PGA gain setting of the ADC. Normal setting is 2x (±1.5 V full-scale)
iv_gain: the gain of the transimpedance amplifier in ohms
For voltages (voltammetry): Volts = (dac_code-32768)*3./65536
ADC setting
Send 'A'
Send "%hhx%hhx%hhx" - ADS Buffer/Rate/PGA value
Gain setting
Send 'G'
Send "%u" - gain value
#define POT_GAIN_0 0
#define POT_GAIN_100 1
#define POT_GAIN_3k 2
#define POT_GAIN_30k 3
#define POT_GAIN_300k 4
#define POT_GAIN_3M 5
#define POT_GAIN_30M 6
#define POT_GAIN_100M 7
Chronoamperometry
Send 'R'
Send '%hhu%hhu' - number of potential steps, 0 (Sets up light sensor for custom box if > 0)
DStat will request voltage and time steps: '@RQP %u\n' where %u is 2 * number of steps
Send a list of voltage steps according to additional parameter protocol above.
Send a list of time steps according to additional parameter protocol above.
DStat will reply '@RCP %u\n' when done where %u is 2 * number of steps.
Replies continuously with data:
Each point:
"B\n" followed by (in binary, not text) uint16 seconds, uint16 milliseconds, int32 current, then "\n"
End of experiment:
"D\n"
Linear Sweep Voltammetry
Send 'L'
Send "%u%u%i%i%i%i%u" - t_preconditioning1, t_preconditioning2, v_preconditioning1,
v_preconditioning2, start, stop, slope
Replies continuously with data after preconditioning time:
Each point:
"B\n" followed by uint16 voltage and int32 current, then "\n"
Cyclic Voltammetry
Send 'C'
Send "%u%u%i%i%i%i%i%hhu%u" - t_preconditioning1, t_preconditioning2,
v_preconditioning1, v_preconditioning2, v1, v2, start,
number of scans, slope
Replies continuously with data after preconditioning time:
Each point:
"B\n" followed by uint16 voltage and int32 current, then "\n"
End of each scan:
"S\n"
End of experiment:
"D\n"
Square Wave Voltammetry
Send 'S'
Send "%u%u%i%i%i%i%u%u%u%u" - t_preconditioning1, t_preconditioning2,
v_preconditioning1, v_preconditioning2, start, stop,
step size, pulse_height, frequency, scans
Replies continuously with data after preconditioning time:
Each point:
"B\n" followed by uint16 voltage, int32 forward_current,
int32 reverse_current, then "\n"
End of each scan:
"S\n"
End of experiment:
"D\n"
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
Differential Pulse Voltammetry
Send 'S'
Send "%u%u%i%i%i%i%u%u%u%u" - t_preconditioning1, t_preconditioning2,
v_preconditioning1, v_preconditioning2, start, stop,
step size, pulse_height, period, width
Replies continuously with data after preconditioning time:
Each point:
"B\n" followed by uint16 voltage, int32 forward_current,
int32 reverse_current, then "\n"
End of each scan:
"S\n"
End of experiment:
"D\n"
Potentiometry:
Send 'P'
Send '%u%hhu'
Measurement time in s (if 0, can only be stopped with abort signal)
Mode: 0 for OCP (WE is connected)/1 for potentiometry (WE input disconnected)
Replies continuously with data after preconditioning time:
Each point:
"B\n" followed by (in binary, not text) uint16 seconds, uint16 milliseconds, int32 voltage, then "\n"
End of experiment:
"D\n"
Settings:
Send 'S'
Send one of the commands below:
Restore settings to defaults:
Send 'D'
Enter firmware update mode (DFU):
Send 'F'
Read settings from EEPROM:
If no settings are present, defaults will be loaded.
Send 'R'
DStat will print settings first in human readable form prefixed by '#'
DStat will print a single string containing settings:
e.g. "Smax5443_offset.%u:tcs_enabled.%u:tcs_clear_threshold.%u:r100_trim.%i:r3k_trim.%i:r30k_trim.%i:r300k_trim.%i:r3M_trim.%i:r30M_trim.%i:r100M_trim.%i\n"
- Starts with 'S'
- A series of key/value pairs where the key is a string, the key and value are separated with '.' and different pairs are separated with ':'
- Ends with '\n'
*Be sure to preserve the order of key/value pairs as they must be entered in the correct order when writing new settings*
Write settings to EEPROM:
Send 'W'
Send a list of the new settings values separated and terminated by a space, *in the same order as read with the R command*
Example of a SWV experiment:
Set ADC settings (Info strings not shown):
Computer !9\n Request to send 9 byte command
DStat @ACK 9\n Clear to send command
C EA2 A1 1 \n PGA 2x, sample rate 1 kHz, Input buffer on
D @RCV 9\n Received 9 byte command
D @DONE\n Command completed
Set Gain:
C !6\n Request to send 6 byte command
D @ACK 6\n Clear to send command
C EG2 0 \n Set gain to 3 kΩ
D @RCV 6\n Received 6 byte command
D @DONE\n Command completed
Start SWV experiment:
C !41\n Request to send 41 byte command
D @ACK 41\n Clear to send command
C ES10 10 50244 10922 -1000 -300 3 20 30 0 \n 10 s clean @ 800 mV, 10 s deposition @ -1000 mV,
Start -1000 mV, Stop -300 mV, Step size 3 mV,
Pulse Height 20 mV, Frequency 30 Hz, No cyclic mode (scans=0)
D @RCV 41\n Received 6 byte command
Data output:
D B\n A datapoint follows (length depends on experiment type)
D *10 bytes of binary data* uint16 voltage, int32 forward current, int32 reverse current
D \n
.
.
.
D D\n Data output finished
D @DONE\n Command completed