单片机通信的汉明码

合集下载

单片机通信的汉明码

单片机通信的汉明码

收稿日期:2002-3-10作者简介:刘业辉(1969-),男,西安矿业学院通讯工程专业,讲师。

单片机通信的汉明码刘业辉(北京工业职业技术学院,北京100042)摘 要:差错控制编码理论是现代通信的一个重要理论范畴并在实际中有广泛的应用。

本文介绍汉明码的编码、译码和差错校正的原理,并给出单片机与PC 机间通信的编程实例。

关键词:单片机 异步串行通信 奇偶校验 汉明码 编码 译码 TurboC C51中图分类号:T N 919.3 文献标识码: B 文章编号:1671-6558(2002)01-12-06H anming Codes in Single -chip Micro -controller CommunicationLiu Yehui(Beijing Vocational &T echnical Institute of Industry ,100042)Abstract :Error -control coding theory is one of the im portant categ ories in m odern communication ,and used widely in practice.This paper deals with the coding ,decoding ,error correction principles of Hanming codes ,and illustrates the programming for the communication between a single -chip micro -controller and PC.K ey words :a single -chip micro -controller ;asynchronous serial communication ;parity check ;Hanming codes ;cod 2ing ;decoding ;Turbo C ;C51 为提高数据通信的可靠性,单片机之间异步串行通信采用的检错与纠错方法很多,最简单的就是偶校验,在单片机通信的一般应用中常用。

汉明码编码原理介绍

汉明码编码原理介绍

汉明码编码原理介绍
为了保证通信过程中数据传输的正确性和完整性,并且在通信过程中,如果数据传输发生一位错误,能够将其矫正过来,将信息数据进行汉明编码后再进行数据传输。

汉明码(Hamming Code)也叫海明码,是Richard Hamming(贝尔实验室)于1950年发明的,汉明码也是利用了奇偶校验位概念,通过在数据位后增加一些比特以验证数据的有效性,故汉明码也属于线性纠错码(可纠错1-bit错误检出2-bit错误)。

汉明码无法实现2位及2位以上纠错。

汉明码原理汉明码运算需要构造G生成矩阵和的离散值里取值,所以信息位也可能不是最大值,比如信息位为24,计算需要校验位5,但同样可信息位为25时,校验位同样是5。

校验位数VS信息位数关系如下表:
注:汉明码的特性决定,一般不会做太多信息位的校验,信息位越长出现多余两个错误的概率会越高,这将带来纠错的难度。

汉明码编码原理设码长为n,信息位长度为k,监督位长度为r=n-k。

如果需要纠正一位出错,因为长度为n的序列上每一位都可能出错,一共有n种情况,另外还有不出错的情况,所以我们必须用长度为r的监督码表示出n+1种情况0 1 0 a1
1 0 0 a2
0 1 1 a3
1 0 1 a4
1 1 0 a5
1 1 1 a6
0 0 0 无错
按照表中的规定可知,仅当一个错码位置在a2,a4,a5或a6时校正子S1为1,否则S1为0。

这就意味着a2,a4,a5,a6四个码元构成偶校验关系:
S1 = a6⊕a5⊕a4⊕a2 (1)式
同理,可以得到:
S2 = a6⊕a5⊕a3⊕a1 (2)式。

汉明码

