打印

经验问题求助:串口缓冲数组大小的确定

[复制链接]
3074|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lastnew|  楼主 | 2007-10-12 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口发送时
现象:传送数据个数是buffer的约数的时候正常,否则出错

      0x23,0xa5,0xfd,0xe0,0xbb,0x0f,buffer是12
      发送1,2,3,4,6个数是正常,发送5个出错如:23 E0 A5 BB FD 23 E0 A5 BB FD 23 E0 A5 BB FD 23 E0 A5 BB FD 23 E0 A5 BB FD 23 E0 A5 BB FD 23 E0 A5 BB FD 23 E0 A5 BB FD 23 E0 E0 A5 BB FD 23 E0 A5 BB FD 23 E0 A5 BB FD  无规律

可能原因:程序使用循环队列有错

请教:一般怎么处理循环队列,防止数据覆盖,包括发送和接收过程

先谢谢大家

相关帖子

沙发
lastnew|  楼主 | 2007-10-12 18:46 | 只看该作者

这样问吧

如果我想要发送的同时可以写发送buffer,接收的同时可以处理前几次接收的数据,这样是不是要用循环队列?

如果用循环队列的话,一般对接收时的in指针和发送时的out指针怎么处理?

麻烦各位留下个印,给个大概方向也好啊

我现在用的方法还是有发5个就出错的情况,开始怀疑是不是用循环队列了

使用特权

评论回复
板凳
lurkers| | 2007-10-12 19:54 | 只看该作者

看不懂

使用特权

评论回复
地板
gamethink| | 2007-10-12 21:24 | 只看该作者

不一定

先做个程序测试,单片机接收一方,只单纯接收,成功马上保存在RAM,比如发50个,然后停止发送,把RAM里面数据发到电脑,看看是不是正确先

使用特权

评论回复
5
lastnew|  楼主 | 2007-10-15 09:20 | 只看该作者

经过检查,发现

编译器生成了这样的代码:
   134:                 if(prOut-rev_buff>=REV_BUFF_SIZE) 
C:0x0677    AF0A     MOV      R7,prOut(0x0A)
C:0x0679    7E00     MOV      R6,#0x00
C:0x067B    7B00     MOV      R3,#0x00
C:0x067D    7A00     MOV      R2,#0x00
C:0x067F    7971     MOV      R1,#rev_buff(0x71)
C:0x0681    AC02     MOV      R4,0x02
C:0x0683    AD01     MOV      R5,0x01
C:0x0685    C3       CLR      C
C:0x0686    EF       MOV      A,R7
C:0x0687    9D       SUBB     A,R5
C:0x0688    FF       MOV      R7,A
C:0x0689    EE       MOV      A,R6
C:0x068A    9C       SUBB     A,R4
C:0x068B    FE       MOV      R6,A
C:0x068C    C3       CLR      C
C:0x068D    EF       MOV      A,R7
C:0x068E    940C     SUBB     A,#datatemp(0x0C)
C:0x0690    EE       MOV      A,R6
C:0x0691    6480     XRL      A,#P0(0x80)
C:0x0693    9480     SUBB     A,#P0(0x80)
C:0x0695    4004     JC       C:069B
   135:                                 prOut=rev_buff; 
C:0x0697    7F71     MOV      R7,#rev_buff(0x71)
C:0x0699    8F0A     MOV      prOut(0x0A),R7
   136:         }

一段时间以前,有个朋友跟我说这种写法不好,没有弄懂为什么
        if(psIn-send_buff>=SEND_BUFF_SIZE)
            psIn=send_buff;
现在出现了上面的问题,才知道确实不好,因为从汇编代码来看,好像没有对指针进行预期的操作,出现了乱出数据的现象

现在请教大家上面的错误是怎么产生的,应该怎样解决这个问题,谢谢 

使用特权

评论回复
6
至尊宝| | 2007-10-15 15:37 | 只看该作者

你是想做个FIFO吧?

用两个指针,读和写分开...

使用特权

评论回复
7
lastnew|  楼主 | 2007-10-15 16:43 | 只看该作者

to:至尊宝

就是这个意思,现在做FIFO,用的也是2个指针,

现在想知道:当指针指到数组尾了一般怎么操作让它回到头形成一个循环队列

我这里用指针-数组首地址和bufferzize比较的办法,可以么

如果不行,需要用什么方法

如果可以,有没有更好的方法

使用特权

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

本版积分规则

62

主题

352

帖子

0

粉丝