BinWin 发表于 2021-6-12 19:28

ART-Pi评测 串口收发功能及数据帧识别

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp; &nbsp; &nbsp; &nbsp;按照计划,这次改配置一下串口了。打开CubeMX的工程文件,根据原理图选择输出到调试器的串口号,应该是UART4 ,这样的好处是对照上位机收发方便,无需另外使用USB转串口的线材。如下图配置</span></span></p>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">&nbsp; &nbsp; &nbsp; &nbsp;记得开启中断,生成代码后更新一下MDK编辑器就好。然后初始化代码中已经有了UART4的基础配置,这里除了开始接受中断,另外加上空闲中断,以便使用IDLE来做简单的帧识别,也就是能够简单的做到不定长度的帧结构处理。HAL库封装的函数也是用起来比较方便的,在串口初始化的用户代码空间内添加两行</span></span></p>

<pre>
<code class="language-cpp">__HAL_UART_ENABLE_IT(&amp;huart4,UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&amp;huart4,UART_IT_IDLE);</code></pre>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">然后就可以写中断服务函数里的处理代码了,这里还是优先测试收发,所以收到的内容再原样发出去,代码如下:</span></span></p>

<pre>
<code class="language-cpp">void UART4_IRQHandler(void)
{
/* USER CODE BEGIN UART4_IRQn 0 */
        static uint8_t RecvBuffer, BufferSize;
/* USER CODE END UART4_IRQn 0 */
//HAL_UART_IRQHandler(&amp;huart4);
/* USER CODE BEGIN UART4_IRQn 1 */
        if(RESET != __HAL_UART_GET_FLAG(&amp;huart4,UART_FLAG_RXNE)){       
               
                RecvBuffer = UART4-&gt;RDR;       
        }
       
        if(RESET != __HAL_UART_GET_FLAG(&amp;huart4,UART_FLAG_IDLE)){
               
                __HAL_UART_CLEAR_IDLEFLAG(&amp;huart4);
               
                HAL_UART_Transmit(&amp;huart4,RecvBuffer,BufferSize,0xff);
                BufferSize = 0;
        }

/* USER CODE END UART4_IRQn 1 */
}
</code></pre>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">可以使用库中原有的</span><span style="font-family:Calibri">HAL_UART_IRQHandler(&amp;huart4);</span><span style="font-family:&quot;Microsoft YaHei&quot;">函数,然后重写回调函数,也可以按照我这样的直接粗暴,当然这里用寄存器写是最好不过了。</span></span></p>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">以上内容做好,就可以用PC上位机来测试一下了,事实与预期一致,收发完全吻合</span></span></p>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">以上是空闲中断作为不定长度帧的识别方式,但这种方式也并不完美,要根据实际应用来选择,不完美的地方我记得ST有篇官文应用笔记说明过,可以再找出来看看。补充另一种方式,按字节识别的方法,可用于帧结构明确的情况的下的处理。代码结构如下:</span></span></p>

<pre>
<code class="language-cpp">if(RESET != __HAL_UART_GET_FLAG(&amp;huart4,UART_FLAG_RXNE)){
               
                Recv = UART4-&gt;RDR;
               
                switch(status){
                       
                        case 0:

                                       
                                status = 1;
                               
                                break;
                               
                        case 1:
                                status = 2;
                       
                        case 2:
                               
                                RecvBuf[++count] = Recv;
                                                       
                                //帧结构完整
                                {
                                        status =0;
                                        count= 0;
                                }
                               
                                break;
                       
                               
                        default:break;
                               
                }
}</code></pre>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">串口处理就到这里,基于ST的便捷工具和arm MDK的强大环境,使得开发过程越来越省心,不得不提一下,厂家的板卡也设计的很实在,板载调试器,完美治愈了我这种不喜欢扯很多线的臭毛病。</span></span></p>

Jacktang 发表于 2021-6-13 10:58

<p>事实与预期一致</p>

<p>不只是ST的便捷工具和arm MDK的强大环境确实很便捷</p>

<p>是楼主技术高</p>

<p>&nbsp;</p>

BinWin 发表于 2021-6-13 13:14

Jacktang 发表于 2021-6-13 10:58
事实与预期一致

不只是ST的便捷工具和arm MDK的强大环境确实很便捷

是楼主技术高

&nbsp;

<p>着实过奖<img height="63" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/victory.gif" width="61" /></p>

freebsder 发表于 2021-6-15 17:27

<p>谢谢分享,期待后续!</p>
页: [1]
查看完整版本: ART-Pi评测 串口收发功能及数据帧识别