STM32F103 串口模拟 DMX512 发送程序错误分析与修正
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++;
}
}
}
错误分析
- 函数定义没有包括返回值类型和参数列表。
- 指针 pDMX_buf 没有初始化,应该指向 DMX_buf 数组的首地址。
- while 循环条件中应该是小于号
<,而不是小于等于号<=,否则会超出数组边界。 - 发送起始码时,应该将 DR 的低 8 位设置为 0x00,而不是将第 9 位清零。
- 发送数据包时,应该使用指针变量 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++;
}
}
}
优化建议
- 使用
USART_SR_TXE常量代替(1<<6)来表示发送缓冲区空标志位,提高代码可读性。 - 将
DMX_buf作为参数传入函数,方便程序调用和数据传递。 - 在发送起始码和数据包时,分别使用
if和else语句,提高代码逻辑清晰度。
通过以上分析和修正,我们可以得到一个更加完善的 STM32F103 串口模拟 DMX512 发送程序,帮助开发者实现正确的数据发送。
原文地址: https://www.cveoy.top/t/topic/oq3c 著作权归作者所有。请勿转载和采集!