求助:单片机通过串口接收字符串问题

[复制链接]
4656|6
 楼主| mzhang_dhu 发表于 2009-2-7 22:49 | 显示全部楼层 |阅读模式
如题。<br />大概流程是利用串口助手发送一个字符串到单片机,在lcd1602上显示。<br />我原来的思路是定义一个全局数组,单片机每一次SBUF上的数据存放在数组里。<br />程序如下:<br /><br />//每一次中断,把接收到的字符存放在数组里<br />void&nbsp;receive()&nbsp;interrupt&nbsp;4&nbsp;using&nbsp;1<br />&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RI)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input[t]&nbsp;=&nbsp;SBUF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SBUF&nbsp;=&nbsp;input[t];&nbsp;&nbsp;//返回接收值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(TI)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;}<br /><br />void&nbsp;main(void)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;t&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;initialLcd1602();&nbsp;//1602初始化<br />&nbsp;&nbsp;&nbsp;serial();&nbsp;&nbsp;&nbsp;&nbsp;//串口初始化函数<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;if(t&nbsp;==&nbsp;16)<br />&nbsp;&nbsp;&nbsp;display_string(0,0,input);&nbsp;&nbsp;//1602显示字符串&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;}&nbsp;&nbsp;<br />其中,input[16]和t为全局变量。<br />但结果要么没有显示,要么就显示第一个。我想应该是数组没有很好的赋值。<br /><br />接收单个字符没有问题,但是字符串就是有问题了。SBUF不是每次中断只接收一个8位的字节吗?为什么不能把接收到的值存到那个全局数组呢?<br />还望高手大侠帮帮忙阿~~<br /><br />
纪小刚 发表于 2009-2-9 10:46 | 显示全部楼层

单片机通过串口接收字符串问题

我觉得你这里有问题,你这个就是利用串口把字符发到单片机然后又让单片机发回来,并在LCD上显示,过程应该是这样吧,但你的中断程序我觉得不对,就是这个:<br />void&nbsp;receive()&nbsp;interrupt&nbsp;4&nbsp;using&nbsp;1<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(RI)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input[t]&nbsp;=&nbsp;SBUF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SBUF&nbsp;=&nbsp;input[t];&nbsp;&nbsp;//返回接收值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />因为你接受到后RI就置位了,接着往下执行,到发送完一个字节的数据后if(TI)为真,又进入中断,是不又从头开始了,,这样应该只有一个字符可以显示,我觉得&nbsp;你应该再写一个函数,就是在中断的外面,可以进入的时候关了ES,然后出来的时候有开ES,这样应该可以的吧。不知道对不对,这学期刚学过,有可能忘了。<br />
zcq3535088 发表于 2009-2-9 15:31 | 显示全部楼层

单片机通过串口接收字符串问题

将if(TI)<br />改成while(TI)试试。
zcq3535088 发表于 2009-2-9 15:37 | 显示全部楼层

单片机通过串口接收字符串问题

不好意思,应修改为while(TI==0);
zxypds 发表于 2009-2-12 17:21 | 显示全部楼层

学习了

  
yy温控 发表于 2009-10-19 09:34 | 显示全部楼层
楼主问题解决了吗?
解决了大家分享点成功的经验
:)
myl0913 发表于 2009-10-20 13:29 | 显示全部楼层
呵呵,很好,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

66

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部