汉明码
一般来说,若汉明码长为n,信息位数为k,则监督位数r=n-k。
数量之比
数量之比
那么汉明码的数量与数据位的数量之间有何比例呢?上面的例子中数据位是4位,加上3位汉明码是7位,而2 的3次幂是8。这其中就存在一个规律,即2^P≥P+D+1,其中P代表汉明码的个数,D代表数据位的个数,比如4位 数据,加上1就是5,而能大于5的2的幂数就是3(2^3=8,2^2=4)。这样,我们就能算出任何数据位时所需要的 汉明码位数:7位数据时需要4位汉明码(16>4+7+1),64位数据时就需要7位汉明码(128>64+7+1),大家可以 依此推算。此时,它们的编码规也与4位时不一样了。
校验
校验
与其他的错误校验码类似,汉明码也利用了奇偶校验位的概念,通过在数据位后面增加一些比特,可以验证 数据的有效性。利用一个以上的校验位,汉明码不仅可以验证数据是否有效,还能在数据出错的情况下指明错误 位置。
纠错
纠错
在接收端通过纠错译码自动纠正传输中的差错来实现码纠错功能,称为前向纠错FEC。在数据链路中存在大 量噪音时,FEC可以增加数据吞吐量。通过在传输码列中加入冗余位(也称纠错位)可以实现前向纠错。但这种方 法比简单重传协议的成本要高。汉明码利用奇偶块机制降低了前向纠错的成本。
谢谢观看
汉明码
电信领域的线性调试码
01 历史
03 纠错 05 编码原理
目录
02 校验 04 校验方法 06 数量之比
基本信息
汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。 汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一 比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。

单片机的中文显示处理技巧

单片机的中文显示处理技巧

单片机的中文显示处理技巧单片机作为嵌入式系统中的重要组成部分,其在各个领域的应用日益广泛。

在很多情况下,我们需要通过单片机实现中文的显示,因此掌握单片机的中文显示处理技巧是非常必要的。

本文将介绍几种常见的单片机中文显示处理技巧,旨在帮助读者更好地理解和应用。

一、汉字的编码问题在开始讨论单片机的中文显示处理技巧之前,我们首先需要了解汉字的编码方式。

目前最常用的汉字编码方式是GB2312和Unicode。

GB2312采用两个字节表示一个汉字,而Unicode则采用更多的字节,可以覆盖更多的字符。

在单片机中,我们通常会采用GB2312编码方式进行中文字符的表示和处理。

二、字库的引入和使用为了实现单片机的中文显示,我们需要一个字库,即包含了各种中文字符的数据表。

我们可以从官方渠道或者其他第三方资源中获取相应的字库。

在实际应用中,我们可以将字库编译为数组或者独立的数据文件,并将其导入到单片机的存储器中。

然后,我们可以通过访问相应的地址来获取并显示中文字符。

三、液晶显示屏的使用技巧在实际应用中,我们通常会使用液晶显示屏来实现单片机的中文显示。

下面是几个液晶显示屏使用中的注意事项:1. 设置字符显示模式:液晶显示屏中一般包含有字符发生器,我们可以通过设置字符显示模式来选择使用汉字编码还是英文字母编码。

2. 设置显示位置:在使用液晶显示屏显示汉字之前,我们需要设置显示位置,即将显示的汉字写入指定的坐标位置。

3. 字符的显示方式:液晶显示屏通常有多种显示方式,例如点阵式显示和字符行显示等。

我们可以根据实际需求选择合适的显示方式。

四、中文字符串的处理技巧除了显示单个中文字符之外,有时候我们还需要处理中文字符串。

在处理中文字符串时,我们需要注意以下几点:1. 字符串的存储方式:中文字符串通常会占用更多的存储空间,因此在设计程序时需要合理安排存储,以免出现内存溢出等问题。

2. 字符串的显示方式:在液晶显示屏上显示中文字符串时,我们可以选择逐个显示字符,也可以选择将整个字符串作为一个整体进行显示。

有错必究 汉明码(Hamming Code)的原理及其应用

有错必究 汉明码(Hamming Code)的原理及其应用
这个问题二十年前曾经在美国数学界、计算机界轰动一时。不光因为它是一道趣味题 目,而且因为这题目背后蕴藏着计算机编码理论中的一个重要思想。
与别的问题不同,这个问题最困难的地方是只要有一个人错则全错。所以不能像别的 题那样用数量来搞概率。
如果每个人都随机猜,那么三个人都猜对的可能性是八分之一。除此之外,好像没有 什么别的出路。因为帽子都是随机选的,你头上的帽子颜色与别人的帽子颜色独立,似乎 没有任何根据让你决定选什么颜色或放弃。其实不然,正因为帽子是随机选的(每个帽子 都有二分之一的机会是红色,二分之一的机会蓝色),所以总体帽子的颜色满足一种分布。 有些情况多一些,有些情况少一些。我们可以在这上面做文章。
如果那7个比特传递的信息有奇数个1验证码就是1否则就是样一来如果信息传递中有一个码出现错误该是1的地方变成了0或者该是0的地方变成了1与这个验证码不符我们就知道传递有错
he Joy of Mathematics 数学趣谈





