ART-Pi评测 串口收发功能及数据帧识别
<p><span style="font-size:11.0pt"><span style="font-family:"Microsoft YaHei""> 按照计划,这次改配置一下串口了。打开CubeMX的工程文件,根据原理图选择输出到调试器的串口号,应该是UART4 ,这样的好处是对照上位机收发方便,无需另外使用USB转串口的线材。如下图配置</span></span></p><p><span style="font-size:11.0pt"><span style="font-family:"Microsoft YaHei""> 记得开启中断,生成代码后更新一下MDK编辑器就好。然后初始化代码中已经有了UART4的基础配置,这里除了开始接受中断,另外加上空闲中断,以便使用IDLE来做简单的帧识别,也就是能够简单的做到不定长度的帧结构处理。HAL库封装的函数也是用起来比较方便的,在串口初始化的用户代码空间内添加两行</span></span></p>
<pre>
<code class="language-cpp">__HAL_UART_ENABLE_IT(&huart4,UART_IT_RXNE);
__HAL_UART_ENABLE_IT(&huart4,UART_IT_IDLE);</code></pre>
<p><span style="font-size:11.0pt"><span style="font-family:"Microsoft YaHei"">然后就可以写中断服务函数里的处理代码了,这里还是优先测试收发,所以收到的内容再原样发出去,代码如下:</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(&huart4);
/* USER CODE BEGIN UART4_IRQn 1 */
if(RESET != __HAL_UART_GET_FLAG(&huart4,UART_FLAG_RXNE)){
RecvBuffer = UART4->RDR;
}
if(RESET != __HAL_UART_GET_FLAG(&huart4,UART_FLAG_IDLE)){
__HAL_UART_CLEAR_IDLEFLAG(&huart4);
HAL_UART_Transmit(&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:"Microsoft YaHei"">可以使用库中原有的</span><span style="font-family:Calibri">HAL_UART_IRQHandler(&huart4);</span><span style="font-family:"Microsoft YaHei"">函数,然后重写回调函数,也可以按照我这样的直接粗暴,当然这里用寄存器写是最好不过了。</span></span></p>
<p><span style="font-size:11.0pt"><span style="font-family:"Microsoft YaHei"">以上内容做好,就可以用PC上位机来测试一下了,事实与预期一致,收发完全吻合</span></span></p>
<p><span style="font-size:11.0pt"><span style="font-family:"Microsoft YaHei"">以上是空闲中断作为不定长度帧的识别方式,但这种方式也并不完美,要根据实际应用来选择,不完美的地方我记得ST有篇官文应用笔记说明过,可以再找出来看看。补充另一种方式,按字节识别的方法,可用于帧结构明确的情况的下的处理。代码结构如下:</span></span></p>
<pre>
<code class="language-cpp">if(RESET != __HAL_UART_GET_FLAG(&huart4,UART_FLAG_RXNE)){
Recv = UART4->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:"Microsoft YaHei"">串口处理就到这里,基于ST的便捷工具和arm MDK的强大环境,使得开发过程越来越省心,不得不提一下,厂家的板卡也设计的很实在,板载调试器,完美治愈了我这种不喜欢扯很多线的臭毛病。</span></span></p>
<p>事实与预期一致</p>
<p>不只是ST的便捷工具和arm MDK的强大环境确实很便捷</p>
<p>是楼主技术高</p>
<p> </p>
Jacktang 发表于 2021-6-13 10:58
事实与预期一致
不只是ST的便捷工具和arm MDK的强大环境确实很便捷
是楼主技术高
<p>着实过奖<img height="63" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/victory.gif" width="61" /></p>
<p>谢谢分享,期待后续!</p>
页:
[1]