@@ -73,7 +73,7 @@ func SerialSend(data []byte) error {
73
73
}
74
74
75
75
func SerialReceive () ([]byte , error ) {
76
- buff := make ([]byte , 160 )
76
+ buff := make ([]byte , 200 )
77
77
n , err := MySerialPort .Read (buff )
78
78
if err != nil {
79
79
return nil , err
@@ -103,62 +103,92 @@ func SerialSendCmd(act uint8, variable datapack.VariableT) error {
103
103
return errors .New ("No serial port" )
104
104
}
105
105
106
- func SerialParse (jsonString chan string ) {
107
- var b []byte
106
+ func verifyBuff (buff []byte ) (int , []byte ) {
107
+ log .Println (buff )
108
+ if len (buff ) < 19 {
109
+ log .Println ("Data pack too short" )
110
+ return 0 , nil
111
+ }
112
+ if buff [0 ] == datapack .BOARD_1 && buff [1 ] == datapack .ACT_SUBSCRIBERETURN && len (buff )% 20 == 0 {
113
+ return len (buff ) / 20 , buff
114
+ }
115
+ b1 := buff [:]
116
+ b2 := buff [:]
117
+ for i , v := range buff {
118
+ if v == datapack .BOARD_1 && len (buff [i :]) > 19 && buff [i + 1 ] == datapack .ACT_SUBSCRIBERETURN {
119
+ b1 = b1 [i :]
120
+ break
121
+ }
122
+ }
123
+ for i := len (b1 ) - 1 ; i > 18 ; i -- {
124
+ if b1 [i ] == 10 {
125
+ b2 = b1 [:i + 1 ]
126
+ if len (b2 )% 20 == 0 {
127
+ log .Println ("Get!" )
128
+ return len (b2 ) / 20 , b2
129
+ }
130
+ b2 = b1 [:]
131
+ }
132
+ }
133
+ log .Println ("Cannot verify data pack" )
134
+ return 0 , nil
135
+ }
136
+
137
+ func praseBuff (raw []byte ) []byte {
138
+ var chartPack datapack.DataToChart
139
+ var chartData datapack.DataToChartT
140
+ packNum , buff := verifyBuff (raw )
141
+ for i := 0 ; i < packNum ; i ++ {
142
+ chartData .Board = buff [i * 20 ]
143
+ chartData .Tick = datapack .BytesToUint32 (buff [i * 20 + 15 : i * 20 + 19 ])
144
+ addr := datapack .BytesToUint32 (buff [i * 20 + 3 : i * 20 + 7 ])
145
+ for _ , v := range datapack .CurrentVariables .Variables {
146
+ if v .Addr == addr {
147
+ chartData .Name = v .Name
148
+ switch v .Type {
149
+ case "uint8_t" :
150
+ chartData .Data = float64 (datapack .BytesToUint8 (buff [i * 20 + 7 : i * 20 + 15 ]))
151
+ case "uint20_t" :
152
+ chartData .Data = float64 (datapack .BytesToUint16 (buff [i * 20 + 7 : i * 20 + 15 ]))
153
+ case "uint32_t" :
154
+ chartData .Data = float64 (datapack .BytesToUint32 (buff [i * 20 + 7 : i * 20 + 15 ]))
155
+ case "uint64_t" :
156
+ chartData .Data = float64 (datapack .BytesToUint64 (buff [i * 20 + 7 : i * 20 + 15 ]))
157
+ case "int8_t" :
158
+ chartData .Data = float64 (datapack .BytesToInt8 (buff [i * 20 + 7 : i * 20 + 15 ]))
159
+ case "int20_t" :
160
+ chartData .Data = float64 (datapack .BytesToInt16 (buff [i * 20 + 7 : i * 20 + 15 ]))
161
+ case "int32_t" , "int" :
162
+ chartData .Data = float64 (datapack .BytesToInt32 (buff [i * 20 + 7 : i * 20 + 15 ]))
163
+ case "int64_t" :
164
+ chartData .Data = float64 (datapack .BytesToInt64 (buff [i * 20 + 7 : i * 20 + 15 ]))
165
+ case "float" :
166
+ chartData .Data = float64 (datapack .BytesToFloat32 (buff [i * 20 + 7 : i * 20 + 15 ]))
167
+ case "double" :
168
+ chartData .Data = float64 (datapack .BytesToFloat64 (buff [i * 20 + 7 : i * 20 + 15 ]))
169
+ default :
170
+ chartData .Data = 0
171
+ }
172
+ }
173
+ }
174
+ chartPack .DataPack = append (chartPack .DataPack , chartData )
175
+ b , err := json .Marshal (chartPack )
176
+ if err != nil {
177
+ log .Fatalln (err )
178
+ }
179
+ return b
180
+ }
181
+ return nil
182
+ }
183
+
184
+ func SerialThread (jsonString chan string ) {
108
185
for {
109
186
if MySerialPort != nil && CurrentSerialPort .Name != "" {
110
- var chartPack datapack.DataToChart
111
- var chartData datapack.DataToChartT
112
187
buff , err := SerialReceive ()
113
188
if err != nil {
114
189
log .Println ("Fail: Can't receive serial data" )
115
190
}
116
- if len (buff )% 16 != 0 {
117
- log .Println ("Invalid data length" )
118
- }
119
- packNum := len (buff ) / 16
120
- for i := 0 ; i < packNum ; i ++ {
121
- if buff [i * 16 + 1 ] == datapack .ACT_SUBSCRIBERETURN {
122
- chartData .Board = buff [i * 16 ]
123
- addr := datapack .BytesToUint32 (buff [i * 16 + 3 : i * 16 + 7 ])
124
- for _ , v := range datapack .CurrentVariables .Variables {
125
- if v .Addr == addr {
126
- chartData .Name = v .Name
127
- switch v .Type {
128
- case "uint8_t" :
129
- chartData .Data = float64 (datapack .BytesToUint8 (buff [i * 16 + 7 : i * 16 + 15 ]))
130
- case "uint16_t" :
131
- chartData .Data = float64 (datapack .BytesToUint16 (buff [i * 16 + 7 : i * 16 + 15 ]))
132
- case "uint32_t" :
133
- chartData .Data = float64 (datapack .BytesToUint32 (buff [i * 16 + 7 : i * 16 + 15 ]))
134
- case "uint64_t" :
135
- chartData .Data = float64 (datapack .BytesToUint64 (buff [i * 16 + 7 : i * 16 + 15 ]))
136
- case "int8_t" :
137
- chartData .Data = float64 (datapack .BytesToInt8 (buff [i * 16 + 7 : i * 16 + 15 ]))
138
- case "int16_t" :
139
- chartData .Data = float64 (datapack .BytesToInt16 (buff [i * 16 + 7 : i * 16 + 15 ]))
140
- case "int32_t" , "int" :
141
- chartData .Data = float64 (datapack .BytesToInt32 (buff [i * 16 + 7 : i * 16 + 15 ]))
142
- case "int64_t" :
143
- chartData .Data = float64 (datapack .BytesToInt64 (buff [i * 16 + 7 : i * 16 + 15 ]))
144
- case "float" :
145
- chartData .Data = float64 (datapack .BytesToFloat32 (buff [i * 16 + 7 : i * 16 + 15 ]))
146
- case "double" :
147
- chartData .Data = float64 (datapack .BytesToFloat64 (buff [i * 16 + 7 : i * 16 + 15 ]))
148
- default :
149
- chartData .Data = 0
150
- }
151
- }
152
- }
153
- chartPack .DataPack = append (chartPack .DataPack , chartData )
154
- b , err = json .Marshal (chartPack )
155
- if err != nil {
156
- log .Fatalln (err )
157
- }
158
- } else {
159
- log .Println ("Invalid data pack" )
160
- }
161
- }
191
+ b := praseBuff (buff )
162
192
jsonString <- string (b )
163
193
}
164
194
time .Sleep (9 * time .Millisecond )
0 commit comments