有错必究 汉明码(Hamming Code)的原理及其应用
万精油
上期的题目是帽子的颜色问题。为方便解答,我们把上期题目再列一遍。
先看三人的情况 :三个人的帽子颜色一共有八种情况,红红红,红红蓝,红蓝红,红 蓝蓝,蓝红红,蓝红蓝,蓝蓝红,蓝蓝蓝。如果大家商定,当某人看见两个同色的帽子时, 他就猜另一种颜色,否则放弃。那么,根据上面的八种分布,我们很容易看出,有六种情 况他们都能通过。只有两种情况他们会失败,即全红或全蓝的时候。再仔细数一数,他们 答错和答对的时候一样多,都是六次。唯一的区别是,答错的时候大家都一起答错。而答 对的时候都只有一人答对,别的人都放弃。
帽子的颜色问题 :三个人头上都被戴上一顶帽子。帽子的颜色是蓝色或红色,完 全独立随机。每个人可以看见别人的帽子,但看不见自己的帽子。每个人可以有 两种选择 :猜自己帽子的颜色,或者放弃(就是不猜)。每个人把自己的决定写 在一张纸上。如果最后的结果是至少一人猜对而且没人猜错,那么他们可以得到 一笔巨额奖金。我们的问题是,他们用什么策略才能最大地提高得奖的概率。

汉明码的原理

汉明码的原理

汉明码的原理汉明码是一种错误检测和纠正的编码方式,它以理论家理查德·汉明的名字命名。

汉明码通过在数据中插入冗余位来检测和纠正错误。

它的原理是在发送数据的时候,根据一定的规则生成一组冗余位,并将其附加到原始数据中。

接收方在接收到数据后,通过对数据进行校验,可以检测出错误的位置,并进行纠正。

汉明码的生成规则如下:假设发送方要发送一个m位的数据,需要生成r位的冗余位。

冗余位的数量r需要满足以下条件:2^r ≥ m + r + 1。

也就是说,冗余位的数量需要满足能够容纳原始数据和冗余位的总长度。

生成冗余位的方法是通过对原始数据进行一系列的异或运算。

首先,确定冗余位的位置,通常是2的幂次方位置,比如第1位、第2位、第4位等。

然后,对于每一个冗余位,计算其值,即将与其相关的原始数据位进行异或运算,并将结果作为冗余位的值。

最后,将生成的冗余位附加到原始数据中,形成最终的发送数据。

接收方在接收到数据后,需要对数据进行校验。

校验的过程是将接收到的数据和冗余位进行一系列的异或运算,然后检查结果。

如果结果为0,则说明数据没有错误;如果结果不为0,则说明数据存在错误,并且错误的位置对应于校验结果中值为1的位。

在纠正错误的时候,可以通过计算错误位置的二进制表示来确定具体是哪一位出现了错误。

例如,如果校验结果中值为1的位的位置是5,则说明第5位出现了错误。

接下来,将错误位的值进行取反操作,即从0变成1,或者从1变成0,然后将纠正后的数据发送给上层应用。

汉明码的好处是能够检测出错误的位置并进行纠正,从而提高数据传输的可靠性。

它广泛应用于通信和存储系统中,特别是在数据传输距离较远或者噪声较大的情况下,汉明码可以有效地保证数据的完整性和准确性。

总结起来,汉明码是一种通过插入冗余位来实现错误检测和纠正的编码方式。

它的原理是在发送数据的时候,根据一定的规则生成一组冗余位,并将其附加到原始数据中。

接收方在接收到数据后,通过对数据进行校验,可以检测出错误的位置,并进行纠正。

