打印

求助:关于PIC16F877A识别接收到串口数组来执行对应的操作

[复制链接]
1401|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
abadboy|  楼主 | 2013-10-28 13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC16F877A我需要接收几组不同的串口数据来执行不同的操作,但是要识别数组,不知怎么来实现:
请帮忙指点,可以举一组数据来供我参考,谢谢!
/********************************************************************************************
* RS232串行通迅实验
* CPU型号: PIC16F877A
* 晶振:    11.0592MHz (如果更换其他频率的晶振需要自已相应修改程序)
   //4MHz (如果更换其他频率的晶振需要自已相应修改程序)
* 说明:     串口调试软件波特率设为9600
   RD1 BUSY LED工作灯亮一直亮
* 作    者:abadboy
* 日    期:2013年10月28号

收到串口数据“SL00 换行 回车"即HEX”53 4C 30 30 0A 0D",RD2 LED亮
收到串口数据“NDWT"即HEX”4E 44 57 54",RD3 LED亮
//收到串口数据“V"即HEX"56",RD5 LED亮
//收到串口数据“PO00 空字符"即HEX"50 4F 30 30 00",RD7 LED亮
*********************************************************************************************/
#include<pic.h>              //包含单片机内部资源预定义
__CONFIG(0x3F32);
unsigned char RXDATA_SL00[] = {0x53,0x4c,0x30,0x30,0x0A,0x0D};
//**************************调用串口中断函数*****************
void interrupt usart(void) //串口中断函数,usart自己定义的名称;
{
    if(RCIE&&RCIF) //RCIE=1接收中断允许,RCIF=1接收中断判断是否为串口接收中断
    TXREG=RCREG;   //把接收到的数据发送回去
}
//**************************调用延时函数*****************
void delay1ms (unsigned int i)
{
unsigned char j;
while (i--)
{
    for (j = 0; j < 244 ; j ++ ){} //j < 244,11.0592M晶振对应1ms基准延时;
    //for (j = 0; j < 88 ; j ++ ){} //j < 88,4M晶振对应1ms基准延时;
}
}
//**************************调用LED指示函数*****************
void LED2_OUT() //LED2取反亮灭变化;
{
    RD2 = 0;delay1ms(1000);RD2 = 1;delay1ms(100);
}
void LED3_OUT() //LED3取反亮灭变化;
{
    RD3 = 0;delay1ms(1000);RD3 = 1;delay1ms(100);
}
/*
void LED4_OUT() //LED2取反亮灭变化;
{
    RD5 = 0;delay1ms(1000);RD5 = 1;delay1ms(100);
}
void LED5_OUT() //LED2取反亮灭变化;
{
    RD7 = 0;delay1ms(1000);RD7 = 1;delay1ms(100);
}
*/
//**************************调用初始化设置*****************
void init () //
{
  //**********配制输出端口***********************
  TRISD1=0;TRISD2=0;TRISD3=0;TRISD5=0;TRISD7=0; //设置灯D1 D2 D3 D5 D7为输出
  //**********配制输入端口***********************
  TRISC=0XFF;     //设置C口方向全为输入,不设置为输入,用串口会出问题
  //**********配制串口设置***********************
  //SPBRG=5;          //11.0592M晶振SPBRG值为5对应设置的波特率为115200BPS
  //SPBRG=25;          //4M晶振SPBRG值为25对应设置的波特率为9600BPS
  SPBRG=71;          //11.0592M晶振SPBRG值为71对应设置的波特率为9600BPS
  TXSTA=0X24;          //使能串口发送,选择高速波特率
  RCSTA=0X90;          //使能串口工作,连续接收
  RCIE=0X1;             //使能接收中断
  GIE=0X1;              //开放全局中断
  PEIE=0X1;             //使能外部中断
}
//========================================================================
//波特率计算公式: BRGH=1时(高速模式)SPBRG=Fosc/(16 * 波特率)-1
//
//TXSTA=0x24=0010_0100:_ 8位发送 发送使能 异步 _ 高速波特率模式 TSR满 无校验
//RCSTA=0X90=1001_0000:使能 8位 _ _ 允许禁止连续接收 _ 无溢出错误 不接收数据第9位
void main()
{
    init ();
    RD2=1,RD3=1,RD5=1,RD7=1;    //按键指示LED灯默认不亮
RD1 =0,delay1ms(500),RD1 =1,delay1ms(500),RD1 =0;  //开机启动BUSY灯亮灭一次
    while(1)              //等待中断
    {
    //**************************接收到串口数据为“V"(0x56)*****************
  if (RCREG == 0x56)
  {
      LED2_OUT(); //调用LED2输出
  }
    //**************************接收到串口数据为“SL00"*****************

    }
  }
沙发
wangch_sh| | 2013-10-28 17:54 | 只看该作者
那几组不同的数据个数一样吗?可以自己定义一个协议,根据帧头的不同来区分。

使用特权

评论回复
板凳
abadboy|  楼主 | 2013-10-28 20:40 | 只看该作者
数组个数不一样,有四个,也有六个

使用特权

评论回复
地板
taoyuruo| | 2013-10-30 14:11 | 只看该作者
你这种方法太不明智了吧,你弄一个“帧头+N数据+帧尾”多好,想处理什么就处理什么,而且数据接收不容易出错...

使用特权

评论回复
5
diweo| | 2013-10-30 16:28 | 只看该作者
这样行不行?
#define MAX_CMD_LENGTH    10
volatile char buffer[MAX_CMD_LENGTH];
volatile  char buff_pointer=0;
volatile char isCmd1Received=0;
...
Receive_ISR()
{
  buffer[buff_pointer++]= RCREG;
//判断
//假设接收到有效命令cmd1
isCmd1Received=1;
//清除buffer里数据
buff_pointer=0
}

...
int main()
{
....
while(1)
{
if(isCmd1Received)
{
//亮LED
}

}

}

使用特权

评论回复
6
abadboy|  楼主 | 2013-10-30 18:04 | 只看该作者
谢谢,我用你的方法试试看

使用特权

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

本版积分规则

6

主题

15

帖子

0

粉丝