打印
[应用相关]

调试STM32串口过程中发现一个奇怪的问题

[复制链接]
315|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
610u|  楼主 | 2023-4-30 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*
调试STM32串口过程中发现一个奇怪的问题,初始化串口1口,使能串口发送完成中断后,立刻就进入了发送完成中断。
仔细的查阅了STM32手册中的串口部分的介绍:
         
以下是字符发送的配置过程,注意第6点,在设置USART_CR1中的TE位时,会发送一个空闲帧作为第一次数据发送,所以即便你执行了USART_ClearFlag(USART1, USART_FLAG_TC); (这个函数肯定在空闲帧数据发送完成前执行),所以当空闲帧发送完后,就进入发送完成中断。
         
配置步骤:
1.  通过在USART_CR1寄存器上置位UE位来激活USART
2.  编程USART_CR1的M位来定义字长。
3.  在USART_CR2中编程停止位的位数。
4.  如果采用多缓冲器通信,配置USART_CR3中的DMA使能位(DMAT)。按多缓冲器通信中
的描述配置DMA寄存器。
5.  利用USART_BRR寄存器选择要求的波特率。
6.  设置USART_CR1中的TE位,发送一个空闲帧作为第一次数据发送。
7.  把要发送的数据写进USART_DR寄存器(此动作清除TXE位)。在只有一个缓冲器的情况
下,对每个待发送的数据重复步骤7。
8.  在USART_DR寄存器中写入最后一个数据字后,要等待TC=1,它表示最后一个数据帧的
传输结束。当需要关闭USART或需要进入停机模式之前,需要确认传输结束,避免破坏
最后一次传输。*/
<div class="line number19 index18 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp comments" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;"></code></div><div class="line number21 index20 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp comments" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">//解决的办法:</code></div><div class="line number22 index21 alt1" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp comments" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">//方法一</code></div><div class="line number23 index22 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp comments" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">//在执行</code></div><div class="line number24 index23 alt1" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp plain" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">USART_ITConfig(USART1, USART_IT_TC, ENABLE); </code></div><div class="line number25 index24 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp comments" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">//之前,先延时一段时间,基本上比一个字符发送的时间长一点就可以了,然后再执行</code></div><div class="line number26 index25 alt1" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp plain" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">USART_ClearFlag(USART1, USART_FLAG_TC);</code></div><div class="line number27 index26 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp spaces" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">         </code> </div><div class="line number28 index27 alt1" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp comments" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">//方法二:</code></div><div class="line number29 index28 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp comments" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">//在执行</code></div><div class="line number30 index29 alt1" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp plain" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">USART_ITConfig(USART1, USART_IT_TC, ENABLE);</code></div><div class="line number31 index30 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp keyword bold" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">while</code> <code class="cpp plain" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)</code></div><div class="line number32 index31 alt1" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp plain" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">{</code></div><div class="line number33 index32 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp spaces" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">        </code> <code class="cpp plain" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">; </code> <code class="cpp comments" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">//等待空闲帧发送完成后  再清零发送标志</code></div><div class="line number34 index33 alt1" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp plain" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">}</code></div><div class="line number35 index34 alt2" style="box-sizing: border-box; outline: 0px; color: rgb(79, 79, 79); font-family: Tahoma, Helvetica, Arial, STHeiti; font-size: 14px;"><code class="cpp plain" style="box-sizing: border-box; outline: 0px; border-radius: 4px; word-break: break-word;">USART_ClearFlag(USART1,USART_FLAG_TC);</code></div>


使用特权

评论回复
沙发
童雨竹| | 2024-6-16 07:02 | 只看该作者

根据色彩的变化记录每一行的颜色跳变点,由此识别出车牌区域。

使用特权

评论回复
板凳
Wordsworth| | 2024-6-16 08:05 | 只看该作者

切割完了第四个字符之后,再依次扫描剩下的空间,直到所扫描的这一竖上的所有点的灰度值不全为0时,认为是字符的开始并依次扫描直到所扫描的这一竖上的所有点的灰度值全为0时认为是字符的结束。

使用特权

评论回复
地板
Clyde011| | 2024-6-16 09:08 | 只看该作者

需要设定一个阈值来对像素点进行设置

使用特权

评论回复
5
公羊子丹| | 2024-6-16 10:01 | 只看该作者

计算量小,计算快。缺点也严重:在不同的图像中,颜色分布差别大,处理效果也不会很好。

使用特权

评论回复
6
万图| | 2024-6-16 11:04 | 只看该作者

在内存中开辟七个长为车牌长的七分之一和宽为车牌宽的区域

使用特权

评论回复
7
Uriah| | 2024-6-16 12:07 | 只看该作者

二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色

使用特权

评论回复
8
帛灿灿| | 2024-6-16 14:03 | 只看该作者

分别记录车牌区域的上下高度。然后通过RGB-HSV颜色转换

使用特权

评论回复
9
Bblythe| | 2024-6-16 15:06 | 只看该作者

通过OV7670摄像头进行图像采集

使用特权

评论回复
10
周半梅| | 2024-6-16 17:02 | 只看该作者

图像由前景和背景组成,在灰度直方图上,前景和背景会形成高峰,在双峰之间的最低谷处就是阈值。

使用特权

评论回复
11
Pulitzer| | 2024-6-16 18:05 | 只看该作者

要将多余空间去除。对于第一个字符从第一行开始向下扫描,把那些一行中所有的点的灰度值全为0的点去掉,直到扫描到有一行不全为0时为止。

使用特权

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

本版积分规则

49

主题

517

帖子

0

粉丝