【0】灯光亮化——————DMX数据接收

  1. 简述
    1. 协议详解请参阅之前文章:https://blog.csdn.net/Linux_ARM9/article/details/106365272
  2. 硬件平台
    1. STM8
  3. 解码原理
    1. DMX512实际是异步串口通信;

    2. 选用带串口功能的单片机,并且把串口频率设置为250Kbps;

    3. 因为有个起始码的原因,DMX512实际发的是513个数据帧;

    4. 做为起始码,数据帧为0,且第9位为0;后面的512个数据帧,第9位为1,根据这个特点,只要用串口工作方式3来判断第9位为0还是为1,就可确定是否是头码;

  4. 解码流程图

    1. 【0】灯光亮化——————DMX数据接收_第1张图片

  5. 例程

    1.  /*********************************************************
       * 函数名: @far @interrupt void Uart1_RxIrqHandleer(void)
       * 描述  :串口中断函数
       * 输入  :无
       * 输出  :无
       * 返回  :无 
       * 调用  :内部调用 
       **********************************************************/
      @far @interrupt void Uart1_RxIrqHandleer(void)
      {
      	if(UART1_SR & UART_RXNE)//判断是否为有效位,是只对RXNE清零;
      		UART1_SR &= 0xdf; 	
      	else
      		return ;//不是有效位;直接退出;
      	UART_DataCode = UART1_DR;
      	
      	//复位信号 00 
      	if(((UART1_CR1 & 0x80) == 0)&&(UART_DataCode == 0)) //复位信号
      	{
      		UART_BreakFlag = 1;
      		DMX_AddCount = 0;
      		DMX_ChannelCount = 0;
      		UART_ReceiveEndFlag = 0;
      		UART_DataCodeEndFlag = 1;
      		return ;
      	}
      	//起始码 00
      /*	if((UART_DataCode == 0)&&(UART_BreakFlag == 1))
      	{
      		UART_BreakFlag = 0; //本次数据包不在检测起始码;
      		UART_DataCodeEndFlag = 1;
      		return;
      	}*/
      	//数据包
      	if(UART_DataCodeEndFlag == 1)
      	{
      		if((DMX_AddCount >= DMX_AddMcu) && (DMX_ChannelCount < DMX_ChannelNum))
      		{
      			UART_DataBuf[DMX_ChannelCount] = UART_DataCode;
      			
      			DMX_ChannelCount++;
      			if(DMX_ChannelCount >= DMX_ChannelNum)
      			{
      				UART_DataCodeEndFlag = 0;
      				
      				UART_ReceiveEndFlag = 1;
      				
      				return ;
      			}
      		}
      		else
      				DMX_AddCount++;
      		return;
      	}
      }

       

  6. 总结

  7. 参考资料

    1. DMX协议官方文档:https://www.docin.com/p-2151506316.html

你可能感兴趣的:(DMX512)