以下为《《基于stm32自定义通讯协议的模拟串行通讯的程序设计》实验报告》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
作业1:基于stm32自定义通讯协议的模拟串行通讯的程序设计
姓名:蔡某某 学号:***3112
作业背景
题目:通过数字通道进行两个计算机系统的通讯
功能要求:设计、实现一个用于数字通道串行通讯的协议
(1)硬件
/
(2)软件
CLK上升沿检测DTA的值,作为1bit,存入寄存器中。
课程作业方案设计
(1)自定义协议格式
START
帧头
数据长度
标识
数据
数据校验
帧尾
1Byte
1Byte
1Byte
1Byte
1Byte
2Byte
1Byte
0x53
0xFE
0x01
0xDD
0x0D0C
0xFF
上述表格中:
1.START:协议数据帧开始的标志,保留字节0x53。
2.帧头:同其他设备通讯时首要的一致性保证,这里为0xFE。
3.数据长度:表示当前数据包的大小。
4.标识:可以自定义,对于不同的数据包,采用不同的标识。比如当遇到温度采样问题时,该作为温度采集器序号。当遇到湿度采样问题时,该作为湿度采集器的序号。
5.真实数据:发送的数据内容。
6.数据校验:根据上述数据所得的CRC32校验码进行校验。
7.帧尾:协议数据结束的标志,保留字节为0xFF。
(2)自定义协议详解
/
/
1.自定义协议采用的是端到端的通信。
2.自定义的通讯协议采用两条信号线,一条时钟线(CLK)和一条数据线(DTA),属于串行半双工通讯。每个从设备都有自己的标识、帧头、数据、数据长度、数据校验、帧尾,主设备发送START信号后,紧跟着发送想要数据的帧头,当验证了帧头之后,该数据包就是我们所需要的对应数据包。
3.CLK上升沿检测DTA的值,作为1bit,存入寄存器中。当没有数据传输时,DTA上恒保持高某某。
4.START信号:当检测到DTA的值为0x53时,开始传输数据。
5.帧头:0xFE,即在CLK时钟的8个周某某,此时传输了8bit数据为***时,该数据包就是正确的数据包,在第一个字节后,主机立即读取从机,开始接受该数据包。
6.STOP信号:当时钟线为高时,数据线上跳会产生停止信号,即为该数据包的帧尾。
课程作业实施
1.发送方法
按照协议的要求去组织数据,把数据装入发送缓冲区,采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小,但是也有可能出现需要发送的数据不能立即被发送的情况。
2.下位机中的数据接收和协议解析
下位机接收数据采用中断接收。数据包的解析过程可以设置到不同的位置。如果协议比较简单,整个系统只是处理一些简单的命令,那么可以直接把数据包的解析过程放入到中断处理函数中,当收到正确的数据包的时候,置位相应的标志,在主程序中再对命令进行处理。如果协议稍微复杂,比较好的方式就是将接收的数据存放于缓冲区中,主程序读取数据后进行解析。
3.数据包
(1)数据包某某
数据包(8个字节)=START+帧头+数据长度+标识+数据+数据校验+帧尾
(2)通信处理方式
中断接收/发送+缓冲区
(3)协议的实现
首先是接收,我是在接收中断去实现协议功能的,即每接收中断一次(接收到一个字符)的时候,按照协议的要求去进行处理。如果这帧数据是正确的,就置位Flag标志位,在大循环中再去进行命令的解析,错误时则丢弃。
协议解析的目的,首先时判断数据包的完整性、正确性,然后提取数据类型等,最后存放起来用于主程序处理。在这过程中,会使用一个变量state_machine作为协议状态机的转 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 umchkm==rcvdta)
state_machine=9;
else
state_machine=0;
}
else if(state_machine==9)
{
if(xorchkm==rcvdta)
state_machine=10;
else
state_machine=0;
}
else if(state_machine==10)
{
if(0x0D==rcvdta)
{
Flag=0xaa;
}
state_machine=0;
}
[文章尾部最后300字内容到此结束,中间部分内容请查看底下的图片预览]
以上为《《基于stm32自定义通讯协议的模拟串行通讯的程序设计》实验报告》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。