打印

请教:简单的带缓冲的串口程序问题

[复制链接]
7174|68
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
klchang|  楼主 | 2011-11-9 15:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 klchang 于 2011-11-9 17:09 编辑

程序如下:
//使用串口,带缓冲的6字节数据收发
#include<reg52.h>
#define uchar unsigned char
uchar r_buf[6];   //接收缓冲区
uchar r_count;   //接收计数
bit r_finished;     //接收完成标志
void main()
{
uchar i;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
TR1=1;
EA=1;
r_finished=0;
r_count=0;
for(i=250;i>0;i--);
ES=1;
while(1)
{
  if(r_finished)
  {
   ES=0;
   for(i=0;i<6;i++)
   {
    SBUF=r_buf【i】;
    while(!TI);
    TI=0;
   }
   r_finished=0;
   ES=1;
  }     
}
}




void serial()interrupt 4 using 1
{
if(RI)
{
  r_buf[r_count]=SBUF;        /*接收*/
     RI=0;                     /*淸标志*/
     r_count++;                  /*下标+1*/
     if(r_count==6)    /*判断是否要置r_finished标志*/
  {
   r_finished=1;
   r_count=0;
  }
}
}

遇到问题是串口的发送数据和接受到的数据的顺序不一致,不知道是什么原因,请各位前辈指教!

此问题的图片如下

相关帖子

沙发
NE5532| | 2011-11-9 15:22 | 只看该作者
请先检查波特率。

使用特权

评论回复
板凳
klchang|  楼主 | 2011-11-9 15:26 | 只看该作者
回2楼:
波特率无问题,是9600 bps,而且如果波特率出问题,好像不应该数据正常。

使用特权

评论回复
地板
NE5532| | 2011-11-9 15:39 | 只看该作者
不见得就是你发出来的数据,你发一个、两个数据看下呢?

使用特权

评论回复
5
klchang|  楼主 | 2011-11-9 15:46 | 只看该作者
每次发6个字节的数据,每次显示如上图所示。
对于我写的程序,只有向单片机写满6个字节,才发回给上位机,因此无法只写1个字节、或2字节来在上位机显示

使用特权

评论回复
6
klchang|  楼主 | 2011-11-9 15:57 | 只看该作者
多次发送数据图片如下

使用特权

评论回复
7
NE5532| | 2011-11-9 16:00 | 只看该作者
程序能改一下,只收1个2个不?你不按我的建议调,我就没办法帮你了。

使用特权

评论回复
8
ayb_ice| | 2011-11-9 16:01 | 只看该作者
发送与接收缓冲区独立开试试

使用特权

评论回复
9
ShakaLeo| | 2011-11-9 16:02 | 只看该作者
SBUF=r_buf;是什么东东?r_buf好像是个数组名

使用特权

评论回复
10
klchang|  楼主 | 2011-11-9 16:09 | 只看该作者
回7楼:
谢谢!我按照你说的,改一下程序再试一下。

使用特权

评论回复
11
klchang|  楼主 | 2011-11-9 16:16 | 只看该作者
收发2个字节正常,如下图

使用特权

评论回复
12
NE5532| | 2011-11-9 16:17 | 只看该作者
很好,楼主可教。
再发2个、3个、4个,发到几个的时候出现问题,这个点就是你要去找的问题所在。

使用特权

评论回复
13
klchang|  楼主 | 2011-11-9 16:34 | 只看该作者
还是NE5532前辈教的好。
找到出问题的点了,发3个字节时出现问题,如下图所示

使用特权

评论回复
14
NE5532| | 2011-11-9 16:43 | 只看该作者
本帖最后由 NE5532 于 2011-11-9 16:45 编辑

呵呵,我给你说问题只能救你一时,给你说怎么做说不定可以帮你一世。今天手臂切了个小的皮脂腺囊肿,右手抬不起来,左手打的字,慢。也没认真看你程序。其实我也不知道你程序的问题在哪里,但是看来你已经知道怎么找问题了。恭喜~!

找问题就是这样,找到临界发生问题的点,去研究为什么会这样,3这个数字可以给你很大提示,比你埋头乱想管用得多。

使用特权

评论回复
15
ayb_ice| | 2011-11-9 16:46 | 只看该作者
SBUF=r_buf;是什么东东?r_buf好像是个数组名
ShakaLeo 发表于 2011-11-9 16:02

括号"[]"好象不能显示,程序本身肯定是有的

使用特权

评论回复
16
klchang|  楼主 | 2011-11-9 16:46 | 只看该作者
谢谢NE5532前辈!
虽然找到问题,也能解决此问题,但为什么会出现这个问题,还是不清楚?

使用特权

评论回复
17
klchang|  楼主 | 2011-11-9 16:48 | 只看该作者
NE5532前辈需要多注意身体!祝NE5532前辈早日康复!

使用特权

评论回复
18
klchang|  楼主 | 2011-11-9 16:55 | 只看该作者
本帖最后由 klchang 于 2011-11-9 17:05 编辑

回8楼:
我又定义了发送缓冲t_buf[3],把发送缓冲区和接收缓冲区分开,但问题依旧。程序如下:
                           for(i=0;i<3;i++)
                                 t_buf【i】=r_buf【i】;      
                         for(i=0;i<3;i++)
                        {
                                SBUF=t_buf【i】;
                                while(!TI);
                                TI=0;
                        }
                        r_finished=0;

使用特权

评论回复
19
ayb_ice| | 2011-11-9 16:58 | 只看该作者
你这是什么缓冲区分开

使用特权

评论回复
20
klchang|  楼主 | 2011-11-9 17:01 | 只看该作者
本帖最后由 klchang 于 2011-11-9 17:07 编辑

回9楼:

t_buf,r_buf均为带有i的数组元素,由于编辑器不支持英文下的中括号的效果不好,因此有的未显示出来。我用中文输入法下的中括号来代替

使用特权

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

本版积分规则

个人签名:个人理解,若有错误,敬请指正!

0

主题

606

帖子

3

粉丝