基于中断/DMA方式的串口通信

了解串口协议和RS-232标准


一、了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。

1.1 串口通信协议概念

串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

1.2 RS-232标准

RS232采用负逻辑电平,定义如下:

在这里插入图片描述

1.3TTL标准

输出 L: <=0.8V ; H:>=2.4V。

输入 L: <=1.2V ; H:=>2.0V

TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。

1.4 "USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

TXD:发送端,一般表示为自己的发送端,正常通信必须接另一个设备的RXD。

RXD:接收端,一般表示为自己的接收端,正常通信必须接另一个设备的TXD。
正常通信时候本身的TXD永远接设备的RXD!

自收自发:正常通信时RXD接其他设备的TXD,因此如果要接收自己发送的数据顾名思义,也就是自己接收自己发送的数据,即自身的TXD直接连接到RXD,用来测试本身的发送和接收是否正常,是最快最简单的测试方法,当出现问题时首先做该测试确定是否产品故障。也称回环测试。

二、STM32系统给上位机(win10)连续发送“hello windows!”;当上位机给stm32发送字符“stop”后,stm32暂停发送“hello windows!”;发送一个字符“start”后,stm32继续发送;

1.创建工程
在这里插入图片描述
配置rcc
在这里插入图片描述
配置sys
在这里插入图片描述
配置USART1,并使能
在这里插入图片描述
在这里插入图片描述
配置时钟
在这里插入图片描述
点击project manager
在这里插入图片描述
在这里插入图片描述
创建工程,打开keil中的main.c文件
添加头文件

#include "stdio.h"
#include <string.h>
uint8_t temp1[]="hello windows";
uint8_t temp2[5];
uint8_t flag;
uint8_t n;

在这里插入图片描述
在while循环中添加如下程序

if(flag==1)
		{
			HAL_UART_Transmit_DMA(&huart1,temp1,sizeof(temp1));
			HAL_Delay(1000);

在这里插入图片描述
添加中断函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart==&huart1)
	{
		if(temp2[2]=='start')
		{
         flag=0;

	  }
		else if(temp2[2]!='stop')
		{
         flag=1;
	  }
	}
}

在这里插入图片描述

打开串口助手,调节参数
在这里插入图片描述
打开串口
在这里插入图片描述
上位机给stm32发送字符“stop”后,stm32暂停发送“hello windows!”;发送一个字符“start”后,stm32继续发送;
与此前创建工程过程相同
打开生成keil文件中的main.c
添加头文件
在这里插入图片描述
在while循环中添加如下程序

while (1)
  {
	       if(flag==1)      
			   {   
					 HAL_UART_Transmit(&huart1, TxBuffer, 14, 0xFFFF);
           HAL_Delay(1000);
          }  
	}

在这里插入图片描述
中断函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1)
    {
        if (A[0] == 'o')
        {
            flag = 0; 
        }
        else if (A[0] == 'a')
        {
            flag = 1; 
        }
        HAL_UART_Receive_IT(&huart1, A, 1); 
    }
}

在这里插入图片描述
打开串口助手,打开串口
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值