汉明码原理

汉明码原理一、什么是汉明码汉明码是一种在数字通信和信息理论中常用的错误检测和纠正编码技术。

它由美国数学家理查德·汉明提出,用于在传输过程中检测和纠正由于噪声引起的位错误。

汉明码通过在原始数据中添加冗余位,使得接收端能够根据编码规则检测出错误,并且在一定程度上纠正这些错误。

二、汉明码的原理汉明码的原理是基于一种称为”奇偶校验”的技术。

通过添加冗余位,汉明码能够检测并纠正单比特错误。

它通过在传输的数据中添加冗余位,使得数据在传输过程中能够容忍一定数量的错误。

三、汉明码的结构汉明码通常由n个信息位和m个校验位组成,总共有n+m个位。

校验位的数量由信息位的数量决定。

汉明码的一大特点是校验位与信息位之间的位置关系。

3.1 校验位的位置在汉明码中,校验位的位置是关键。

校验位的位置被选择为2的幂次(从0开始计数),也就是在二进制表示中只有一个位为1,其余位为0。

例如,第1个校验位的位置是1,第2个校验位的位置是2,以此类推。

3.2 校验位的计算校验位的计算方式是将校验位所对应的位置上的所有信息位相加,并根据结果计算校验位的值。

如果校验位的计算结果为奇数,则校验位的值为1;如果计算结果为偶数,则校验位的值为0。

3.3 例子以一个汉明码(7,4)为例,其中有4个信息位和3个校验位。

校验位的位置是1、2和4。

假设要发送的信息是1011,根据校验位的位置,计算校验位的值:1.计算第1个校验位的值:根据校验位的位置,需要计算第1个、第2个和第4个位的和。

对应的信息位是1、0和1。

计算结果为2,为偶数,所以第1个校验位的值为0。

2.计算第2个校验位的值:根据校验位的位置,需要计算第2个、第3个和第4个位的和。

对应的信息位是0、1和1。

计算结果为2,为偶数,所以第2个校验位的值为0。

3.计算第4个校验位的值:根据校验位的位置,需要计算第4个位和第3个位。

对应的信息位是1和1。

计算结果为2,为偶数,所以第4个校验位的值为0。

用MCS-51实现(7,4)汉明码的译码方法

维普资讯
20 0 6年第 1 1期 总 秉 2 6 2
用 MC 一 1 S 5 实现(,) 74汉明码的译码方法
贾培 军 , 世 平 杨
( 安 大学 物 理 与 电 子 信 息 学 院 延 陕 西 延 安 76 0 ) 1 0 0

要 : 字信 号在 传输过程 中需要用信道编码 来降低误 码率 , 高数 字通信的 可靠性 , 数 提 汉明码 正是 一种编码 效率 高且
s s e , i i lsg a r c s i g lc la e e wo k I h s p p r c d n t o f i l me t g( , ) a y t m d g t in lp o e sn , o a r a n t r . n t i a e , o ig me h d o mp e n i a n 7 4 H mmi g b s d o n ae n
关 键 词 : 明 码 ; 片机 MC 汉 单 S一5 ; 道 ; 码 1信 译 中图分类号 : TN9 1 1 文 献标 识码 : B 文 章 编 号 :0 4 7X(0 6 1 —0 9 2 10 —3 3 2 0 ) 1 5 —0
C d n eh fI lme t g ( , ) Ha mi gB C o i gM t o o mp e n i d n 74 m n y M S一5 1
M CS 一 51 i nt o c d. S i r du e
K y r s: mmi g; CS一5 ; h n e ; o i g e wo d Ha n M c a n lc dn 1
l 引

两个错误 。
在 当今 和 未来 的 信 息 化 社 会 中 , 字 通 信 已成 为 信 息 数 传 输 的重 要 手 段 , 球 数 字 化 已 成 为 当今 社 会 的 主 要 潮 全

汉明编码

汉明编码汉明码汉明码是一种线性分组码。

