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

来源:百度知道 编辑:UC知道 时间:2024/06/10 05:15:51
我上位机是用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就是运行了。

你在上面的程序中有寄存器R7,但是你在下面用DJNZ R7指令,能够保证R7减到0吗,不知道你用DJNZ R7指令有什么用,所以是不能运行到SETB 01H的;