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)); //把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.本次实验也提醒我们要多多尝试不同的方法,不能只盯着一个方法。