2000分 请教几个单片机串行通信的问题 (高手进)

来源:百度知道 编辑:UC知道 时间:2024/06/27 09:02:05
先谢谢各位有时间帮我解答问题,看在我从来都认认真真回答大家的问题,希望大家也认认真真回答我的问题,以后这个帖子对别人也会有用,分数只要我觉得满意,不止2000分,但一定要说在点子上,小弟在这里先行谢过。

我最近在做单片机的课题,用51控制指纹识别模块SM-6(杭州中正的),其实与指纹识别没有任何关系,就是串行通信的问题。我用的是汇编语言,51与模块是通过RS-232连接,模块与上位机通讯,对命令、数据、结果的接收和发送,都采用数据包的形式进行。

数据包格格式:

包标识 ,地址码保留字 , 包长度 ,包内容(数据) , 校验和

通讯波特率: 57600bps 单片机晶振 11.0592MHZ

这是最简单的一段模块与单片机通讯过程,来源于模块自带说明书:

1:上位机发指令:

01H +0000H + 01H + 03H + 0005H

2:模块发出应答:

收包正确,在100mS 内(典型时间2mS)应答 8181H ,继续下一步。
收包错误,在100mS 内应答 8282H 或8383H ,退出流程。

我的问题就在上面这些内容,问题是:

1. 单片机的初始值TL1是不是#0FEH,我算出来是这个,但不明白SMOD=1时,波特率倍增是啥意思,如果可以的话,给我说明一下理由。

2. 什么是数据包呀,搞了好几天都没明白,在上诉 《1:上位机发指令:》中,为啥有的是2位十六进制数,有的是4位十六进制数,那发数据,是发0005H 还是发05H,而且下边应答8181H也是个4位十六进制数,我就想问这是个数呀,还是个数据包,就这个过程,我就指的第一步到第二步的程序咋编,要汇编语言,要准确,我就要看看数据包咋发送,分数不是问题。

3.如果我把数据包发出去,就是第一步,等应答字8181H,这个过程,单片机该怎样收数据,是该收数据包,还是直接收,要程序。

就这三个问题,如果哪位高手你搞过类似的东西,例如控制其他的模块,请注明你搞过这类东西,我就单线

升级得还算快,我那时用的模块是SM-2,第一代比较成熟的指纹识别模块,现在都SM-6了。

首先通信一般以一个数据包的形式发送,而数据包的定义由自己定,你上面已经写的非常清楚,而发送的的内容也符合你的数据包的定义,可以这样解释01H (包标识 )+0000H (地址码保留字,一般多机通信时可能用)+ 01H (长度,表明后面有效数据就一个字节)+ 03H (数据)+ 0005H (校验和)
另外说明在这种写法中0005就表示发送2个字节
单片机如何收发程序,书上都会写,先判收发标志TI(发送),RI(接受),可以用中断,也可以用查询。
SMOD是波特率的倍频位,这个你看波特率的计算公式,改位可以由PCON寄存器设置

你这个很好控制的。
1、波特率是由TMOD、TH1、Tl1、SMOD和你的晶振决定的。
一般选用方式1和3:波特率=2^SMOD*(T1溢出率)/32
SMOD倍增就是怕你需要的波特率太大,给你加一倍的空间
其实我可以给你个51波特率设置软件,输入波特率和SMOD可以得到
初值,这样就不用为这个烦恼了。
2、数据包简单点说其实就是发送方依次发送数据,接收方来判断是否为包。
0005H当然是两个字节,0000H也是两个字节,预留的意思就是接收方只要知道
这是两个字节,而不去考虑它的大小(以后考虑时候再加程序),而把自己有用
的控制信息取出来,比如在发送方发三个字节,其中我只需要对第二个字节的大小做分析,除此之外要知道判断是否收到了三个字节就可以了。
3、数据包就是直接收
程序还没编写,如果要,我可以试着帮你编,qq308615823,加的话,注明下

是0005H