单片机串口通信数据接收问题?

我上位机是用MSCOMM控件,以数组的形式向下位机发送数据,下位机串口中断程序是;
recv0:
clr RI
JB 00h,recv1 ;数据总数标志
mov a, SBUF
mov R7,a
mov sbuf,a
jnb TI,$
clr TI
mov 25h,a ;暂存总数
setb 00h ;置数据总数标志
setb ES
reti
recv1:
CLR RI
JB 01h,recv2 ;开始接受数据
mov a ,sbuf
mov r0,#30h ;把数据存入开始地址为30h的连续单元中
mov @r0,a
mov sbuf,a
jnb TI,$
clr TI
inc r0
djnz r7,recv2
setb 01h
setb 02h
mov r0,#30h
mov r7,#0
recv2:
setb ES
reti
但是我进过调试,发现程序没运行到setb 01h setb 02h这个地方,波特率是正确,如果我在上面程序段里加入发送程序,将收到的数据发回上位机,上位机显示都对的,但是为什么就没运行到setb 01h setb 02h这个地方。请大侠们为我看看,这里感觉很巧妙~~~

程序编写的思路正确。
MSCOMM控件连续发出几十个字节,其中第一个字节代表数据字节数。
单片机收到第一个字节,存入R7,充当后面的、接收字节数的循环次数。
以后的接收字节,以R0间接寻址存放。
但是,RO,每次都送初值#30H,是错误的。
其它的,都可以。

本程序,当MSCOMM控件连续发:04、10、78、3A、5B、26、7B....
单片机应该回送给MSCOMM控件:04、10、78、3A、5B。
如果是这样,setb 01h setb 02h就是运行了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-11-28
你在上面的程序中有寄存器R7,但是你在下面用DJNZ R7指令,能够保证R7减到0吗,不知道你用DJNZ R7指令有什么用,所以是不能运行到SETB 01H的;

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网