线性分组码是指将信息序列划分为长度为k 的序列段,在每一段后面附加r位的监督码,且监督码和信息码之间构成线性关系,即它们之间可由线性方程组来联系。

这样构成的抗干扰码称为线性分组码。

编码原理设码长为n,信息位长度为k,监督位长度为r=n-k。

如果需要纠正一位出错,因为长度为n的序列上每一位都可能出错,一共有n种情况,另外还有不出错的情况,所以我们必须用长度为r的监督码表示出n+1种情况。

而长度为r的监督码一共可以表示2^r种情况。

因此2^r >= n + 1,即r >= log(n+1)我们以一个例子来说明汉明码。

假设k=4,需要纠正一位错误,则2^r >= n + 1 = k + r + 1 = 4 + r + 1解得r >= 3。

我们取r=3,则码长为3+4=7。

用a6,a5,...a0表示这7个码元。

用S1,S2,S3表示三个监关系式中的校正子。

我们作如下规定(这个规定是任意的):S1 S2 S3 错码的位置0 0 1 a00 1 0 a11 0 0 a20 1 1 a31 0 1 a41 1 0 a51 1 1 a60 0 0 无错按照表中的规定可知,仅当一个错码位置在a2,a4,a5或a6时校正子S1为1,否则S1为0。

这就意味着a2,a4,a5,a6四个码元构成偶校验关系:S1 = a6⊕a5⊕a4⊕a2 (1)式同理,可以得到:S2 = a6⊕a5⊕a3⊕a1 (2)式S3 = a6⊕a4⊕a3⊕a0 (3)式在发送信号时,信息位a6,a5,a4,a3的值取决于输入信号,是随机的。

监督为a2,a1,a0应该根据信息位的取值按照监督关系决定,即监督位的取值应该使上述(1)(2)(3)式中的S1,S2,S3为0,这表示初始情况下没有错码。

即a6⊕a5⊕a4⊕a2 = 0a6⊕a5⊕a3⊕a1 = 0a6⊕a4⊕a3⊕a0 = 0由上式进行移项运算,得到:a2 = a6⊕a5⊕a4a1 = a6⊕a5⊕a3a0 = a6⊕a4⊕a3已知信息位后,根据上式即可计算出a2,a1,a0三个监督位的值。

stc单片机能够识别的文字类型

1. 概述STC单片机作为一种常见的嵌入式系统开发工具,广泛应用于家电控制、汽车电子、工业自动化等领域。

在单片机开发中,文字输入是一个常见的需求,比如显示屏幕上的文字信息、键盘输入的命令等。

STC单片机能够识别的文字类型成为一个重要的研究方向。

2. ASCII码ASCII(American Standard Code for Information Interchange)码是向计算机或通信设备传达信息的编码方式之一。

在STC单片机中,常常需要处理ASCII码,包括大写字母、小写字母、数字、特殊符号等。

在单片机开发中,能够识别和处理ASCII码是非常重要的。

3. 中文字符集除了ASCII码,STC单片机还需要支持中文字符集的识别和处理。

中文字符集包括GB2312、GBK、UTF-8等编码方式,每一种编码方式都有自己的特点和应用场景。

在实际开发中,STC单片机需要能够识别和处理这些中文字符集,以满足用户对中文信息的输入和输出需求。

4. 字符串操作在STC单片机开发中,字符串操作是一个常见的任务。

STC单片机需要能够识别并处理各种类型的字符串,包括ASCII字符串、中文字符串等。

字符串操作涉及到字符的比较、拼接、截取、查找等操作,因此STC单片机对于字符串的识别和处理能力至关重要。

5. 编程接口STC单片机能够识别的文字类型还包括编程接口,比如C语言中的字符类型、字符串处理函数等。

STC单片机需要提供丰富的编程接口,以方便开发者对文字类型进行操作和处理。

6. 结论STC单片机能够识别的文字类型涉及到ASCII码、中文字符集、字符串操作以及编程接口等多个方面。

在单片机开发中,这些能力是非常重要的,影响着单片机在各种应用场景下的实用性和可靠性。

