📄 test.lst
字号:
250 //发送程序后台部分同样会受影响,但由于此时后台发送肯定是空闲,所以忽略影响.
251 //所以,调用原则是:发送时要确认发送与接收已全部停止
252 unsigned char send_package(package_t *package){
253 1 unsigned char check_sum;
254 1 unsigned char len;
255 1 unsigned char *p;
256 1
257 1 package->head.package_len = W_BUF_LEN;//目前是将数据包长度定死,设包长的目的是为了将来扩展.
258 1
259 1 len = package->head.package_len; //为将来而设.今后发送包长可能在进放该函数前设定.
260 1 if (len == 0)
261 1 return ERROR_SEND_NULL;
262 1
263 1 //填写报文头
264 1 package->head.source_id = this_node_id;
265 1
266 1 //计算校验和,计算完后,报文所有字节(包括报文头)之和应为0
267 1 package->head->check_sum = 0;
268 1 check_sum = 0;
269 1 p = (unsigned char*)package;
270 1 do{
271 2 check_sum += *p;
272 2 p++;
273 2 }while(--len);
274 1 package->head->check_sum = ~check_sum;
275 1
276 1 //发送
277 1 START_SEND();
278 1
279 1 while(!send_over)
280 1 w_send();
281 1
282 1 return 0;
283 1 }
284
285 //由于计算校验合会占用大量时间,因此在调用该函数时发送程序后台部分会受影响,可能造成正在发送的数据报文时序错
-乱.
286 //接收程序后台部分同样会受影响,但由于此时后台接收肯定是已经完成的状态,所以忽略影响.
287 //所以,调用原则是:发送时要确认发送程序已停止
288 unsigned char recv_package(package_t *package){
289 1 unsigned char check_sum;
290 1 unsigned char len;
291 1 unsigned char *p;
292 1
293 1 if (len == 0)
294 1 return ERROR_RECV_NULL;
295 1
296 1 //计算校验和
297 1 len = package->head.package_len;
298 1 check_sum = 0;
299 1 p = (unsigned char*)package;
C51 COMPILER V7.20 TEST 11/06/2004 03:55:45 PAGE 6
300 1 do{
301 2 check_sum += *p;
302 2 p++;
303 2 }while(--len);
304 1 if(check_sum)
305 1 return ERROR_RECV_CHECKSUM;
306 1
307 1 return 0;
308 1 }
309
310 void sys_thread(){
311 1 if(!recv_over)
312 1 w_recv();
313 1 //后面加上键盘扫描等驱动程序,但所有代码执行最长时间不得高于100微秒
314 1 }
315
316 typedef struct command_s{
317 unsigned char command_id;
318 unsigned char command_data[1];
319 }command_t;
320
321 #define GET_DEVICE_STATUS 0x11 //读取节点控制器所控制的设备的参数
322 #define SET_DEVICE_STATUS 0x12 //设置节点控制器所控制的设备的参数
323 #define GET_NODE_STATUS 0x13 //读取节点控制器自身参数
324 #define SET_NODE_STATUS 0x14 //设置节点控制器自身参数
325
326 #define ERROR_COMMAND_INVAILED 0x11 //错误的命令码
327
328 typedef struct device_ctl_s{
329 unsigned char device_id;
330 unsigned char device_status;
331 }device_ctl_t;
332
333 unsigned char command_process(package_t *package){
334 1 command_t *command = (command_t *)(package->package_data);
335 1
336 1 switch(command->command_id){
337 2 case GET_DEVICE_STATUS:
338 2 package->head.target_id = package->head.source_id;
339 2 send_package(package);
340 2 break;
341 2 case GET_NODE_STATUS:
342 2 package->head.target_id = package->head.source_id;
343 2 send_package(package);
344 2 break;
345 2 case SET_DEVICE_STATUS:
346 2 package->head.target_id = 0xbb;
347 2 send_package(package);
348 2 START_RECV();//数据包处理完成,重新开启接收程序
349 2 break;
350 2 case SET_NODE_STATUS:
351 2 package->head.target_id = 0xcc;
352 2 send_package(package);
353 2 break;
354 2 default:
355 2 // START_RECV();//数据包处理完成,重新开启接收程序
356 2 package->head.target_id = 0xdd;
357 2 send_package(package);
358 2 START_RECV();//数据包处理完成,重新开启接收程序
359 2 return ERROR_COMMAND_INVAILED;
360 2 }
361 1
C51 COMPILER V7.20 TEST 11/06/2004 03:55:45 PAGE 7
362 1 START_RECV();//数据包处理完成,重新开启接收程序
363 1
364 1 return 0;
365 1 }
366
367 #if 1
368 void sleep(unsigned int time_out){
369 1 unsigned int time=jiffies;
370 1 unsigned char n=0;
371 1 do{
372 2 ;
373 2 }while(jiffies-time < time_out);
374 1 return;
375 1 }
376
377 void send_test(){
378 1 unsigned char device_id, device_status;
379 1 package_t *package = w_buf;
380 1 command_t *command = package->package_data;
381 1 device_ctl_t *device_ctl = command->command_data;
382 1 this_node_id = 0x20;
383 1
384 1 while(1){
385 2 for(device_id=0; device_id<2; device_id++){
386 3 for(device_status=0; device_status<2; device_status++){
387 4 STOP_RECV();
388 4 memset(package, 0, W_BUF_LEN);
389 4 package->head.target_id = 0x30;
390 4 command->command_id = SET_DEVICE_STATUS;
391 4 device_ctl->device_id=device_id;
392 4 device_ctl->device_status=device_status;
393 4 send_package(package);
394 4 START_RECV();
395 4 sleep(20000);
396 4 }
397 3 }
398 2 }
399 1 }
400
401 void recv_test(){
402 1 this_node_id = 0x30;
403 1 while(1){
404 2 unsigned char i;
405 2 START_RECV();//数据包处理完成,重新开启接收程序
406 2 while(!recv_over)//等待数据包
407 2 sys_thread();
408 2 for(i=0; i<W_BUF_LEN; i++)
409 2 serial_out(w_buf[i]);
410 2 }
411 1 }
412
413 #endif
414
415 #if 0 //中央控制器
void main(){
sys_init();
while(1){
unsigned char scmd;
sys_thread();
if(recv_over){
unsigned char i;
C51 COMPILER V7.20 TEST 11/06/2004 03:55:45 PAGE 8
for(i=0; i<W_BUF_LEN; i++)
serial_out(w_buf[i]);
START_RECV();
}
if(RI && wait_serial(&scmd, 1, 0) == 0){//串口命令处理程序
switch(scmd){
case 'f':{ //fill w_buf and send
unsigned char ret, len;
STOP_RECV();//停止接收,因为接收与发送是共用缓冲区,运行接收会干扰缓冲区.
if(wait_serial(&len, 1, 1000))
break;
if(wait_serial(w_buf, len, 1000))
break;
ret = send_package((package_t *)w_buf);
serial_out(ret);
break;
}
case 'g':{ //get w_buf
unsigned char len = W_BUF_LEN;
unsigned char *p = w_buf;
if(recv_over){
do {
serial_out(*p);//将数据传给主机
p++;
}while(--len);
}else{
serial_out(ERROR_RECV_EMPTY);//目前缓冲区内空,无数据可取
}
break;
}
}
START_RECV();
}
}
}
#else //节点
465
466 void main(){
467 1 sys_init();
468 1
469 1 while(1){
470 2 unsigned char ret;
471 2 package_t *package = (package_t*)w_buf;
472 2 while(!recv_over)//等待数据包
473 2 sys_thread();
474 2
475 2 //sleep(3000);
476 2 send_package(package);
477 2 START_RECV();//数据包处理完成,重新开启接收程序
478 2 continue;
479 2
480 2 ret = recv_package((package_t*)w_buf);//处理接收到的数据包,包括检查数据包的正确性
481 2
482 2 if(ret){
483 3 package_t *package = (package_t*)w_buf;
484 3 START_RECV();//数据包处理完成,重新开启接收程序
485 3 package->head.target_id = 0xaa;
C51 COMPILER V7.20 TEST 11/06/2004 03:55:45 PAGE 9
486 3 send_package(package);
487 3 START_RECV();//数据包处理完成,重新开启接收程序
488 3 }else{
489 3 ret = command_process((package_t*)w_buf);
490 3 }
491 2 }
492 1 }
493 #endif
494
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1048 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 39 34
IDATA SIZE = ---- ----
BIT SIZE = 4 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -