zhaojun_xf 发表于 2010-7-13 17:28

串口收发字符串的问题的!!!

<P>最近在调试串口时,遇到个奇怪的问题,收发字符串时总是把最后一个接受再最前面了:</P>
<P>&nbsp;</P>
<P>例如:发送:123456789&nbsp; 而接收的是 912345678</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 发送:ABCDEFGHI&nbsp; 而接收的是 IABCDEFGH</P>
<P>&nbsp;</P>
<P>总是这样,接受无数次都一样,有没有人知道为什么啊,指点一下,谢谢!!!</P>

chenxinli 发表于 2010-7-13 17:55

我觉得得看看原程序,是不是接受数组或者发送时的问题。

zhaojun_xf 发表于 2010-7-13 18:47

代码很简单:

/**************************************************************************************
* FunctionName   : Uart0GetBety()
* Description    : 串口接收字符串
* EntryParameter : NO
* ReturnValue    : U0RBR
**************************************************************************************/
uint8 Uart0GetBety(void)
{
        while ((U0LSR & 0x01) == 0)
        {
          ;                                    // 等待接收标志置位
        }

        return U0RBR;                           // 读取数据
}

/**************************************************************************************
* FunctionName   : Uart0GetStr()
* Description    : 向串口接收字符串
* EntryParameter : s 指向接收数组的指针;n 接收个数
* ReturnValue    : NO
**************************************************************************************/
void Uart0GetStr(uint8 *s,uint32 n)
{
    for (; n>0; n--)
        {
          *s++ = Uart0GetBety();
        }
}

/**************************************************************************************
* FunctionName   : Uart0SendByte()
* Description    : 向串口发送字节数据,并等待发送完毕
* EntryParameter : sendDat -- 要发送的数据
* ReturnValue    : NO
**************************************************************************************/
void Uart0SendByte(uint8 sendDat)
{
    U0THR = sendDat;                            // 发送数据

        while ((U0LSR & 0x40) == 0)
        {
          ;                                              // 等待发送完毕
        }
}

/**************************************************************************************
* FunctionName   : Uart0SendStr()
* Description    : 向串口发送字符串
* EntryParameter : str 要发送的字符串指针
* ReturnValue    : NO
**************************************************************************************/
void Uart0SendStr(uint8 const *str)
{
        while (1)
        {
          if (*str == '\0')
                {
                  break;
                }

                Uart0SendByte(*str++);                // 发送数据
        }
}

fengzhang2002 发表于 2010-7-13 22:08

代码上看不出问题,单步跟踪一下

zhaojun_xf 发表于 2010-7-14 05:37

回复 4楼 fengzhang2002 的帖子

单步也是一样的,会先收到最后一个。

buyadong 发表于 2010-7-14 08:16

uint8 const *str?

kata 发表于 2010-7-14 10:46

回复 楼主 zhaojun_xf 的帖子

<div class='shownolgin' data-isdigest='no'>下电重启,只发送一次,看数据不是对了。</div><script>showreplylogin();</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

zhaojun_xf 发表于 2010-7-14 10:52

<div class='shownolgin' data-isdigest='no'>一样,都是错的,</div><script>showreplylogin();</script>

zhaojun_xf 发表于 2010-7-14 10:53

<div class='shownolgin' data-isdigest='no'>一样,都是错的,偶尔也是对的!</div><script>showreplylogin();</script>

qushaobo 发表于 2010-7-14 16:03

先用示波器确定一下是,收错了,还是发错了好不?

<div class='shownolgin' data-isdigest='no'>这是个人的调试水平问题.</div><script>showreplylogin();</script>

zhaojun_xf 发表于 2010-7-14 17:14

回复 10楼 qushaobo 的帖子

<div class='shownolgin' data-isdigest='no'>怎么测试,刚好换了个位置,数据都是对的啊</div><script>showreplylogin();</script>

jxb01033016 发表于 2010-7-15 08:54

<div class='shownolgin' data-isdigest='no'>你是不是一直循环发送的???

从你的程序来看,看不出什么问题。
建议LZ把完整的程序铁出来</div><script>showreplylogin();</script>

bluehacker 发表于 2010-7-15 08:55

<div class='shownolgin' data-isdigest='no'>应该是你PC的问题吧,是用什么软件接受数据的?串口调试助手,估计是你这个pc上的软件的bug</div><script>showreplylogin();</script>

njlianjian 发表于 2010-7-15 09:00

<div class='shownolgin' data-isdigest='no'><P>for (; n&gt;0; n--)</P>
<P>这个程序里面赋值的问题,你修改一下这里的程序看看。</P></div><script>showreplylogin();</script>

zhaojun_xf 发表于 2010-7-15 09:16

<div class='shownolgin' data-isdigest='no'>谢谢各位的热心帮助,下面附代码,MDK4.12编写。</div><script>showreplylogin();</script>

zhaojun_xf 发表于 2010-7-15 09:18

回复 13楼 bluehacker 的帖子

<div class='shownolgin' data-isdigest='no'>用PC的串口调试软件也是这样,用两个控制器测试也一样。</div><script>showreplylogin();</script>

lelee007 发表于 2010-7-15 19:39

<div class='shownolgin' data-isdigest='no'>LZ有示波器没有?有的话你把发的数据抓下来看,到底是发送端的问题,还是接收端的问题,一下就明了了</div><script>showreplylogin();</script>

kata 发表于 2010-7-16 00:14

<div class='shownolgin' data-isdigest='no'>把PC机uart的fifo关掉再试一试。</div><script>showreplylogin();</script>

zhaojun_xf 发表于 2010-7-16 05:19

<div class='shownolgin' data-isdigest='no'>谢谢各位,找个示波器试试。</div><script>showreplylogin();</script>

ljg2np 发表于 2024-10-30 17:22

<div class='shownolgin' data-isdigest='no'><p>老帖子了,</p>

<p>void Uart0GetStr(uint8 *s,uint32 n)<br />
{<br />
&nbsp; &nbsp; for (; n&gt;0; n--)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;*s++ = Uart0GetBety();<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
}</p>

<p>把n&gt;0改成n&gt;=0试试呢?</p>
</div><script>showreplylogin();</script>
页: [1] 2
查看完整版本: 串口收发字符串的问题的!!!