对于STC单片机的文字类型支持能力的研究和改进势在必行,以满足不同用户对文字输入和输出的需求。

7. 文字识别技术随着人工智能和图像处理技术的发展,文字识别技术在嵌入式系统中得到了广泛的应用。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

收稿日期:2002-3-10作者简介:刘业辉(1969-),男,西安矿业学院通讯工程专业,讲师。

单片机通信的汉明码刘业辉(北京工业职业技术学院,北京100042)摘 要:差错控制编码理论是现代通信的一个重要理论范畴并在实际中有广泛的应用。

本文介绍汉明码的编码、译码和差错校正的原理,并给出单片机与PC 机间通信的编程实例。

关键词:单片机 异步串行通信 奇偶校验 汉明码 编码 译码 TurboC C51中图分类号:T N 919.3 文献标识码: B 文章编号:1671-6558(2002)01-12-06H anming Codes in Single -chip Micro -controller CommunicationLiu Yehui(Beijing V ocational &T echnical Institute of Industry ,100042)Abstract :Error -control coding theory is one of the im portant categ ories in m odern communication ,and used widely in practice.This paper deals with the coding ,decoding ,error correction principles of Hanming codes ,and illustrates the programming for the communication between a single -chip micro -controller and PC.K ey words :a single -chip micro -controller ;asynchronous serial communication ;parity check ;Hanming codes ;cod 2ing ;decoding ;Turbo C ;C51 为提高数据通信的可靠性,单片机之间异步串行通信采用的检错与纠错方法很多,最简单的就是偶校验,在单片机通信的一般应用中常用。

但它只能检错而不能纠错,通常应用中检出有错误可请求重发实现差错控制。

这里介绍较为实用的可实现检错与纠错的汉明码编码、解码原理并给出单机与PC 机之间通信应用的实例编程。

1 汉明编码原理汉明码就是在一组代码中加入一定数量的校验中去。

若某个信息位错,引起几组奇偶校验结果均出错,由此根据奇偶组的检错,确定误码信息位及误码性质。

汉明码有如下特点:码长 N =2m-1信息码位 k =2m-m -1监督码位 r =n -k =m m ≥2正整数最小码距 k =3纠错能力 t =1 假定监督码位m =3,三位奇遇校验监督码位设为c 2c 1c 0,则信息码位k =4即传送四位二进制码(信息位)b 3b 2b 1b 0。

这样就构成(7,4)汉明码,其构成见表1所示。

这里用aa 6a 5a 4a 3a 2a 1a 0表示7个码元,s 0s 1s 2表示三个监督关系式中的校正子。

则s 0s 1s 2的值与错码位置的对应关系见表2所示。

由表1知,发送编码时,按下式决定监督位。

a 0=a 6 a 4 a 3a 1=a 6 a 5 a 3a 2=a 6 a 5 a 4第1卷 第1期2002年5月 北京工业职业技术学院学报JOURNAL OF BEI J INGVOCATIONAL &TECHNICAL INSTIT UTE OF INDUSTRY V ol.1№1M ay.2002表1信息位b 3b 2b 1b 0监督位c 2c 1c 0信息位b 3b 2b 1b 0监督位c 2c 1c 0a 6a 5a 4a 3a 2a 1a 0a 6a 5a 4a 3a 2a 1a00000000100011100010111001100001010110100100011110101100101001101100001010110111010100110011111010001110001111111表2S 2S 1S 0错码位置S 2S 1S 0错码位置001a 0101a 4010a 1110a 5100a 2111a 6011a 3000无错 由表2知,接收译码时,错码由下面的校正式决定。

如当a 6、a 5、a 4a 2位置出现一错码,校正子S 2为1,否则为0。

S 0=S 6 S 4 S 3 S 0S 1=S 6 S 5 S 3 S 1S 2=S 6 S 5 S 4 S 2通常,我们只考虑一位错的情况,两个以上误码同时在一个字节中出现的概率是极低的。

