求路过的大哥指点下,卡在这点上一个多月了,一直调试有问题!

2019-07-19 20:17发布

小弟最近在做一款芯片,用的是STM8S003的芯片做的,根据客户定制给的通讯协议接收外部信号特定的字节,然后写入eerpom中,现在主要是协议复位吗没办法识别,求高手指点下,谢谢!小弟用的是串口接收的,串口设置的是9位数据(+1位停止位)-250K的波特率,通讯协议也是按到9位数据(+1位停止位)-250K的波特率这样来的,目前就是对这个2S复位码没办法具体识别出来!
麻烦看到的给个指点,感激不尽!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
胡松松
1楼-- · 2019-07-23 11:52
503126063 发表于 2019-2-14 15:26
检测到复位信号,你还测不出1S和2S区别吗?打开定时器检测

能麻烦说的详细点吗?我代码思路改怎么写, 小弟愚昧,初学单片机,见笑了,谢谢!
spritels
2楼-- · 2019-07-23 15:48
 精彩回答 2  元偷偷看……
spritels
3楼-- · 2019-07-23 20:26
当然,为了提高系统的可靠性,必要的出错处理机制还是要有的,比如说连续接收到两个一样的数据才采用,否则丢弃...
鄙人是做灯光的,走的都是DMX协议,我用的是S105这个系列的,处理这个卓卓有余了...我们还要处理按键,数码管扫描,还有别的外设...
胡松松
4楼-- · 2019-07-24 00:00
spritels 发表于 2019-2-18 11:31
当然,为了提高系统的可靠性,必要的出错处理机制还是要有的,比如说连续接收到两个一样的数据才采用,否则丢弃 ...

谢谢大哥的耐心讲解,代码我已经写好了,但是今天硬件在线调试的时候发现还是不行,当2S的信号发过来的时候,串口的2种状态都进去了,您可以的话帮我看下是不是哪里语句有问题,谢谢!
[mw_shl_code=c,true]#include "iostm8s003f3.h"
#include "Tim1.h"
unsigned char pwm[3];//={0,0,0};//接收数据缓存区
unsigned char check[8];
FlagStatus  DMX_display;
FlagStatus  check_flag ;
static unsigned int address_counter;      //串口接收数据长度
extern unsigned char counter;
/*************************************  
* 函数名称:Init_UART1  
* 函数功能:UART1 初始化
* 入口参数:无  
* 出口参数:无  
****************************************/
void Init_UART1(void)
{     
// CLK_PCKENR1 |= 0X04;  //使能USART1时钟
  
  UART1_CR1=0x10; //9位数据+1stop
  UART1_CR2=0x00;
  UART1_CR3=0x00;//1 stop
  // 必须先写BRR2
  // 例如对于波特率位250000时,分频系数=16000000/250000=64
  // 对应的十六进制数为0040,BBR1=04,BBR2=00
  
  UART1_BRR2=0x00;
  UART1_BRR1=0x04;
  
  UART1_CR2=0x2c;//允许接收,发送,开接收中断
}


/*************************************  
* 函数名称:UART1_RX_RXNE
* 函数功能:UART1 接收中断函数
* 入口参数:无  
* 出口参数:无  
****************************************/

#pragma vector=UART1_R_RXNE_vector
__interrupt void UART1_RX_RXNE(void)
{  
  unsigned char RxBuf=0;        //临时接收
  unsigned char temp;      
  static unsigned char RxData[513]; //临时接收数据缓存区   
  static unsigned char Rx_addressData[20]; //临时接收数据缓存区                                                                       
  static unsigned char start_code=0;    //判断start_code
  static unsigned char  break1=0;  //判断break
  //FlagStatus  address_flag=0;    //判断address 模式下复位码
  static unsigned char address_start_code=0;    //判断start_code
  static unsigned char address_temp=0;    //判断start_code
   if(UART1_SR_RXNE==1)
  {
       UART1_SR_RXNE=0;   //清RXNE
      if (UART1_SR_OR_LHE)
        {
        // 发生过载错误,顺序读UART1_SR, UART1_DR来清UART1_SR_OR_LHE位
              RxBuf = UART1_SR;
              RxBuf = UART1_DR;    // 做一些错误处理 清OR   
        }
     else
    {                                    
       RxBuf = UART1_DR;
      if(UART1_CR1_R8==0)   //判断第九位
       {
             TIM2_CR1 |= 0x80;//  关定时器
             temp = counter;  //读定时器计数的值;
             counter=0 ;//清0
             if(temp<10)     break1=1;  //显示模式-复位码小于1S
             else if((temp>10)&&(temp<21))  break1=2;  //复位码大于1S小于2S模式
               //break1=1;
        }
      if (break1==1)    //显示模式-复位码小于1S
        {
          start_code=0;
          address_counter=0;
          DMX_display=0;
         }
          if((address_counter==0)&&( RxBuf==0))
            {
              start_code=1;            
            }
            
          if (start_code==1)
            {
              RxData[address_counter] =RxBuf;
              address_counter++ ;
              if(address_counter>512)
              {
                break1=0; start_code=0; address_counter=0;
                DMX_display=1;
                pwm[0]= RxData[2];
                pwm[1]= RxData[3];
                pwm[2]= RxData[4];
              }
            }
         //}
      if(break1==2)  //复位码大于1S小于2S
         {
           address_start_code=0;
           address_temp=0;
           check_flag=0;  
          }
           if((address_temp==0)&&( RxBuf==0))
             {
                address_start_code=1;    //收到start_code
                DMX_display=0;  //黑屏           
             }
           if((address_start_code==1)&&(PB_IDR_IDR5==1))
             {
                Rx_addressData[address_temp] =RxBuf;
                address_temp++ ;
                if(address_temp>10)
                {
                  break1=0; address_start_code=0; address_temp=0;
                  check_flag=1;
                  check[0]= Rx_addressData[2];
                  check[1]= Rx_addressData[3];
                  check[2]= Rx_addressData[4];
                  check[3]= Rx_addressData[5];
                  check[4]= Rx_addressData[6];
                  check[5]= Rx_addressData[7];            
                  check[6]= Rx_addressData[8];
                  check[7]= Rx_addressData[9];
                }
             }
          }
     }
   //}
}[/mw_shl_code]
胡松松
5楼-- · 2019-07-24 00:30
 精彩回答 2  元偷偷看……
spritels
6楼-- · 2019-07-24 03:41
大GUO~你的串口中断服务一看就太长了啦...像那些什么判断复位码长度,显示模式什么的,完全应该放在外面来做啦...
而且,你串口中断一次,其实只收到了一个数据而已,你的check[0]~check[7]一共八个数据,你往哪里取....

一周热门 更多>