打印
[51单片机]

51单片机 串口发送的数据 显示在12864上

[复制链接]
3390|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
空蝉001|  楼主 | 2015-6-10 23:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在做一个小实验,用串口调试发送一串数据,12866显示出串口发送的数据,同时单片机把发送的数据在发回串口调试的接收区,其中碰到一个很大的难题就是串口发送回来的数据要怎样存在一个数组呢?看了很多资料还没搞懂,c语言有点弱,求大神指导下,程序如下:
现在主程序主要是显示,中断程序里主要实现接收串口来的数据,并把数据存入数组,且发回上位机,显示的先不管,还没调,现在的问题是
如果使用 sendchar(SenData);可以把数据完整发回上位机,使用sendstring(SystemBuf); 发回来的数据不对而且乱,说明存入数组是有错,但不知道错在哪,求各位大神指导下了,先谢谢了!
void sendchar(uchar ch)  //串口送一个字节
{
    SBUF=ch;
        while(TI==0);
        TI=0;
}
void sendstring(uchar *p)   //送字符串
{

  while(*p!='\0')
  {
  sendchar(*p);
  p++;
}
}
void main (void)
{

               
        SCON = 0x50;      //REN=1允许串行接受状态,串口工作模式1                             
            TMOD|= 0x20;      //定时器工作方式2                    
                PCON|= 0x80;                                                         
                //TH1  = 0xFD;     //baud*2  /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
                TH1 = 0xF3;                                        // //baud*2  /*  波特率4800、数据位8、停止位1。效验位无 (12M)
            TL1 = 0xF3;         
                TR1  = 1;                                                            
                ES   = 1;        //开串口中断                  
                EA   = 1;        // 开总中断
                lcd_init(); //初始化LCD
       
       
         

        while(1)
    {
       
         // if (Flag==1)
          {
                 
         
                  lcd_pos(1,0);
                 
for(i=0;i<16;i++)
{        lcd_wdat(SystemBuf[i]);
delay1(1);
}
         
               
          }
          
          


}

}

/****************************************************
               串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{


if(RI == 1)        //RI接受中断标志
{
           ES=0;
        RI = 0;                    //清除RI接受中断标志
    ReData = SBUF;  //SUBF接受/发送缓冲器


  SystemBuf[Rx++]=SBUF;
  Rx=Rx&0X0F;


        SenData=ReData;

       
        Flag=1;
        ES=1;

}
if (Flag==1)
          {
                 
             ES=0;
               
                 sendchar(SenData);//单片机发送一个字节
                 //sendstring(SystemBuf); //单片机发送字符串
                //
               
                 Flag=0;

                 ES=1;
         }
}









相关帖子

沙发
ningling_21| | 2015-6-11 07:59 | 只看该作者
用9600波特率试试呢?

使用特权

评论回复
板凳
空蝉001|  楼主 | 2015-6-11 09:15 | 只看该作者
ningling_21 发表于 2015-6-11 07:59
用9600波特率试试呢?

波特率会影响到这么?主要问题是串口发送的信息,不知道怎样存在数组里,麻烦帮忙看看。

使用特权

评论回复
地板
ningling_21| | 2015-6-11 09:38 | 只看该作者
空蝉001 发表于 2015-6-11 09:15
波特率会影响到这么?主要问题是串口发送的信息,不知道怎样存在数组里,麻烦帮忙看看。 ...

SystemBuf[Rx++]=SBUF;   这样存不了吗

使用特权

评论回复
5
yueguang3048| | 2015-6-11 09:45 | 只看该作者
本帖最后由 yueguang3048 于 2015-6-11 10:06 编辑

if (Flag==1)
          {
                  
             ES=0;
               
                 sendchar(SenData);//单片机发送一个字节
                sendchar(SystemBuf); //单片机发送字符串 //你这里试试这样呢
                //
               
                 Flag=0;

                 ES=1;
         }
}

===================================一个标准的串口输入,串口收===========================================
#include <STC89C5xRC.H>

void Sendchar(unsigned char data1)  
{
        SBUF = data1;               //将待发送的字符送入发送缓冲器
        while(!TI);            //等待发送完成
        TI = 0;                     //发送中断标志请0
}
//字符串发送函数
void Sendstring(unsigned char *s)
{
        while(*s!= '\0')           //判断字符串是否发送完毕
        {
                Sendchar(*s++);        //发送单个字符
                //s++;                 //字符地址加1,指向先下一个字符
                //delay(5);
        }
}
//主函数
void main(void)
{
        unsigned char c = 0;
        SCON = 0x50;           //串口方式1 ,允许接收
        TMOD = 0x20;           //T1工作于方式2
        PCON = 0x00;           //波特率不倍增
        TL1 = 0xfd;              //波特率设置
        TH1 = 0xfd;            //
        EA = 1;                    //开总中断
        ES = 1;               //开串口接收中断
        //TI = 0;
        TR1 = 1;             //定时器开启
        //delay(200);
        Sendstring("Receiving ............\r\n");         //串口向终端发送字符串,结尾处回车换行
        Sendstring("----------------------\r\n");
       
        while(1)
        {

        }
}
void revdata(void) interrupt 4
{
        unsigned char temp;
        if(RI==0)
                return;         //如果没有接收中断标志,返回
        ES = 0;            //关闭串口中断
        RI = 0;            //清串行中断标志位
        temp = SBUF;        //接收缓冲器中的字符
        Sendchar(temp);        //将接收的字符发送出去----------------------------------------------------------------
        ES = 1;                 //开启串口中断
}

使用特权

评论回复
6
空蝉001|  楼主 | 2015-6-11 13:04 | 只看该作者
ningling_21 发表于 2015-6-11 09:38
SystemBuf[Rx++]=SBUF;   这样存不了吗

如果使用 sendchar(SenData);//单片机发送一个字节   串口发送“ASDFG”,串口就能接收到完整的“ASDFG”,
                 如果使用//sendstring(SystemBuf); //单片机发送字符串   串口发送“ASDFG”,串口收到的是”AS“,再发送一次,收到的是”ASAS“,依此类推,都只能收到前面的两个字节。

使用特权

评论回复
7
ningling_21| | 2015-6-11 14:13 | 只看该作者
空蝉001 发表于 2015-6-11 13:04
如果使用 sendchar(SenData);//单片机发送一个字节   串口发送“ASDFG”,串口就能接收到完整的“ASDFG” ...

把你的串口中断改一下,如下

void revdata(void) interrupt 4
{

        if(RI==1)
               
        RI = 0;            //清串行中断标志位
        SBUF= SBUF;        //接收缓冲器中的字符
        }
      if( TI==1)
{
   TI=0;
}
}

使用特权

评论回复
8
kaly_liu| | 2015-6-11 18:17 | 只看该作者
看着好熟悉的赶脚··

使用特权

评论回复
9
ta1ent| | 2015-6-11 20:22 | 只看该作者
代码写的有点乱喔~~

使用特权

评论回复
10
空蝉001|  楼主 | 2015-6-11 21:21 | 只看该作者
ningling_21 发表于 2015-6-11 14:13
把你的串口中断改一下,如下

这样没问题,发送什么就接收到什么

使用特权

评论回复
11
空蝉001|  楼主 | 2015-6-11 21:23 | 只看该作者
kaly_liu 发表于 2015-6-11 18:17
看着好熟悉的赶脚··

哈哈,很正常,都是网上历程,自己再改改

使用特权

评论回复
12
空蝉001|  楼主 | 2015-6-11 21:24 | 只看该作者
ta1ent 发表于 2015-6-11 20:22
代码写的有点乱喔~~

还好吧,很多是调试用的没删掉

使用特权

评论回复
13
空蝉001|  楼主 | 2015-6-11 21:26 | 只看该作者
ningling_21 发表于 2015-6-11 14:13
把你的串口中断改一下,如下

这样肯定没问题了,显示我主要是想把接受SBUF里的数据,转换成字符串,然后存在数组里,能用于显示,没想到现在存在数组这个过程出问题了

使用特权

评论回复
14
ta1ent| | 2015-6-12 00:21 | 只看该作者
空蝉001 发表于 2015-6-11 21:24
还好吧,很多是调试用的没删掉

代码风格不太好。个人感觉模块化一些比较好。

使用特权

评论回复
15
ningling_21| | 2015-6-12 08:18 | 只看该作者
空蝉001 发表于 2015-6-11 21:26
这样肯定没问题了,显示我主要是想把接受SBUF里的数据,转换成字符串,然后存在数组里,能用于显示,没想 ...

先从简单的入手,先显示接收到的一个字符试试看

使用特权

评论回复
16
jpaekeo| | 2016-5-26 00:33 | 只看该作者
楼主最后做出来没有

使用特权

评论回复
17
worldcat| | 2018-6-9 16:45 | 只看该作者
楼主大大 能发下代码吗

使用特权

评论回复
18
天命风流| | 2018-6-11 13:23 | 只看该作者
赞           

使用特权

评论回复
19
yzcook| | 2018-6-11 16:48 | 只看该作者
串口初始化改下就行了。 数组要多大自己改,,

unsigned char sum,num;
unsigned char   RBuf[30];
void SendByte(unsigned char dat);
void ConfigUART();

void main()
{
       
        ConfigUART();
        sum = num = 0;
        while(1)
        {
                if(num != sum)
                {                       
                        SendByte(RBuf[num-1]);

                        if(sum>=99)
                                sum= 0;
                        else
                                sum++;
                ES = 1;

                }
        }
}


void ConfigUART()
{
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFB;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
}

void Uart_Isr() interrupt 4 using 1
{       
        if(RI)
        {       
          RBuf[num] = SBUF;  
                if(RI)
                RI = 0;
               
                if(num>=29)
                        num= 0;
                else
                        num++;
        }
}



void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
      TI = 0;
}

使用特权

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

本版积分规则

13

主题

388

帖子

3

粉丝