first commit

This commit is contained in:
2024-09-05 13:29:00 +08:00
commit 53515a5a50
75 changed files with 3863 additions and 0 deletions

View File

@@ -0,0 +1,410 @@
![cover](cover.png)
---
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验一二三的操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# **实验一** 环境搭建
## 1.1. 实验目的
安装必要的开发工具、烧写工具构建EnOcean模块开发环境以便进行模块开发及实验。
## 1.2. 工具/原料
- 计算机Windows操作系统
- IAR FOR ARM 7.20安装包
- TI-TM4C-SDK工具包
- DolphinView安装包
- J-link安装包
## 1.3. 实验步骤
实验一的实验步骤在实验指导书上非常详细,只需要按照配图和文字执行即可。因此我们在本实验报告中仅简单概括一下实验的步骤,并说明我们对每个步骤在本物联网项目中在架构与技术上的理解。
1. 安装IAR FOR ARM 7.20
IAR软件作为项目的IDE软件主要用于编写程序代码、搭建软件工程、调用JTAG工具烧写硬件以及进行DEBUG等。
2. 破解IAR软件
~~IAR软件是商业收费软件。~~
3. 安装SDK工具包
SDK工具包是使用软件驱动硬件的依赖文件是厂商设计的与硬件通信的接口由硬件制造厂商提供。
4. 重建SDK驱动程序库
为了使IAR能在新的安装路径中找到SDK驱动程序需要重建SDK驱动程序库。
在这个步骤我们遇到了困难。排查原因发现是由于项目文件路径含有中文字符导致。由于编译机器使用MinGW作为C语言编译器MinGW不支持中文路径。
5. 安装J-link驱动
J-link是PC机与物联网模块进行烧写和DEBUG等的工具。作为外接的额外硬件需要在PC机上安装J-link的驱动以实现让PC机调用J-link的接口进行控制。
6. 安装DolphinView软件
DolphinView软件能够与后面烧写的Sniffer进行联动显示EnOcean_Sniffer程序采集的数据包。
## 1.4. 实验结果
我们最后成功将实验环境配置完成。
## 1.5. 实验感想
通过此次实验我们对物联网系统开发流程有了更直观的了解。在配置开发环境过程中我们安装了IAR、JLink等开发和调试所需的软硬件工具并解决了编译链接和烧录时遇到的问题。这使我们对物联网设备固件的编译、烧录等开发过程有了直接的体会。
# 实验二 EnOcean Sniffer 实验
## 2.1. 实验目的
将一个易能森设备配置为嗅探器Sniffer抓取易能森通信数据包以便分析数据。
## 2.2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
## 2.3. 预备知识
1. Sniffer嗅探器是一种基于被动侦听原理的网络分析方式。使用这种技术方式可以监视网络的状态、数据流动情况以及网络上传输的信息。
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. 利用DolphinView 可以实现Sniffer的检测。
## **2.4**. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
void EnOceanUARTIntHandler(void) {
uint32_t ui32Ints; // 用于存储UART中断标志的变量
uint8_t data; // 用于存储接收到的数据字节
static uint8_t PacketHeader = 0; // 表示数据包头部的标志
static uint32_t PacketLen = 0; // 用于存储预期数据包长度的变量
//
// Get and clear the current interrupt source(s)
//
// 获取并清除当前的中断源
ui32Ints = ROM_UARTIntStatus(ENOCEAN_UART_BASE, true);
ROM_UARTIntClear(ENOCEAN_UART_BASE, ui32Ints); // 清除已处理的中断
//
// Handle receive interrupts.
//
// 处理接收中断。
if (ui32Ints & (UART_INT_RX | UART_INT_RT)) { // 检查RX FIFO非空或者超时中断是否发生
data = ROM_UARTCharGetNonBlocking(ENOCEAN_UART_BASE); // 从UART中读取一个字符
// 检查接收缓冲区是否有空间,并且数据包接收不在进行中
if (EnOceanRxCount < ENOCEAN_RX_BUFFER_SIZE && (!EnOceanTelegramRxflags)) {
EnOceanRxBuffer[EnOceanRxCount++] = data; // 将接收到的数据存储到缓冲区中
// 检查数据包头部是否已经被检测到
if (!PacketHeader) {
// 检查数据包的第一个字节是否是头部0x55
if (EnOceanRxBuffer[0] != 0x55) EnOceanRxCount = 0; // 如果头部不符合预期,重置缓冲区
else {
// 检查是否已经接收到6个字节头部 + 数据长度 + 校验和)
if (EnOceanRxCount == 6) {
// 使用接收到的数据计算预期的数据包长度
if (GetCheckSum(&EnOceanRxBuffer[1], 4) == EnOceanRxBuffer[5]) {
PacketLen = 7 + (EnOceanRxBuffer[1] << 8) + EnOceanRxBuffer[2] + EnOceanRxBuffer[3];
PacketHeader = 1; // 设置数据包头部标志
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0
} else {
EnOceanRxCount = 0; // 如果校验和验证失败,重置缓冲区
}
}
}
} else if (EnOceanRxCount == PacketLen) {
EnOceanTelegramRxflags = 1; // 设置表示完整数据包接收的标志
PacketHeader = 0; // 重置数据包头部标志
PacketLen = 0; // 重置预期数据包长度
}
} else {
// 如果缓冲区已满或者接收到无效的数据包,重置接收缓冲区和数据包头部信息
EnOceanRxCount = 0;
PacketHeader = 0;
PacketLen = 0;
}
}
}
```
## 2.5. 实验步骤
### 2.5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 2.5.2. 步骤二 加载工程文件
加载EnOcean_Sniffer工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.1EnOcean_Sniffer\IAR_Files”目录下的“EnOcean_Sniffer.eww”工程文件点击“打开”。
### 2.5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
在这里我们遇到了问题。在完成上述设置后,我们还是遇到了烧录错误,报错截图如下:
<img src="picture1.png" alt="picture1" style="zoom: 67%;" />
上网查阅资料后我们对比发现设置中的Interface默认为SWD但是我们实验使用的工具为JATG所以需要选择JATG。更改如下
<img src="picture2.png" alt="picture2" style="zoom:67%;" />
更改该选项之后,成功烧录程序。
**加载一位翘板开关工程Rocker_Switch工程**
点击工具栏的红叉退出调试拔掉下载EnOcean_Sniffe程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载1.4Rocker_Switch工程。
### 2.5.4. 步骤四 安装USB Serial Port
将下载EnOcean Sniffer程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电和传输数据。
在这里我们再次遇到了问题。
用一根micro USB线将OURS_EnOcean模块和PC机相连后PC机并没有如实验指导书所述弹出驱动安装提示窗口。且在设备管理器中可以看到PC机没有正确识别OURS_EnOcean设备如下图所示
<img src="picture3.png" alt="picture3" style="zoom:67%;" />
我们在网上查找新版本的设备驱动程序。将驱动程序版本从“TivaWare_C_Series-2.1.4.178”升级到了“TivaWare_C_Series-2.2.0.295”。在设备管理器右键设备->点击“属性”->点击“驱动程序”->点击“更新驱动程序”->点击“浏览我的电脑以查找驱动程序”->点击“浏览”->选择新驱动的安装目录->点击“确定”即可让PC机更新驱动。现在PC机能正确识别OURS_EnOcean设备了
<img src="picture4.png" alt="picture4" style="zoom:67%;" />
### 2.5.5. 步骤五 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Rocker_Switch工程的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Rocker_Switch工程的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
## 2.6. 实验结果
按下烧有Rocker_Switch工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。按下S4键数据包的Data为00按下S3键数据包的Data为10。
<img src="picture5.png" alt="picture5" style="zoom:67%;" />
在这个过程中我们将烧有Rocker_Switch工程的OURS-EnOcean模块脱离连接着Sniffer的PC机使用手机充电器供电也能在Sniffer上接收到Rocker_Switch的数据包这验证了数据包是无线传输的。
## 2.7. 实验感想
在Sniffer实验中我们通过串口抓取了EnOcean无线模块之间的通信数据包并在DolphinView可视化软件中查看。这帮助我们理解和掌握了Sniffer嗅探器的工作原理。同时阅读Sniffer源码也加深了我们对EnOcean通信协议和TM4C单片机串口通信的理解。
在实验过程中,我们学习到了解决实验问题的方法。当遇到困难时,我们会小组讨论分析问题原因,充分利用网络资源查阅相关资料,在助教的帮助下最终找到解决办法。这种经验对我们今后独立分析和解决问题具有重要的启示意义。
本次实验采用小组合作形式。通过分工协作,不仅提高了工作效率,也培养了我们的团队协作能力。今后我们会继续提升合作中各成员的配合水平。
# 实验三 EnOcean温度采集实验
## 3.1. 实验目的
学习易能森协议栈温度传感器采集Profile模拟一个温度数据以温度采集Profile发送出去利用Sniffer进行抓包。
## 3.2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
## 3.3. 预备知识
1. 温度传感器是指能感受温度并转换成可用输出信号的传感器
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. STM330F为一个室内光能供电的温度传感器。
4. 利用DolphinView 可以实现温度传感器的检测。
## 3.4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
uint8_t SendSensorValue(void)
{
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 设置GPIO引脚电平为0表示开始发送数据
uint8_t randtemp = g_ui32SysTickCount & 0x3f; // 生成一个随机数模拟温度传感器值
// 设置数据包的各个字段
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x0a; // 数据包长度低位字节
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验
// 数据字段
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备类型
EnOceanTelegramBuf[datalen++] = 0x00; // 数据1
EnOceanTelegramBuf[datalen++] = 0x00; // 数据2
EnOceanTelegramBuf[datalen++] = randtemp; // 随机温度传感器值
EnOceanTelegramBuf[datalen++] = 0x08; // 数据3
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
}
EnOceanTelegramBuf[datalen++] = 0x80; // 状态
// 选项数据
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
}
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm发送功率FF
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别为0表示电报未加密
// 计算并设置数据段CRC校验和
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
// 检查数据包长度是否正确
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 通过UART发送数据包
}
else return 1; // 如果数据包长度不符合预期,返回错误代码
// 等待数据包接收完成
while (!EnOceanTelegramRxflags);
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
EnOceanRxCount = 0; // 重置接收缓冲区计数
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1表示数据传输完成
// 检查接收到的数据包是否包含返回OK的标志
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志返回成功代码
return 1; // 否则返回错误代码
}
```
这个函数的作用是生成并发送一个EnOcean数据包其中包含了模拟的温度传感器值和一些固定的字段。函数通过UART发送数据包然后等待接收到带有返回OK标志的响应。
## 3.5. 实验步骤
### 3.5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
### 3.5.2. 步骤二 加载工程文件
加载Temp_Sensor工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.1EnOcean_Sniffer\IAR_Files”目录下的“Temp_Sensor.eww”工程文件点击“打开”。
### 3.5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Temp_Sensor程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
### 2.5.4. 步骤四 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Temp_Sensor程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Temp_Sensor程序的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
## 3.6. 实验结果
按下烧有Temp_Sensor工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。按下S3键数据包的Data为固定值08 B0 01 87按下S4键数据包的Data始终变化。
<img src="picture6.png" alt="picture6" style="zoom:67%;" />
## 3.7. 实验感想
通过这次温度传感器数据采集实验我们进一步理解和掌握了EnOcean无线通信模块的使用。我们学会了使用随机数模拟温度传感器值并组装成符合EnOcean协议格式的数据包进行无线发送。在Sniffer端成功捕获了发送的温度数据包验证了传输的正确性。
在阅读Temp_Sensor发送端代码时我们学习到了如何按照通信协议格式组织数据以及校验和的计算方法。这对我们后续开发EnOcean无线传感网络具有很好的指导意义。在配置和调用TM4C单片机外设(如GPIO、UART等)的过程中,也加深了我们对单片机外设编程的理解。
本次实验我们小组分工合作,分工明确,团队协作顺畅,实验效率得到提高。我们会在今后的项目中,继续提升团队协作能力,以适应未来更复杂的开发任务。

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -0,0 +1,100 @@
![cover](cover.png)
<h1><center>实验一 环境搭建</center></h1>
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验的组织与操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# 1. 实验目的
安装必要的开发工具、烧写工具构建EnOcean模块开发环境以便进行模块开发及实验。
# 2. 工具/原料
- 计算机Windows操作系统
- IAR FOR ARM 7.20安装包
- TI-TM4C-SDK工具包
- DolphinView安装包
- J-link安装包
# 3. 实验步骤
实验一的实验步骤在实验指导书上非常详细,只需要按照配图和文字执行即可。因此我们在本实验报告中仅简单概括一下实验的步骤,并说明我们对每个步骤在本物联网项目中在架构与技术上的理解。
1. 安装IAR FOR ARM 7.20
IAR软件作为项目的IDE软件主要用于编写程序代码、搭建软件工程、调用JTAG工具烧写硬件以及进行DEBUG等。
2. 破解IAR软件
~~IAR软件是商业收费软件。~~
3. 安装SDK工具包
SDK工具包是使用软件驱动硬件的依赖文件是厂商设计的与硬件通信的接口由硬件制造厂商提供。
4. 重建SDK驱动程序库
为了使IAR能在新的安装路径中找到SDK驱动程序需要重建SDK驱动程序库。
在这个步骤我们遇到了困难。排查原因发现是由于项目文件路径含有中文字符导致。由于编译机器使用MinGW作为C语言编译器MinGW不支持中文路径。
5. 安装J-link驱动
J-link是PC机与物联网模块进行烧写和DEBUG等的工具。作为外接的额外硬件需要在PC机上安装J-link的驱动以实现让PC机调用J-link的接口进行控制。
6. 安装DolphinView软件
DolphinView软件能够与后面烧写的Sniffer进行联动显示EnOcean_Sniffer程序采集的数据包。
# 4. 实验结果
我们最后成功将实验环境配置完成。
# 5. 实验感想
通过此次实验我们对物联网系统开发流程有了更直观的了解。在配置开发环境过程中我们安装了IAR、JLink等开发和调试所需的软硬件工具并解决了编译链接和烧录时遇到的问题。这使我们对物联网设备固件的编译、烧录等开发过程有了直接的体会。

