串口收发字符串的问题的!!!
<P>最近在调试串口时,遇到个奇怪的问题,收发字符串时总是把最后一个接受再最前面了:</P><P> </P>
<P>例如:发送:123456789 而接收的是 912345678</P>
<P> 发送:ABCDEFGHI 而接收的是 IABCDEFGH</P>
<P> </P>
<P>总是这样,接受无数次都一样,有没有人知道为什么啊,指点一下,谢谢!!!</P> 我觉得得看看原程序,是不是接受数组或者发送时的问题。 代码很简单:
/**************************************************************************************
* 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++); // 发送数据
}
} 代码上看不出问题,单步跟踪一下
回复 4楼 fengzhang2002 的帖子
单步也是一样的,会先收到最后一个。 uint8 const *str?回复 楼主 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> <div class='shownolgin' data-isdigest='no'>一样,都是错的,</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>一样,都是错的,偶尔也是对的!</div><script>showreplylogin();</script>先用示波器确定一下是,收错了,还是发错了好不?
<div class='shownolgin' data-isdigest='no'>这是个人的调试水平问题.</div><script>showreplylogin();</script>回复 10楼 qushaobo 的帖子
<div class='shownolgin' data-isdigest='no'>怎么测试,刚好换了个位置,数据都是对的啊</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>你是不是一直循环发送的???从你的程序来看,看不出什么问题。
建议LZ把完整的程序铁出来</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>应该是你PC的问题吧,是用什么软件接受数据的?串口调试助手,估计是你这个pc上的软件的bug</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'><P>for (; n>0; n--)</P>
<P>这个程序里面赋值的问题,你修改一下这里的程序看看。</P></div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>谢谢各位的热心帮助,下面附代码,MDK4.12编写。</div><script>showreplylogin();</script>
回复 13楼 bluehacker 的帖子
<div class='shownolgin' data-isdigest='no'>用PC的串口调试软件也是这样,用两个控制器测试也一样。</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>LZ有示波器没有?有的话你把发的数据抓下来看,到底是发送端的问题,还是接收端的问题,一下就明了了</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>把PC机uart的fifo关掉再试一试。</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'>谢谢各位,找个示波器试试。</div><script>showreplylogin();</script> <div class='shownolgin' data-isdigest='no'><p>老帖子了,</p><p>void Uart0GetStr(uint8 *s,uint32 n)<br />
{<br />
for (; n>0; n--)<br />
{<br />
*s++ = Uart0GetBety();<br />
}<br />
}</p>
<p>把n>0改成n>=0试试呢?</p>
</div><script>showreplylogin();</script>
页:
[1]
2