因此,(7,4)汉明码在字符传送中有其实用的价值。

单片机串行通信按字节(8位)传送即字符方式,其字节的发送与接收分两次编码、解码进行。

下面将以图1所示的系统,分析汉明码的编码与译码以及软件实现的过程。

2 单片机通信程序(文件DP J PR0.C )#include 〈reg51.h 〉#define uchar unsigned char #define S LAVE 02#define BL 0331第1期 刘业辉,单片机通信的汉明码 uchar idata buf [32];uchar badta flag ;sbit address =flag ^0Π3接收从机地址标志3Πv oid main (w oid ){ T MOD =0x20; Π3T ΠC1定义为方式23ΠT L1=0x f3;Π3置初值3ΠTH =0x f3;PC ON =0x00;TR1=1;SC ON =0x50; Π3串口为方式13ΠES =1;E A =1;Π3开串口中断3Πflag =0x00;while (1){;}}v oid ssio (v oid )interrupt 4using 1{ v oid receive (v oid );uchar a ,command ,i ;RI =0;ES =0; Π3关串口中断3Πwhile (!address )Π3接收PC 机发送的地址并与本机比较3Π{if (S BUF !=S LAVE ) { ES =1;g oto reti ;} S BUF =S LAVE ; Π3是本机地址,发回本机地址作应答3Π while (TI !=1);TI =0; address =1;ES =1;g oto reti ;}if (S BUF ==’s ’)transm it ();Π3接收PC 机命令3Πelse if (S BUF ==’r ’)receive ( );图3 单片机发送子程序else {flag =0;ES =1;}reti :}v oid transmit (v oid ) Π3发送数据块3Π{ uchar p ,a ,i ;S BUF =BL ;while (TI !=1);TI =0; Π3发送数据长度3Πdo{p =0; Π3清校验和3Π for (i =0;i <BL ;i ++) { S BUF =H M BM (buf [i ]&0x0f ); p +=S BUF ; Π3发送低半字节的汉明编码3Π while (TI !=1);TI =0; S BUF =H M BM (buf [i ]>>4) p +S BUF ; Π3发送高半字节的汉明编码3Π while (TI !=1);TI =0; } S BUF =p Π3发送校验和3Π while (TI ==0);TI =0; while (RI ==0);RI =0;}while (S BUF ==’F ’);Π3收到应答‘F ’,主机接收不正确,重发3Πflag =0x00;ES =1;}图4 单片机接收子程序流程v oid receive (v oid ){ uchar H MY M (uchar ch );41 北京工业职业技术学院学报 第1卷 uchar ch ,ch1,count ,p ,i ;rep1: while (RI !=1);RI =0 count =S BUF ;Π3接收数据字节数3Π while (1) { p =0; Π3清校验和3Π for (i =0;i <count ;i ++) { while (RI !^=1);RI =0 ch1=S BUF ; Π3接收一数据3Π p =p +ch1; ch =H MY M (ch1) while (RI !^=1);RI =0 ch =S BUF ;Π3接收一数据3Π p =p +ch1; ch =ch|(H MY M (ch1)<<4); bu f [i ]=ch ; } while (RI !=1);RI =0; if (S BUF ==p ) { S BUF =’0’; while (TI ==0);TI =0; break ; }Π3校验正确,发‘0’,置标志,准备下次3Π else { S BUF =’F ’; while (TI ==0);TI =0; g oto repl ; }Π3校验不正确,发‘F ’,重新接收3Π } flag =0;ES =1;}3 PC 机通信程序(文件PCPRO.C )Π3利用bioscom ()函数,采用查询方式从串口1发送一个字符功能的子函数sport 3Πv oid sport (char n ){ while (!bioscom (3,0,0)&0x2000))if (bioscom (1,ch ,0)&0x800){printf (“超时错误\n ”); exit (1);}}Π3利用bioscom 函数接收字符的功能。

