打印

这样自定义51串口缓冲区(汇编)行么?

[复制链接]
2987|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
云痕|  楼主 | 2007-9-26 21:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
手头在做一个测试程序,需要将一些数据发送到PC,写了个发送缓冲管道,可怎么看怎么觉得别扭,请各位大侠帮忙看下?或者送我一个也好.设置发送缓冲区为60H~6FH,假设当下发送#58H.发送数据不在中断中

;系统上电时
MOV R0,#60H
MOV R1,#60H

;发送:
      CLR ES  ;禁止串口中断
      MOV A,R0
      XRL A,R1
      JZ loop1
      MOV SBUF,#58H 
      MOV A,R0
      XRL A,#70H
      JNZ  LOOP3 
      MOV R0,#60H  
      SJMP LOOP3

LOOP1:MOV A,R0
      XRL A,#70H
      JNZ LOOP2
      MOV R0,#60H
LOOP2:MOV @R0,#58H
      INC R0     
LOOP3:SEB ES

;串口中断处理,在中断中执行
       JB TI,LOOP6
       SJMP LOOP10
LOOP6: INC R1
       MOV A,R0
       XRL A,R1
       JZ LOOP10
       CJNE R1,#70H,LOOP7
       MOV R1,#60H
LOOP7: MOV SBUF,@R1

LOOP10:       ;其他

相关帖子

沙发
jerkoh| | 2007-9-26 22:34 | 只看该作者

程序中错挺多

程序中错误很多,像SEB ES     指令不对 
 JZ loop1和LOOP1:MOV A,R0   标识符不一样
还有TI也没清过等

使用特权

评论回复
板凳
5880527| | 2007-9-27 08:34 | 只看该作者

太乱

一、堆栈保护
二、发送每字节最好有个定时,根据波特率计算一下
三、最好发送序号用个变量,不要轻易用R0,R1,它俩很有用
四、没任何框架,不要就会个LOOP
五、......
   本想再说点什么的,可你那程序注解都没有,所以就难得看了。你要记得这不是学校,大家没有任何义务给你免费指导的,都是凭个兴趣,所以你想要让别人给你提供帮助你也就得提别人想想

使用特权

评论回复
地板
云痕|  楼主 | 2007-9-27 11:53 | 只看该作者

谢谢楼上2位.

2楼提到的标志符不一致,keil里不区分大小写的,都能编译过;SETB写成SEB是笔误,代码是在发送文本框内写的,没编译过,也没仔细校对,只是想说下思路,不好意思
回3楼:一、堆栈保护
堆栈后入先出,而发送数据是管道式的,得先入先出,要是再开个变量觉得有点麻烦
      二、发送每字节最好有个定时,根据波特率计算一下
我的目的就是可以抛弃发送的过程和状态,有数据发送请求时只要放进缓冲区,别的不管;允许在一个字节尚未发送完毕的过程中,或者响应TI之前,产生第二个或更多需要发送的数据,只要不超出缓冲区范围.
      三、最好发送序号用个变量,不要轻易用R0,R1,它俩很有用
嗯,我也觉得有点奢侈,留了一组R0,R1给串口数据用.

使用特权

评论回复
5
5880527| | 2007-9-27 17:48 | 只看该作者

呵呵

一、堆栈保护肯定要的,你每发送一字节它都会中断一次,而中断没个堆栈保护是不可能的。你再是什么所谓的管道式也不会整成你那样啊,划一片区域给发送数据做缓冲,一个循环下来又从头来嘛。
二、串口的波特率就那么快一点,我不知道一个劲的发送会出什么问题,没试过
三、如果你觉得51的128字节空间太大可以那样做
四、除了这个发送你的程序应该还有很多事情做的,大循环肯定解决不了问题

使用特权

评论回复
6
云痕|  楼主 | 2007-10-9 18:30 | 只看该作者

再改下,加注释

目的:发送时不需要考虑当前串口状态,也不关心过程,入缓冲就好
;系统上电初始化.
MOV R0,#60H       ;R0存储当前允许写的缓冲区地址.缓冲区地址60H~6FH
MOV R1,#60H       ;R1存储当前待发送数据的缓冲区地址.R1在指定数据发送完毕,接收到本数据的TI后inc.R0=R1即所有需要发送的数据均已经发送且收到TI

;数据入缓冲在非中断中.数据发送不考虑缓冲区耗尽产生数据覆盖
      CLR ES  ;禁止串口中断

      MOV A,R0            ;检测当前是否有未接受到的TI或者有未发送的数据,即本次待发送的数据写入缓冲区而非SBUF后仍旧会产生串口中断
      XRL A,R1
      JNZ loop1
      MOV SBUF,#58H              ;此时串口发送空闲,所有发送已经完成,且TI已经处理掉
      MOV A,R0       ;检测前次数据入缓冲是否已经进入6FH,前次更新后为70H,本次得翻转地址存入60H,指向61H
      XRL A,#70H             
      JNZ  LOOP0 
      MOV R0,#61H           ;检测R0=70H,即前次已经把6FH用掉,写入缓冲后R0更新为70H;本次写入后更新为61,相当于本次写入60H,允许写为61H
      SJMP LOOP3
LOOP0:INC R0                     ;因接受到TI后会INC R1,这里更新R0,使匹配
      SJMP LOOP3

LOOP1:MOV A,R0             ;串口尚有未发送,或者未接收处理TI,本次写入缓冲(非SBUF)后会产生串口发送中断
      XRL A,#70H
      JNZ LOOP2
      MOV R0,#61H
LOOP2:MOV @R0,#58H
      INC R0     
LOOP3:SETB ES       ;使能串口中断

;串口中断处理,在串口中断中执行
       JB TI,LOOP6
       SJMP LOOP10
LOOP6: CLR TI
       INC R1                   ;每次接收到TI再更新R1
       MOV A,R0
       XRL A,R1
       JZ LOOP10
       CJNE R1,#70H,LOOP7
       MOV R1,#60H
LOOP7: MOV SBUF,@R1

LOOP10:       ;其他

使用特权

评论回复
7
5880527| | 2007-10-9 19:36 | 只看该作者

突然觉得没弄清楚LZ的意图的

在前面瞎提建议有些不好意思的哈。把整个程序都写出来吧,要不真不知道要做什么了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

75

帖子

0

粉丝