串口实验(中断)

需求: 通过中断的方法接受串口工具发送的字符串,并将其发送回串口工具。
硬件接线:
同上
串口配置:
4 步同上
5. 打开中断

编程实现:

 

 1、这段代码主要实现了在接收到回车符时判断是否接收到换行符,并标志接收完成。在没有接收到回车符的情况下,根据接收到的字符是否为回车符来更新接收状态和保存接收到的数据。最后,重新开启中断以继续接收。

2、UART1_RX_STA & 0x8000) == 0 表示接收未完成。这是通过检查 UART1_RX_STA 寄存器的最高位(bit15)来确定的。在这个条件中,如果最高位为0,就表示接收未完成。因为在这段代码中,接收完成时会将最高位设置为1(UART1_RX_STA |= 0x8000),因此如果最高位为0,就说明接收还未完成。
3、回车(Carriage Return)的作用是将打印头(或打印滚轴)移回行首,而换行(Line Feed)的作用是将纸上移一行。这两个操作通常结合在一起使用,即先回车再换行,以实现光标的移动到下一行开头。

在计算机系统中,回车符和换行符的概念被继承并广泛应用。而回车符对应的 ASCII 码就是0x0D。

4、UART1_RX_STA = 0; 的作用是将接收状态寄存器 UART1_RX_STA 的所有位都清零,相当于将其重置为初始状态。在这段代码中,这行语句的位置是在接收到回车符(0x0D)但还未接收到换行符(0x0A)的情况下,表示重新开始接收数据。

具体而言,UART1_RX_STA 是一个16位的寄存器,用于记录串口接收的状态。在这个代码中,UART1_RX_STA 的各个位的含义如下:

  • bit15(最高位):接收完成标志,如果为1,表示接收已完成。
  • bit14:接收到回车符(0x0D)标志,如果为1,表示已经接收到回车符。
  • bit13~0:接收到的有效字节数目,记录当前接收到的字节数。

当接收完成时,将 UART1_RX_STA 的最高位设置为1,表示接收完成。而在接收到回车符时,将 UART1_RX_STA 的 bit14 设置为1。当需要重新开始接收时,将 UART1_RX_STA 清零,重新初始化接收状态。这样的设计可以有效地控制串口数据的接收过程。

5、为什么如果没有接收到换行符,可能是接收错误,重新开始?

在串口通信中,通常约定了一种结束符(end-of-line),用于表示一条完整的数据。在这段代码中,回车符(Carriage Return,0x0D)被视为结束符。

如果接收到的字符不是回车符,那么有可能是接收到了错误的数据或者接收的数据不符合约定的格式。为了确保接收的数据是完整的、正确的,程序选择在没有接收到回车符的情况下将接收状态重置,重新开始接收。

else
{
    // 将接收到的数据保存在缓冲区中,使用 UART1_RX_STA 低14位作为索引
    UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;

    // 增加接收状态中记录的有效字节数
    UART1_RX_STA++;

    // 如果接收的数据大于 UART1_REC_LEN(200字节),则重新开始接收
    if (UART1_RX_STA > UART1_REC_LEN - 1)
        UART1_RX_STA = 0;
}
6、具体步骤:
  1. UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;:将接收到的数据 buf 存储在缓冲区 UART1_RX_Buffer 中,使用 UART1_RX_STA 的低14位作为索引。这是为了将数据按顺序存储在缓冲区中。

  2. UART1_RX_STA++;:增加接收状态 UART1_RX_STA 中记录的有效字节数。这是为了跟踪接收的字节数。

  3. if (UART1_RX_STA > UART1_REC_LEN - 1) UART1_RX_STA = 0;:如果接收的数据字节数超过了缓冲区的大小(UART1_REC_LEN),则将接收状态 UART1_RX_STA 重置为0,重新开始接收数据。这是为了防止缓冲区溢出。

这些步骤的目的是将接收到的数据存储在缓冲区中,并在必要时重新开始接收,以保持缓冲区的有效性。

