打印
[STM32F3]

分享个自己写的串口控制Led程序

[复制链接]
3834|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大苏牙|  楼主 | 2016-1-30 15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、解决:
其实我写的代码本身没有太大问题,问题出现在我用的串口工具。
1、白天描述的UART连续发2个字符串,但只显示1个字符串。

其实2个字符串都已经发送,但是串口没有显示出来而已,我把显示方式切换到十六进制数时,就可以看到数据要比显示的多,是第一个和第二个字符串都有。

应该问题出现在那个00上,每一个字符串结束标示符,我程序中发送时,是吧整个字符串,连同结束标识一块都发送出去了,而这个串口调试助手在这里可能显示有问题。
我把程序改成这样,每次发送字符串时,串口中断发送字符串长度为原来长度减1.

结果重新运行,就可以显示2个字符串了。

2、其实换一个串口调试助手也可以看到此类问题:

结论,看来一个好的调试工具非常重要。

二、总结
接下来总结一下HAL库中串口UART中断发送数据的编程方法,给朋友们一起共享一下:
第一步:填充串口结构体变量huart2,使用HAL_UART_Init()函数初始化串口
  huart2.Instance = USART2;
  huart2.Init.BaudRate = 115200;
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
  huart2.Init.StopBits = UART_STOPBITS_1;
  huart2.Init.Parity = UART_PARITY_NONE;
  huart2.Init.Mode = UART_MODE_TX;
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  huart2.Init.OneBitSampling = UART_ONEBIT_SAMPLING_DISABLED ;
   huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HAL_UART_Init(&huart2);


沙发
大苏牙|  楼主 | 2016-1-30 15:28 | 只看该作者
第二步:在需要发送数据时调用HAL_UART_Transmit_IT()函数启动发送数据。
    HAL_UART_Transmit_IT(&huart2, (uint8_t *)TxBuffer1, TXBUFFERSIZE1 - 1);
第三步:串口自动启动发送中断,当每次中断时,自动进入中断USART2_IRQHandler()函数,调用库中的HAL_UART_IRQHandler()函数,这个函数不用大家编写,由库已经写好。
void USART2_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart2);
}
第四步:当串口中断发送完所有需要发送的数据时,自动调用HAL_UART_TxCpltCallback()这个串口发送完成的回调函数。在这里大家写上自己的串口发送完毕的处理事件,当然我这里将自定义的标志置位。
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
  UartReady = SET;
}
第五步:在主函数中,启动发送数据HAL_UART_Transmit_IT()函数后,要判断数据是否发送完成,即UartReady标志,当发现置1即知道数据发送完毕,之后清标志位,就可以进行下一次发送了。
   while (UartReady != SET)
    {
      ;
    }
    UartReady = RESET;


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

278

帖子

4

粉丝