消息协议如何提高数据传输的可靠性

电子说

1.2w人已加入

描述

串行端口是PIC与其他设备通信的最简单方法之一。但是,事件串行端口存在缺陷,因此在本教程中,我们将了解消息协议如何提高数据传输的可靠性。

示意图

数据传输

原始数据传输

现代微控制器通常内置许多设备接口外设,包括I2C,SPI,UART和能够。虽然I2C和SPI专用于器件,并且严重依赖于选择信号或启动/停止信号,但UART更加自由。 UART的最大缺点之一是缺少时钟信号,这可能导致发送器或接收器的时钟漂移(导致波特差异),帧错误,甚至当其中一个缓冲器出现溢出错误方满了。当然,这些问题是使用定时器,监视器和事件容易克服的相对性。但是,与I2C和SPI不同,串行连接在一种特定情况下更常见:可移动硬件。 I2C和SPI器件通常是直接焊接到主电路板或永久连接到它们的IC。同时,这些设备是主控制器的子设备,因此无法自行启动数据传输。

想象一下PIC和计算机通过串行连接进行通信,其中每个设备都可以发送命令或数据到另一个设备。这样的系统可以用普通的消息协议轻松实现,其中发送的第一个字节代表命令,后面的字节代表该命令的数据。只要没有中断,该系统就可以正常运行。但是,如果计算机在发送命令后传输数据字节的一半时崩溃并重新启动会发生什么?好吧,我们的程序将重新启动并尝试发送命令字节以启动数据传输,但命令字节将被PIC解释为数据字节,因为它仍然期望一个数据字节。这会导致PIC产生错误,因为它读取的字节可能会产生意外结果。但这不仅仅是UART的一个问题;任何可能被终止的连接,无法知道连接已被终止,也可能崩溃。解决方案是使用消息协议!

我们的消息协议:DHP - DIY黑客协议

确保命令始终正确处理,命令字节值将是唯一的。对于我们的系统,我们将有以下命令:

0x00 - 无操作

0x01 - 请求数据

0x02 - 写数据

0x03 - 数据结束

0x04 - 重启(发生错误或失败)

作为一个简单的例子,如果我们想通过计算机向PIC发送一些数据,我们必须首先发送0x02,然后发送所有数据,然后发送数据结束字节。如果传输中断并且计算机尝试重新发送数据,它将再次发送整个数据包。 PIC将正确解释命令字节并意识到正在发送新数据包。但是,如果我们的数据包含0,1,2,3或4,会发生什么? PIC会将这些解释为命令字节,因此会发生致命错误。那么,我们如何解决这个问题?

虽然不是最有效的方法,但我们可以用其他形式表示我们的数据而不是原始字节值。一种方法是将我们的数据表示为十六进制形式的ASCII字符,以便两个ASCII字节代表一个字节的数据。例如,FF表示255,其中00表示0.因此,我们的数据字节永远不能与命令字节相同,并且通过使用ASCII编码的十六进制字节,理论上我们可以有多达240个命令字节(留下16个十六进制字符用于数据)。使用ASCII编码数据的缺点是我们有效地将数据速率减半,命令字节进一步降低了速度。但与此同时,系统的可靠性也得到了显着提高。

数据完整性怎么样?我们可以通过在数据包中添加校验和来实现这一点,这样接收方就可以确保数据完好无损。一种简单的方法是对收到的所有字节进行异或,并将其用作校验和。如果任何一个位被误读,这将显示在XOR校验和中。如果同一列中的两个位被误读,则校验和保持不变,因此XOR仅对单位错误有效(但这些是最常见的)。

示例包

编写数字92(十六进制0x5C)

数据传输

从设备读取(TX设备)请求数据,RX设备发送请求的数据)

数据传输

的构建的的

该项目可以使用许多不同的电路构造技术构建,包括条形板,矩阵板,面包板和PCB。在这个例子中,我使用了在CNC机床上制造的PCB(通过隔离布线),但我正在考虑回到化学过程,原因将在后面的文章中讨论。

这也是我第一个包含使用XYZ da Vinci Jr. 3D打印机制作的自定义项目框的项目。设计本身(痛苦地)在Google SketchUp中制作,然后由于STL导出器插件导出为STL文件。然后,STL文件在XYZmaker中导入并打印。虽然这个项目盒不使用螺丝,但未来的设计将会如此。虽然3D打印的型号可能价格昂贵(这个盒子使用价值约1.00美元的塑料),但它是一种定制设计,可以制作近乎完美的功能,如切口和孔。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分