View File

@@ -0,0 +1,185 @@
![cover](cover.png)
<h1><center>实验三 EnOcean温度采集实验</center></h1>
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验的组织与操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# 1. 实验目的
学习易能森协议栈温度传感器采集Profile模拟一个温度数据以温度采集Profile发送出去利用Sniffer进行抓包。
# 2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
# 3. 预备知识
1. 温度传感器是指能感受温度并转换成可用输出信号的传感器
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. STM330F为一个室内光能供电的温度传感器。
4. 利用DolphinView 可以实现温度传感器的检测。
# 4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
uint8_t SendSensorValue(void)
{
uint8_t datalen = FIRST_DATA_SEQ; // 用于存储数据包长度的变量,初始值为数据包中第一个数据的索引
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 设置GPIO引脚电平为0表示开始发送数据
uint8_t randtemp = g_ui32SysTickCount & 0x3f; // 生成一个随机数模拟温度传感器值
// 设置数据包的各个字段
EnOceanTelegramBuf[SYNC_BYTE_SEQ] = SYNC_BYTE; // 同步字节
EnOceanTelegramBuf[DATA_LENGTH_H_SEQ] = 0x00; // 数据包长度高位字节
EnOceanTelegramBuf[DATA_LENGTH_L_SEQ] = 0x0a; // 数据包长度低位字节
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] = 0x07; // 选项字段长度
EnOceanTelegramBuf[PACKET_TYPE_SEQ] = PACKET_TYPES_RADIO; // 数据包类型为无线电包
EnOceanTelegramBuf[HEADER_CRC8_SEQ] = GetCheckSum(&EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], PACKET_HEADER_LEN); // 头部的CRC校验
// 数据字段
EnOceanTelegramBuf[datalen++] = EN_DEVICE_RORG; // EnOcean设备类型
EnOceanTelegramBuf[datalen++] = 0x00; // 数据1
EnOceanTelegramBuf[datalen++] = 0x00; // 数据2
EnOceanTelegramBuf[datalen++] = randtemp; // 随机温度传感器值
EnOceanTelegramBuf[datalen++] = 0x08; // 数据3
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = TCM310F_BaseID[i]; // 发送者ID
}
EnOceanTelegramBuf[datalen++] = 0x80; // 状态
// 选项数据
EnOceanTelegramBuf[datalen++] = 0x03; // 子电报号
for (uint8_t i = 0; i < 4; i++) {
EnOceanTelegramBuf[datalen++] = 0xFF; // 目标ID
}
EnOceanTelegramBuf[datalen++] = 0xFF; // dBm发送功率FF
EnOceanTelegramBuf[datalen++] = 0x00; // 安全级别为0表示电报未加密
// 计算并设置数据段CRC校验和
EnOceanTelegramBuf[datalen] = GetCheckSum(&EnOceanTelegramBuf[FIRST_DATA_SEQ], datalen - FIRST_DATA_SEQ);
// 检查数据包长度是否正确
if (CONVERT_UINT16(EnOceanTelegramBuf[DATA_LENGTH_H_SEQ], EnOceanTelegramBuf[DATA_LENGTH_L_SEQ]) +
EnOceanTelegramBuf[OPTION_LENGTH_SEQ] == datalen - FIRST_DATA_SEQ) {
ENOCEAN_UARTSend(EnOceanTelegramBuf, BASE_PACKET_LEN + (datalen - FIRST_DATA_SEQ)); // 通过UART发送数据包
}
else return 1; // 如果数据包长度不符合预期,返回错误代码
// 等待数据包接收完成
while (!EnOceanTelegramRxflags);
memcpy(EnOceanTelegramBuf, EnOceanRxBuffer, EnOceanRxCount); // 将接收到的数据复制到发送缓冲区
EnOceanRxCount = 0; // 重置接收缓冲区计数
EnOceanTelegramRxflags = 0; // 重置数据包接收完成标志
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2); // 将引脚写为1表示数据传输完成
// 检查接收到的数据包是否包含返回OK的标志
if (EnOceanTelegramBuf[FIRST_DATA_SEQ] == RET_OK) return 0; // 如果包含返回OK的标志返回成功代码
return 1; // 否则返回错误代码
}
```
这个函数的作用是生成并发送一个EnOcean数据包其中包含了模拟的温度传感器值和一些固定的字段。函数通过UART发送数据包然后等待接收到带有返回OK标志的响应。
# 5. 实验步骤
## 5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
## 5.2. 步骤二 加载工程文件
加载Temp_Sensor工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.1EnOcean_Sniffer\IAR_Files”目录下的“Temp_Sensor.eww”工程文件点击“打开”。
## 5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 点击“J-Link/J-Trace”->“Connection”选择Interface为“JATG”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
**加载EnOcean_Sniffer工程**
点击工具栏的红叉退出调试拔掉下载Temp_Sensor程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载EnOcean_Sniffer工程。
## 5.4. 步骤四 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Temp_Sensor程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Temp_Sensor程序的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
# 6. 实验结果
按下烧有Temp_Sensor工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。按下S3键数据包的Data为固定值08 B0 01 87按下S4键数据包的Data始终变化。
<img src="picture6.png" alt="picture6" style="zoom:67%;" />
# 7. 实验感想
通过这次温度传感器数据采集实验我们进一步理解和掌握了EnOcean无线通信模块的使用。我们学会了使用随机数模拟温度传感器值并组装成符合EnOcean协议格式的数据包进行无线发送。在Sniffer端成功捕获了发送的温度数据包验证了传输的正确性。
在阅读Temp_Sensor发送端代码时我们学习到了如何按照通信协议格式组织数据以及校验和的计算方法。这对我们后续开发EnOcean无线传感网络具有很好的指导意义。在配置和调用TM4C单片机外设(如GPIO、UART等)的过程中,也加深了我们对单片机外设编程的理解。
本次实验我们小组分工合作,分工明确,团队协作顺畅,实验效率得到提高。我们会在今后的项目中,继续提升团队协作能力,以适应未来更复杂的开发任务。

View File

@@ -0,0 +1,211 @@
![cover](cover.png)
<h1><center>实验二 EnOcean Sniffer 实验</center></h1>
# 目录
[TOC]
---
# 实验分工
| 姓名 | 学号 | 分工 |
| :----: | :------: | :----------------------------------------------------------- |
| 柯劲帆 | 21281280 | 主要负责完成实验的组织与操作,对实验器材与软件进行测试,在测试中发现问题并与队员协作解决,在实验中也发现部分模块有损坏无法正常使用。 |
| 李桦炅 | 21281282 | 主要负责队员之间的沟通协作,协助完成实验并对实验过程中发现的问题进行记录,再进行沟通完善报告的描述。 |
| 王子励 | 21281292 | 负责实验报告的撰写,查阅背景知识资料工作。 |
| 李志民 | 20281146 | 中途加入小组,完成了实验一的环境配置后,协助了实验中遇到问题的解决。 |
# 1. 实验目的
将一个易能森设备配置为嗅探器Sniffer抓取易能森通信数据包以便分析数据。
# 2. 工具/原料
- 计算机WINDOWS操作系统
- 2个OURS-EnOcean实验模块
- IAR for ARM 7.20软件
- J-link仿真器一个
- DolphinView软件
- 调试单板模块(转接板)一个
# 3. 预备知识
1. Sniffer嗅探器是一种基于被动侦听原理的网络分析方式。使用这种技术方式可以监视网络的状态、数据流动情况以及网络上传输的信息。
2. TCM310F工作于模式0单向模块将无线接收到的数据可以通过串口发送到外部主机TCM310F工作于模式1双向模块将无线接收到的数据可以通过串口发送到外部主机同时可将外部主机串口发送的数据或命令通过无线发射出去。
3. 利用DolphinView 可以实现Sniffer的检测。
# 4. 核心代码
大致阅读代码,将代码的大致思想写在下面的注释中。
```c
void EnOceanUARTIntHandler(void) {
uint32_t ui32Ints; // 用于存储UART中断标志的变量
uint8_t data; // 用于存储接收到的数据字节
static uint8_t PacketHeader = 0; // 表示数据包头部的标志
static uint32_t PacketLen = 0; // 用于存储预期数据包长度的变量
//
// Get and clear the current interrupt source(s)
//
// 获取并清除当前的中断源
ui32Ints = ROM_UARTIntStatus(ENOCEAN_UART_BASE, true);
ROM_UARTIntClear(ENOCEAN_UART_BASE, ui32Ints); // 清除已处理的中断
//
// Handle receive interrupts.
//
// 处理接收中断。
if (ui32Ints & (UART_INT_RX | UART_INT_RT)) { // 检查RX FIFO非空或者超时中断是否发生
data = ROM_UARTCharGetNonBlocking(ENOCEAN_UART_BASE); // 从UART中读取一个字符
// 检查接收缓冲区是否有空间,并且数据包接收不在进行中
if (EnOceanRxCount < ENOCEAN_RX_BUFFER_SIZE && (!EnOceanTelegramRxflags)) {
EnOceanRxBuffer[EnOceanRxCount++] = data; // 将接收到的数据存储到缓冲区中
// 检查数据包头部是否已经被检测到
if (!PacketHeader) {
// 检查数据包的第一个字节是否是头部0x55
if (EnOceanRxBuffer[0] != 0x55) EnOceanRxCount = 0; // 如果头部不符合预期,重置缓冲区
else {
// 检查是否已经接收到6个字节头部 + 数据长度 + 校验和)
if (EnOceanRxCount == 6) {
// 使用接收到的数据计算预期的数据包长度
if (GetCheckSum(&EnOceanRxBuffer[1], 4) == EnOceanRxBuffer[5]) {
PacketLen = 7 + (EnOceanRxBuffer[1] << 8) + EnOceanRxBuffer[2] + EnOceanRxBuffer[3];
PacketHeader = 1; // 设置数据包头部标志
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0); // 将引脚写为0
} else {
EnOceanRxCount = 0; // 如果校验和验证失败,重置缓冲区
}
}
}
} else if (EnOceanRxCount == PacketLen) {
EnOceanTelegramRxflags = 1; // 设置表示完整数据包接收的标志
PacketHeader = 0; // 重置数据包头部标志
PacketLen = 0; // 重置预期数据包长度
}
} else {
// 如果缓冲区已满或者接收到无效的数据包,重置接收缓冲区和数据包头部信息
EnOceanRxCount = 0;
PacketHeader = 0;
PacketLen = 0;
}
}
}
```
# 5. 实验步骤
## 5.1. 步骤一 连接模块
OURS-EnOcean模块的CN1接口和调试单板模块的CN2接口相连此实验需要给EnOcean-CORE下载程序。
给EnOcean-CORE下载用20PIN排线将J-Link与节点调试转接板上CORE接口相连。
## 5.2. 步骤二 加载工程文件
加载EnOcean_Sniffer工程打开IAR FOR ARM点击“File”->“Open”->“Workspace”选择本机中“EnOcean\EnOcean_CODE\1.1EnOcean_Sniffer\IAR_Files”目录下的“EnOcean_Sniffer.eww”工程文件点击“打开”。
## 5.3. 步骤三 编译并下载
**设置:**
执行以下步骤设置工程选项:
- 右键工程->“Options”在“General Options”->“Target”选择“TI TM4c123GH6PM”
- 点击“Debugger”->“Setup”选择Driver为“J-Link/J-Trace”
- 完成设置后点击“OK”。
**编译:**
点击菜单栏中“Project”->“Rebuild All”选项编译程序也可在工程上右键“Rebuild All”。
**烧录:**
编译没有错误后点击菜单栏“Project”->“DownLoad and Debug”。
在这里我们遇到了问题。在完成上述设置后,我们还是遇到了烧录错误,报错截图如下:
<img src="picture1.png" alt="picture1" style="zoom: 67%;" />
上网查阅资料后我们对比发现设置中的Interface默认为SWD但是我们实验使用的工具为JATG所以需要选择JATG。更改如下
<img src="picture2.png" alt="picture2" style="zoom:67%;" />
更改该选项之后,成功烧录程序。
**加载一位翘板开关工程Rocker_Switch工程**
点击工具栏的红叉退出调试拔掉下载EnOcean_Sniffe程序的OURS-EnOcean模块电源用同样的方法向另一块OURS-EnOcean模块加载1.4Rocker_Switch工程。
## 5.4. 步骤四 安装USB Serial Port
将下载EnOcean Sniffer程序的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电和传输数据。
在这里我们再次遇到了问题。
用一根micro USB线将OURS_EnOcean模块和PC机相连后PC机并没有如实验指导书所述弹出驱动安装提示窗口。且在设备管理器中可以看到PC机没有正确识别OURS_EnOcean设备如下图所示
<img src="picture3.png" alt="picture3" style="zoom:67%;" />
我们在网上查找新版本的设备驱动程序。将驱动程序版本从“TivaWare_C_Series-2.1.4.178”升级到了“TivaWare_C_Series-2.2.0.295”。在设备管理器右键设备->点击“属性”->点击“驱动程序”->点击“更新驱动程序”->点击“浏览我的电脑以查找驱动程序”->点击“浏览”->选择新驱动的安装目录->点击“确定”即可让PC机更新驱动。现在PC机能正确识别OURS_EnOcean设备了
<img src="picture4.png" alt="picture4" style="zoom:67%;" />
## 5.5. 步骤五 实验结果
1. 打开DolphinView软件正确选择串口与设备管理器中一致点击连接。
2. 将下载Rocker_Switch工程的OURS_EnOcean模块用一根micro USB线和PC机相连用于供电
3. 摁下下载Rocker_Switch工程的OURS_EnOcean模块S3/S4按键观察DolphinView软件的显示结果。
# 6. 实验结果
按下烧有Rocker_Switch工程的OURS-EnOcean模块的S3、S4按键观察到DolphinView窗口显示烧有EnOcean_Sniffer工程的OURS-EnOcean模块接收到数据包。按下S4键数据包的Data为00按下S3键数据包的Data为10。
<img src="picture5.png" alt="picture5" style="zoom:67%;" />
在这个过程中我们将烧有Rocker_Switch工程的OURS-EnOcean模块脱离连接着Sniffer的PC机使用手机充电器供电也能在Sniffer上接收到Rocker_Switch的数据包这验证了数据包是无线传输的。
# 7. 实验感想
在Sniffer实验中我们通过串口抓取了EnOcean无线模块之间的通信数据包并在DolphinView可视化软件中查看。这帮助我们理解和掌握了Sniffer嗅探器的工作原理。同时阅读Sniffer源码也加深了我们对EnOcean通信协议和TM4C单片机串口通信的理解。
在实验过程中,我们学习到了解决实验问题的方法。当遇到困难时,我们会小组讨论分析问题原因,充分利用网络资源查阅相关资料,在助教的帮助下最终找到解决办法。这种经验对我们今后独立分析和解决问题具有重要的启示意义。
本次实验采用小组合作形式。通过分工协作,不仅提高了工作效率,也培养了我们的团队协作能力。今后我们会继续提升合作中各成员的配合水平。

Binary file not shown.

Binary file not shown.

Binary file not shown.