STM32F103 串口模拟 DMX512 发送程序错误分析与修正

下面是 STM32F103 串口模拟 DMX512 发送程序,其中存在一些错误:

void DMX_SendPacket(void) 
{
    pDMX_buf = 0;
    while (pDMX_buf <= 512) //1-512
    {
        /* send data packet to slaves*/
        if(USART1->SR & (1<<6))
        {
            /*发送起始码 00*/
            if (0 == pDMX_buf)
            {
                USART1->DR = ((USART1->DR) & 0xfe00);
                //第九位置0
            }
            else
            {
                USART1->DR = 0x0100 | DMX_buf[pDMX_buf];
                //第九位置1
            }

            pDMX_buf++;
        }
    }
}

错误分析

  1. 函数定义没有包括返回值类型和参数列表。
  2. 指针 pDMX_buf 没有初始化,应该指向 DMX_buf 数组的首地址。
  3. while 循环条件中应该是小于号 <,而不是小于等于号 <=,否则会超出数组边界。
  4. 发送起始码时,应该将 DR 的低 8 位设置为 0x00,而不是将第 9 位清零。
  5. 发送数据包时,应该使用指针变量 pDMX_buf,而不是数组名 DMX_buf。

修正后的代码

void DMX_SendPacket(uint8_t *DMX_buf)
{
    uint8_t *pDMX_buf = DMX_buf;

    while (pDMX_buf < (DMX_buf + 512))
    {
        if (USART1->SR & USART_SR_TXE)
        {
            if (pDMX_buf == DMX_buf) // 发送起始码
            {
                USART1->DR = 0x00;
            }
            else // 发送数据包
            {
                USART1->DR = 0x0100 | *pDMX_buf;
            }
            pDMX_buf++;
        }
    }
}

优化建议

  1. 使用 USART_SR_TXE 常量代替 (1<<6) 来表示发送缓冲区空标志位,提高代码可读性。
  2. DMX_buf 作为参数传入函数,方便程序调用和数据传递。
  3. 在发送起始码和数据包时,分别使用 ifelse 语句,提高代码逻辑清晰度。

通过以上分析和修正,我们可以得到一个更加完善的 STM32F103 串口模拟 DMX512 发送程序,帮助开发者实现正确的数据发送。


原文地址: https://www.cveoy.top/t/topic/oq3c 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录