7、假设我们有一个缓冲区 UART1_RX_Buffer,长度为10(UART1_REC_LEN 等于10),初始时 UART1_RX_STA 为0。
  1. 接收到第一个字节(假设是'A'):

    • UART1_RX_STA 增加到1。
    • UART1_RX_Buffer[0] 被赋值为'A',因为 (UART1_RX_STA & 0X3FFF) 等于0。
  2. 接收到第二个字节(假设是'B'):

    • UART1_RX_STA 增加到2。
    • UART1_RX_Buffer[1] 被赋值为'B',因为 (UART1_RX_STA & 0X3FFF) 等于1。
  3. 接收到第三个字节(假设是'C'):

    • UART1_RX_STA 增加到3。
    • UART1_RX_Buffer[2] 被赋值为'C',因为 (UART1_RX_STA & 0X3FFF) 等于2。
  4. ...重复这个过程直到缓冲区满:

    • UART1_RX_STA 依次增加到7,8,9。
    • UART1_RX_Buffer 依次填充为'D'、'E'、'F'、'G'、'H'、'I'、'J'。
  5. 再接收一个字节(假设是'K'):

    • UART1_RX_STA 增加到10。
    • 由于超过了缓冲区长度,根据代码,UART1_RX_STA 会被重新设置为0。
    • UART1_RX_Buffer[0] 被赋值为'K',因为 (UART1_RX_STA & 0X3FFF) 等于0。

这样,UART1_RX_Buffer 中的数据被循环写入,确保缓冲区不会溢出。

 

8、HAL_UART_Receive_IT 函数是在使用 HAL 库时用于启动 UART 中断接收的函数。下面是这个函数的参数解释:
  • &huart1: 这是指向 UART_HandleTypeDef 结构体的指针,表示你要配置的 UART 外设。huart1 应该是你配置的 UART1 的实例,其类型为 UART_HandleTypeDef

  • &buf: 这是一个指向缓冲区的指针,用于存储接收到的数据。在这个例子中,buf 是一个变量,&buf 取得了这个变量的地址,所以 UART 接收到的数据将会存储到 buf 所在的内存位置。

  • 1: 这是期望接收的字节数。在这里,设置为1表示每次接收一个字节。如果你期望接收更多的字节,可以调整这个参数的值。

此函数的作用是启动 UART 中断接收,使 UART 在接收到数据后触发中断,并将接收到的数据存储到指定的缓冲区中。函数参数 &huart1&buf 就是用来传递这些信息的。

9、在这个主循环中,通过检查 UART1_RX_STA 的最高位(bit15),判断是否接收完成。如果接收完成,就打印收到的数据,然后通过串口发送出去。在等待发送完成的过程中,阻塞等待 huart1.gState 变为 HAL_UART_STATE_READY,确保上一次的发送已经完成。最后,将 UART1_RX_STA 重置为0,准备开始下一次的接收。

如果接收未完成,会执行其他操作,比如打印 "hello liangxu" 和延时1秒。

这个循环将不断运行,周期性地进行串口接收和其他操作。主要的思路是在串口接收完成后进行处理,然后重新开始下一次接收。

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Proteus是一种电子电路仿真软件,其中包含了多种电子元件的模型和仿真功能。在Proteus中使用串口中断可以模拟实际电路中的串口通信。 串口中断是指当某个外部设备传输数据给单片机时,单片机能够及时地中断当前程序的执行,去处理接收到的数据,提高单片机的响应速度和数据处理能力。 在Proteus中设置串口中断可以通过以下步骤进行: 1. 在电路图中选择需要使用串口单片机元件,如8051单片机。 2. 右键单击单片机元件,选择“Edit Properties”或类似选项,进入单片机的属性设置界面。 3. 在属性设置界面中找到串口中断相关的选项,如“中断使能”或“串口中断使能”等,将该选项勾选上。 4. 根据具体需求,设置串口的通信参数,包括波特率、数据位、校验位等。 5. 将其他与串口相关的元件连接到单片机串口引脚上,如串口转USB模块或串口调试器等。 6. 编写单片机的程序代码,包括中断服务函数和数据接收处理部分。 7. 在仿真界面中启动仿真,观察串口中断是否能够正常工作,即当有数据传输到单片机时,仿真能否中断当前程序执行,并处理接收到的数据。 通过以上步骤,就可以在Proteus中实现串口中断的仿真。在实际应用中,可以利用串口中断来实现与外部设备的数据通信,如与计算机、传感器等进行数据交互,从而完成更复杂的电子系统设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值