📄 uart.lst
字号:
185 2 SPIbuf[7]=EOT; // 结束
186 2
187 2 COMENABLE; // 允许串口中断
188 2 Dir=1; // 485发送
189 2 time_out=10; // 100ms完成发送
190 2 trans_ctr=0;
191 2 trans_size=8;
192 2 SBUF=SPIbuf[0]; // 发送
193 2 comm_ok=TRUE; // 串口通信正常
194 2 while(trans_size)
195 2 {
196 3 if(time_out==0)
197 3 {
198 4 comm_ok=FALSE; // 串口通信失败
199 4 break;
200 4 }
201 3 } // 直到数据传输完毕
202 2 Dir=0; // 关闭485发送
203 2 }
204 1 else
205 1 {
206 2 trans_ctr=0;
207 2 checksum=0;
208 2 trans_buf[trans_ctr]=SOH;
209 2 checksum+=trans_buf[trans_ctr];
210 2 trans_ctr++;
211 2 trans_buf[trans_ctr]=haddr; // 源地址
212 2 checksum+=trans_buf[trans_ctr];
213 2 trans_ctr++;
214 2 trans_buf[trans_ctr]=laddr;
215 2 checksum+=trans_buf[trans_ctr];
216 2 trans_ctr++;
217 2 trans_buf[trans_ctr]='0'; // 目标地址
218 2 checksum+=trans_buf[trans_ctr];
219 2 trans_ctr++;
220 2 trans_buf[trans_ctr]='0';
221 2 checksum+=trans_buf[trans_ctr];
222 2 trans_ctr++;
223 2 trans_buf[trans_ctr]='0'; // 信息号
224 2 checksum+=trans_buf[trans_ctr];
225 2 trans_ctr++;
226 2
227 2 switch(message)
228 2 {
229 3 case ACK:
230 3 trans_buf[trans_ctr++]=ACK;
231 3 break;
232 3 case NAK:
233 3 trans_buf[trans_ctr++]=NAK;
234 3 break;
235 3 case RTL:
236 3 trans_buf[trans_ctr]=STX;
237 3 checksum+=trans_buf[trans_ctr];
238 3 trans_ctr++;
239 3
240 3 for(i=0; i<MAX_REALREC_SIZE;i++) // 发送实时记录
241 3 {
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 5
242 4 trans_buf[trans_ctr]=RTrecord[i];
243 4 checksum+=trans_buf[trans_ctr];
244 4 trans_ctr++;
245 4 }
246 3
247 3 trans_buf[trans_ctr]=ETX;
248 3 checksum+=trans_buf[trans_ctr];
249 3 trans_ctr++;
250 3
251 3 checksum=~checksum+1; // 计算校验和
252 3
253 3 temp=(checksum&0xF0)>>4;
254 3 trans_buf[trans_ctr]=Hex_ascii(temp);
255 3 trans_ctr++;
256 3
257 3 temp=checksum&0x0F;
258 3 trans_buf[trans_ctr]=Hex_ascii(temp);
259 3 trans_ctr++;
260 3 break;
261 3 default:
262 3 break;
263 3 }
264 2
265 2 trans_buf[trans_ctr++]=EOT;
266 2
267 2 COMENABLE; // 允许串口中断
268 2 Dir=1; // 485发送
269 2 trans_size=trans_ctr;
270 2 trans_ctr=0;
271 2 SBUF=trans_buf[0];
272 2 time_out=200; // 200ms发送完毕
273 2 comm_ok=TRUE; // 通信正常
274 2 while(trans_size)
275 2 {
276 3 if(time_out==0)
277 3 {
278 4 comm_ok=FALSE; // 通信失败
279 4 break;
280 4 }
281 3 } // 直到数据传输完毕
282 2 Dir=0; // 关闭485发送
283 2 }
284 1
285 1 ClearRcvBuf(); // 清接收缓冲区
286 1 }
287
288 ///////////////////////////////////////////////////////////////////////////////
289 // 读取并分析接收缓冲区数据
290 ///////////////////////////////////////////////////////////////////////////////
291 uchar readbuf()
292 {
293 1 idata uchar curstate; // 当前信息类别
294 1 idata uchar nextstate; // 下一个信息类别
295 1 idata uchar temp;
296 1 idata uint i;
297 1 idata uint strindex;
298 1 bdata bit endofmessage; // 数据包是否结束
299 1 bdata bit errordect; // 是否有错误检测到
300 1 bdata bit wrongaddr; // 地址是否错误
301 1
302 1 curstate=STATE_SOH; // 当前信息状态
303 1 nextstate=STATE_SOH; // 下一个信息状态
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 6
304 1
305 1 i=SOH_crt; // 数据指针索引
306 1 strindex=0; // 命令体数据指针索引
307 1 errordect=FALSE;
308 1 wrongaddr=FALSE;
309 1 endofmessage=FALSE;
310 1
311 1 checksum=0; // 校验和
312 1 testchecksum=0;
313 1
314 1 while (TRUE)
315 1 {
316 2 curstate=nextstate; // 当前状态从SOH开始
317 2
318 2 switch(curstate)
319 2 {
320 3 case STATE_SOH:
321 3 if(maxtrans)
322 3 temp=SPIbuf[i];
323 3 else
324 3 temp=recv_buf[i];
325 3
326 3 if(temp!=SOH)
327 3 {
328 4 errordect=TRUE; // 有错误检测到
329 4 }
330 3 else
331 3 {
332 4 checksum+=SOH;
333 4 nextstate=STATE_SRC_ADDR; // 检查源地址
334 4
335 4 i++; // 数据指针下移
336 4 }
337 3 break;
338 3 case STATE_SRC_ADDR:
339 3 if(maxtrans)
340 3 temp=SPIbuf[i];
341 3 else
342 3 temp=recv_buf[i];
343 3
344 3 checksum+=temp; // 源地址为00
345 3 if(temp!='0')
346 3 wrongaddr=TRUE; // 源地址错误
347 3 else
348 3 {
349 4 i++; // 数据指针下移
350 4
351 4 if(maxtrans)
352 4 temp=SPIbuf[i];
353 4 else
354 4 temp=recv_buf[i];
355 4 checksum+=temp;
356 4
357 4 if(temp!='0')
358 4 wrongaddr=TRUE; // 源地址错误
359 4
360 4 i++; // 数据指针下移
361 4 }
362 3 nextstate=STATE_DST_ADDR; // 检查目标地址
363 3 break;
364 3 case STATE_DST_ADDR:
365 3 if(maxtrans)
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 7
366 3 temp=SPIbuf[i];
367 3 else
368 3 temp=recv_buf[i];
369 3 checksum+=temp;
370 3
371 3 if(temp!=haddr) // 地址高位
372 3 wrongaddr=TRUE; // 地址错误
373 3 else
374 3 {
375 4 i++; // 数据指针下移
376 4 if(maxtrans)
377 4 temp=SPIbuf[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -