社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 4107|回复: 8

[求助] 如何用数组一次提取多个串口数据。。。。求大神。。。。。

[复制链接]

12

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2014-5-3 18:18:27 | 显示全部楼层 |阅读模式
10芯币
代码如下,想将串口2获取的数据(11个数据一包)保存到Re_buf数组中。。。。纠结好久了。。。。求大神
#include<stc12c5a60s2.h>
#define S2RI 0x01        //串口2接收中断请求标志位
#define S2TI 0x02        //串口2发送中断请求标志位
unsigned char flag1,flag2,temp1,b,temp2,c;
extern char Re_buf[11];
/****************串行口初始化函数****************/
void Inituart(void)
{
    TMOD = 0x20;    //定时器1工作在方式2  485528-1-1.html" target="_blank" class="relatedlink">8位自动重装
    SCON = 0x50;    //串口1工作在方式1  10位异步收发 REN=1允许接收
    TH1 = 0xFD;           //定时器1初值
    TL1 = TH1;
    TR1 = 1;           //定时器1开始计数
    EA =1;                   //开总中断
    ES =1;               //开串口1中断
        S2CON = 0x50;   //串口2工作在方式1  10位异步收发 S2REN=1允许接收
    BRT = 0xFD;           //独立波特率发生器初值
    AUXR = 0x10;    //BRTR=1 独立波特率发生器开始计数
    IE2 =0x01;        //开串口2中断  ES2=1
}
/****************串行口1发送****************/
void UART_1SendOneByte(unsigned char c)
{
    SBUF = c;
    while(!TI);           //若TI=0,在此等待
    TI = 0;         
}
/*****************主函数******************/
void main(void)
{
        int i=0;
        b=0xAA;
        c=0xCC;
    InitUART();        //串行口初始化
        while(1)
        {
                if(flag2==1)
                {
                        flag2=0;
                        if(Re_buf[0]==0x55)      //检查帧头
                      {
                      }
                }
        }       
}
/************串行口2中断处理函数*************/
void UART_2Interrupt(void) interrupt 8
{
        int i=0;
        for(i=0;i<10;i++)
        {
                if(S2CON&S2RI)
                {
                        Re_buf[i]=S2BUF;
                        S2CON&=~S2RI;
                }
        }                       
        flag2=1;
}

最佳答案

查看完整内容

给你示例,相当于伪代码:


回复

使用道具 举报

5125

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2014-5-3 18:18:28 | 显示全部楼层
本帖最后由 lcofjp 于 2014-5-3 19:53 编辑
fxmfxm9304 发表于 2014-5-3 19:39
恩,确实是第一次弄。。。。不能用循环那要怎么给数组赋值呢?求指导。。。。

给你示例,相当于伪代码:
  1. void ISR(void)
  2. {
  3.     static int index=0;
  4.     if (index == 0 && rx_byte == 0x55)
  5.     {
  6.         rx_buf[index++] = 0x55;
  7.     }
  8.     else if (index != 0)
  9.     {
  10.         rx_buf[index++] = rx_byte;
  11.         if (index > 10) {index = 0; rx_flag = 1;}
  12.     }
  13. }
复制代码


EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2014-5-3 18:25:05 | 显示全部楼层


回复

使用道具 举报

5125

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2014-5-3 18:27:36 | 显示全部楼层
数据包的话,要能判断头尾才行,否则来一个干扰数据,你就永远无法正确解析了。

点评

从中断那里判断吗?  详情 回复 发表于 2014-5-3 18:29
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2014-5-3 18:29:13 | 显示全部楼层
lcofjp 发表于 2014-5-3 18:27
数据包的话,要能判断头尾才行,否则来一个干扰数据,你就永远无法正确解析了。

从中断那里判断吗?我放在了main函数里判断的就是Re_buf[0]==0x55这个。。。。

点评

对,使用类似状态机的方法。  详情 回复 发表于 2014-5-3 18:29


回复

使用道具 举报

5125

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2014-5-3 18:29:48 | 显示全部楼层
fxmfxm9304 发表于 2014-5-3 18:29
从中断那里判断吗?

对,使用类似状态机的方法。

点评

我放在了main函数里判断的就是Re_buf[0]==0x55那个。。。。  详情 回复 发表于 2014-5-3 18:30
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2014-5-3 18:30:50 | 显示全部楼层
lcofjp 发表于 2014-5-3 18:29
对,使用类似状态机的方法。

我放在了main函数里判断的就是Re_buf[0]==0x55那个。。。。

点评

看你就是没怎么写过程序的,0x55要在中断中判断,判断出是0x55之后才能存到数据的第0个位置中。而且中断函数是不能像你那么写的(不能用循环)。  详情 回复 发表于 2014-5-3 18:42


回复

使用道具 举报

5125

TA的帖子

73

TA的资源

版主

Rank: 6Rank: 6

爱原创

发表于 2014-5-3 18:42:19 | 显示全部楼层
fxmfxm9304 发表于 2014-5-3 18:30
我放在了main函数里判断的就是Re_buf[0]==0x55那个。。。。

看你就是没怎么写过程序的,0x55要在中断中判断,判断出是0x55之后才能存到数据的第0个位置中。而且中断函数是不能像你那么写的(不能用循环)。

点评

恩,确实是第一次弄。。。。不能用循环那要怎么给数组赋值呢?求指导。。。。  详情 回复 发表于 2014-5-3 19:39
EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵


回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2014-5-3 19:39:47 | 显示全部楼层
lcofjp 发表于 2014-5-3 18:42
看你就是没怎么写过程序的,0x55要在中断中判断,判断出是0x55之后才能存到数据的第0个位置中。而且中断 ...

恩,确实是第一次弄。。。。不能用循环那要怎么给数组赋值呢?求指导。。。。

点评

给你实例,相当于伪代码: void ISR(void) { static int index=0; if (index == 0 && rx_byte == 0x55) { rx_buf = 0x55; } else if (index != 0) { rx_buf = rx  详情 回复 发表于 2014-5-3 19:51


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-11-20 17:39 , Processed in 0.439094 second(s), 18 queries , Redis On.

快速回复 返回顶部 返回列表