串口通信学习(STM32F103)

一、实验器材

学习使用的是洋桃电子的洋桃开发板一号(非广告)

二、串口的通信方法

三、硬件与原理图

本板子用的MCU是STM32F103,通过查询数据手册,这块芯片“多达3个USART接口(支持ISO7816接口,LIN,IrDA接口和调制解调控制)”,我个人的理解就是有3个USART串口。
这是主芯片附近的原理图
上图中可以看到,USART1的收是PA10,发是PA9,在这个实验中也只用到了这一部分。
USART_RTS和SART_CTS我搜了一下,有人是这么说的

在ARM处理器中的USART中,基本上都具有硬件流控的功能,也就是说一般都有RTS CTS引脚(注意:功能简单一点的处理器,如51、STM8等,很少有串口硬件流控功能)。

RTS:是模块的输入端,用于MCU通知模块,MCU是否准备好,模块是否可向MCU发送信息,RTS的有效电平为低。

CTS:是模块的输出端,用于模块通知MCU,模块是否准备好,MCU是否可向模块发送信息,CTS的有效电平为低

RTS (Require ToSend,发送请求)为输出信号,用于指示本设备准备好可接收数据,低电平有效,低电平说明本设备可以接收数据。

CTS (Clear ToSend,发送允许)为输入信号,用于判断是否可以向对方发送数据,低电平有效,低电平说明本设备可以向对方发送数据。

大概也是用来保证通信的质量吧。
PA9和PA10通过CH340芯片实现USART转串口和电脑通信,转化出来的是TTL电平,单片机可以直接使用。
在这里插入图片描述

四、看看代码

首先代码还是分为两层,USART.C中实现驱动,MAIN.C中实现应用层的调用
串口的初始化程序

void USART1_Init(u32 bound){ //串口1初始化并启动
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
     //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);  
    //USART1_RX	  PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure); 
   //Usart1 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器 
   //USART 初始化设置
	USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    USART_Init(USART1, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启ENABLE/关闭DISABLE中断
    USART_Cmd(USART1, ENABLE);                    //使能串口 
}

1.在复用为串口收发时,还是要先初始化端口
2.NVIC向量中断控制器
3.串口相关的设置

串口的发送程序用的是老师写的print函数

	/* 发送方法1 */
		USART_SendData(USART1 , 0x55); //发送单个数值
		while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //检查发送中断标志位

		/* 发送方法2 */
//		printf("STM32F103 "); //纯字符串发送数据到串口

//		printf("STM32 %d %d ",a,b); //纯字符串和变量发送数据到串口,a符号变量
		 
		/* 发送方法3 */
//		USART1_printf("STM32 %d %d ",a,b);

        delay_ms(1000); //延时

其中USART_SendData是库函数自带的

串口的接收
轮询太低级了,还是用中断
中断函数的固定命名

void USART1_IRQHandler(void);
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{
//在中断中去接收的标志位是否置位,若置位了就执行相应的业务逻辑
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用K210识别二维码后通过串口将结果发送给STM32F103,你可以按照以下步骤进行操作: 1. 首先,确保K210和STM32F103之间的串口连接正确,包括引脚连接和通信参数设置。 2. 在K210上使用适当的固件或软件来进行二维码的识别和解码。你可以使用MaixPy或MicroPython等语言和框架来编写相关的代码。 3. 在K210的代码中,你可以使用相应的库或API来调用二维码识别功能,并获取识别结果。 4. 在获取到二维码识别结果后,使用串口将结果发送给STM32F103。你可以使用K210的串口库或API来进行串口通信。示例代码如下: ```python from machine import UART # 初始化K210串口 uart_k210 = UART(UART.UART1, baudrate=115200, bits=8, parity=None, stop=1, timeout=1000, read_buf_len=4096) # 初始化STM32F103串口 uart_stm32 = UART(UART.UART2, baudrate=115200, bits=8, parity=None, stop=1, timeout=1000, read_buf_len=4096) # 识别二维码并获取结果 def recognize_qrcode(): # 识别二维码的代码逻辑 # 返回识别结果 return qrcode_result # 主循环 while True: # 识别二维码 result = recognize_qrcode() # 发送结果给STM32F103 uart_stm32.write(result) # 延时一段时间,等待STM32F103处理结果 time.sleep(1) ``` 5. 在STM32F103端,你需要编写相应的代码来接收来自K210的数据,并进行处理。你可以使用STM32F103的串口库或API来进行串口通信。 请注意,以上代码仅为示例,具体的实现可能会因为你所使用的开发板、操作系统和编程语言而有所不同。在实际应用中,你需要根据具体的硬件和软件环境进行适当的调整。同时,还需确保K210和STM32F103之间串口连接的正确性,包括引脚连接和通信参数的设置。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值