打印

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

[复制链接]
3270|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mzhang_dhu|  楼主 | 2009-2-7 22:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题。
大概流程是利用串口助手发送一个字符串到单片机,在lcd1602上显示。
我原来的思路是定义一个全局数组,单片机每一次SBUF上的数据存放在数组里。
程序如下:

//每一次中断,把接收到的字符存放在数组里
void receive() interrupt 4 using 1
 {
       if(RI)
       {
             input[t] = SBUF;             
             t++;            
             SBUF = input[t];  //返回接收值
             if(TI)
             TI = 0;
             RI=0;
       }
       
 }

void main(void)
 { 
   t = 0;
   initialLcd1602(); //1602初始化
   serial();    //串口初始化函数
    
   while(1)     
   { 
   if(t == 16)
   display_string(0,0,input);  //1602显示字符串     
   }
 }  
其中,input[16]和t为全局变量。
但结果要么没有显示,要么就显示第一个。我想应该是数组没有很好的赋值。

接收单个字符没有问题,但是字符串就是有问题了。SBUF不是每次中断只接收一个8位的字节吗?为什么不能把接收到的值存到那个全局数组呢?
还望高手大侠帮帮忙阿~~

相关帖子

沙发
纪小刚| | 2009-2-9 10:46 | 只看该作者

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

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

使用特权

评论回复
板凳
zcq3535088| | 2009-2-9 15:31 | 只看该作者

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

将if(TI)
改成while(TI)试试。

使用特权

评论回复
地板
zcq3535088| | 2009-2-9 15:37 | 只看该作者

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

不好意思,应修改为while(TI==0);

使用特权

评论回复
5
zxypds| | 2009-2-12 17:21 | 只看该作者

学习了

使用特权

评论回复
6
yy温控| | 2009-10-19 09:34 | 只看该作者
楼主问题解决了吗?
解决了大家分享点成功的经验
:)

使用特权

评论回复
7
myl0913| | 2009-10-20 13:29 | 只看该作者
呵呵,很好,学习了

使用特权

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

本版积分规则

25

主题

66

帖子

0

粉丝