查询方式从串口1接收一个字符的子函数rport ()3Πv oid rport (char n ){ while (!(bioscom (3,0,0)&0x0100)) if (kbhit ()) {getch (); exit (1); a =bioscom (2,0,0)&0x00ff ; return (a ); }}Π3PC 机发送文件子函数send f (),调用此函数可以设置从机(下位单片机)的工作参数3Π图5 PC 机发送文件函数流程v oid sendf (char slave ,chve ,char 3fname ){ FI LE 3fp ; char ch ,ch1,chh ; int handle ,cont ,sum =0; if ((fp =fopen (fname ,”r ”))==NU LL ); { printf (“不能打开输入文件!Πn ”) exit (1);}handle =fileno (fp );Π3取得文件句柄3Πcount =filelength (handle );51第1期 刘业辉,单片机通信的汉明码 Π3取文件总字节数3Πdo{ ch=slave; Π3发从机地址信号3Π sport(ch);}while(rport()!=slave);Π3直到收到应答信号为止3Πsport(’s’); Π3发送命令’s’3Πrep:sport(count);Π3发总字节数3Πfor(;count;count--){ ch=getch(fp);Π3从文件中取一字符3Π if(ferro(fp)) { printf(“读文件有错误\n”) break; } ch1=H M BM(ch&0x0f); sum=sum+ch1; Π3累加校验和3Π sport(ch1); Π3发低半字节的汉明码3Π chh=H M BM(ch>>4); sum=sum+chh; sprt(chh);Π3发高半字节汉明码3Π } sport(sum);Π3发送累加校验和3Π if(rport()==’F’) { count=filelength(handle); Π3发送错误则重发3Π sum=0; fseek(fp,-count,1); Π3文件指针回退C OUNT字节3Π g oto rep; } else { fclose(fp); printf(“发送文件结束\n”) }}Π3PC机接收文件子函数receivef(),调用此函数可采集从机(下位单片机)数据并写入相关文件3Πv oid receivef(char slave,char3fname){ FI LE3fp char ch,ch1,chh; int count,tem p,sum=0; rem ove(fname);Π3盘上同名文件将删掉3Π图6 PC机接收文件函数流程if((fp=fopen(fname,“W”))==NU LL){ printf(“不能打开输出文件\n”); exit(1);}printf(“接收文件:%\n”,fname);do{ sport(slave);}while(rport()!=slave);Π3发送从机地址并等正确回应3Πsport(‘r’);Π3发命令‘r’接收从机数据3Πtem p=rport();Π3收总字节数3Πcount=tem p;rep:for(;count;count--){ ch1=rprt(); Π3从串口接收一个字符3Π sum=sum+ch1;Π3累加校验和3Π ch=H MY M(ch1);61 北京工业职业技术学院学报 第1卷 chh =rprt (); sum =sum +chh ; ch =ch|(H MY M (chh )<<4); putc (ch ,fp ); Π3将一个完整字符写入文件3Π sum =sun +ch ; if (ferror (fp )) { printf (“printf “写文件有错误!\n ”); exit (1); }}if (rport ()!=sum ){ ch =’F ’; sport (ch );Π3校验和有误,发‘F ’3Π count =tem p ; sum =0 fseek (fp ,-count ,1); Π3文件指针回退C OUNT 个字节3Π g oto rep ;}eles{ ch =’0’; sport (ch );Π3校验和正确,发‘0’3Π fclose (fp ); printf (“接收文件结束\n ”);}}Π3PC 机主函数3Π#include 〈stdio.h 〉#include 〈stdlib.h 〉#include 〈dos.h 〉main (int argc ,char 3argv[]){ while (argc !=4){ printf (“命令行命令不正确,请重新健入命令\n ”) exit (1);}bioscom (0,0x83,0);Π3串口初始化:1200波特,8数据位,无奇偶校验3Πif (tolower (3argv[1]==’s ’))send f (argv[2],argv[3]);else if (tolower (3avgv[1]==’r ’)receivef (argv[2],argv[3]);}图7 PC 机主程序流程4 汉明编译码函数的编写根据表1和表2给出的汉明码原理,编、译码函数分别如下。

相关文档
最新文档