B级任务:双机评分
一.任务要求
使用两块STC板分别下载上一节所提供的.hex文件,搭建485双机通信电路,在Linux中编程实现打分程序代码。
二.任务步骤
1.阅读程序系统流程框图,明确双机通信的功能需求。
2.熟悉上一节中模拟MODBUS协议的数据包结构,相关功能码及附加数据定义协议中的检验字节,本打分系统采用累加和编码。
3.回顾485总线数据收发实验,搭建双机通信电路。参考上一节内容确保STC从机编号和评分设定完成后,按下KEY2、KEY3按键标志,第1位和第8位LED灯被点亮。
4.PC端串口设置如下:
串口波特率:9600 数据位:8位 校验位:无 停止位:1
5.所编写的PC端程序应参考上一节中的通信协议完成一次完整的评分过程:
(1)需要包含串口的设置
(2)主节点发起从机检测过程:发送指定从机编号正常检测数据包,判断回应查询数据包是否符合上一节中的通信协议。
(3)主机获取从机评分过程:发送指定从机评分相关数据包,判断回应查询数据包是否符合上一节中的通信协议。
(4)主机发起结束评分的过程,若复位成功,STC从机上第1位和第8位LED灯会熄灭。
(5)展示串口相关信息,展示检测到的从机编号和从机的评分等。
三.实验代码
1.相关调用函数主要为老师在端口实验中所给出的代码,这里就不做过多解释。
2.相关变量定义
1 2 3 4 5 6 7 8 9 10 11 12
| unsigned char func_code1 = 0x03; unsigned char func_code2 = 0x08; unsigned char func_code3 = 0x10; unsigned char func_code4 = 0x01;
unsigned char addition_code1 = 0x6f; unsigned char addition_code2 = 0x5a; unsigned char addition_code3 = 0x00; unsigned char addition_code4 = 0x13;
unsigned char tmp[28] = {0}; int rl;
|
3.读入相关数据
1 2 3 4 5 6 7 8 9 10 11
| if (tmp_wirte[0] == 0) { printf("请输入你的码:\n");
for (i = 0; i < 4; i++) { scanf("%i", &tmp_wirte[i]); tmp_wirte[4] += (int)tmp_wirte[i]; } printf("第五位为:%02x\n", tmp_wirte[4]); }
|
4.剩余部分为根据相关代码进行发送接收
1 2 3 4 5 6 7 8 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
| write(fd, tmp_wirte, 5); bzero(tmp, sizeof(tmp)); ComRead(tmp, 5); if (tmp_wirte[2] == 8) { printf("主机检测从机是否正常相关数据包:\n"); int flag = 1; for (j = 0; j < 5; j++) { if (j == 0) printf("%02x", tmp[j]); else printf(" %02x", tmp[j]); if (tmp[j] != tmp_wirte[j]) { flag = 0; } } if (flag) tmp_wirte[0] = 0; else { printf("\n"); continue; } } if (tmp_wirte[2] == 3) { printf("主机获取从机评分相关数据包:");
for (j = 0; j < 5; j++) { if (j == 0) printf("%02x", tmp[j]); else printf(" %02x", tmp[j]); } } if (tmp_wirte[2] == 1) { printf("此轮评分结束相关数据包"); } if (tmp_wirte[2] == 4) { break; }
printf("\n\n"); }
close(epid); close(fd);
|
四.实验过程
1.将对应16进制文件下载到对应板子,并使用杜邦线将上位机与下位机相连
2.连接成功后,先使用串口助手尝试传输功能
3.然后将单片机连接到虚拟机上,运行对应函数,功能成功实现
五.实验总结
1.本次实验使用的代码语言为c语言,但由于我们对c语言的不熟悉给我们带来了很多的麻烦。例如16进制的输出需要使用02x占位;16进制数的累加需要直接相加而不能使用循环。这提醒我们要加强相关学习。
2.在数据传输时要传输多次才能成功接受一次,初步分析是杜邦线以及硬件间的连接不是特别紧密导致。
3.本次实验也提醒我们要多多尝试不同的方法,不能只盯着一个方法。