2019-07-19 20:17发布
spritels 发表于 2019-2-18 11:31 当然,为了提高系统的可靠性,必要的出错处理机制还是要有的,比如说连续接收到两个一样的数据才采用,否则丢弃 ...
最多设置5个标签!
谢谢大哥的耐心讲解,代码我已经写好了,但是今天硬件在线调试的时候发现还是不行,当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]
一周热门 更多>