K210学习笔记(三) K210与STM32进行串口通信,K210发STM收

在这里插入图片描述

前言

前面我们讲了STM32给K210发数据,大家可以看看这篇。
K210学习笔记(二) K210与STM32进行串口通信,K210收,STM32发
那么今天我们来讲一下K210给STM32发数据。

硬件平台:STM32F103ZET6正点原子用的也是正点原子的串口例程
,K210 M1N DOCK

软件平台:keil5 ,maixPython IDE

接线:

STM32K210
GNDGND
PA10(RXD)IO10(TXD)
PA9(TXD)IO9(RXD)

一、以/r/n为结尾

在stm32的串口通信代码中,程序要求发送的字符以回车换行结束(0x0d,0x0a),即\r\n。
那么我们看ASCII表就知道0x0d,0x0a是什么了。
在这里插入图片描述
\r是回车,carriage return的意思,也就是cr,作用是返回到当前行的最前方。
\n是换行,next line的意思,也就是nl,作用是跳到下一行的当前位置。
\r\n是回车+换行,很容易理解,它的作用是跳到下一行的开始位置。

STM32的串口中断服务函数也规定了必须以\r\n为结尾,否则程序不知道你什么时候发送结束。就会导致未知的错误。
在这里插入图片描述

二、K210端代码

K210端写的就很简单了。前面就是对串口,屏幕,摄像头进行初始化。然后每隔2S发1或发2.数据会以ASCII码的形式发送出来。

import sensor
import image
import lcd
import time
import utime
from machine import UART
from fpioa_manager import fm
fm.register(10, fm.fpioa.UART1_TX, force=True)
fm.register(9, fm.fpioa.UART1_RX, force=True)
uart = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
clock = time.clock()
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
sensor.skip_frames(30)
lcd.rotation(2)#LCD屏幕翻转,范围是0~3
sensor.set_hmirror(True)#摄像头镜像
first = '1\r\n'
two = '2\r\n'

while True:
    img = sensor.snapshot()#从摄像头获取图像
    uart.write(first)#发1
    utime.sleep_ms(2000)#延时2s
    uart.write(two)#发2
    utime.sleep_ms(2000)#延时2s
    lcd.display(img)#LCD显示图像

三、STM32端

STM32端,先说一下这个函数,就是使用printf的时候会调用这个函数,我们看到数据直接赋给了串口1的数据寄存器,那么我只用printf的是时候,那么就在串口1发出来。
在这里插入图片描述

3.1 main函数

主函数这里就是对时钟,串口,LED,LCD进行初始化。然后进入主循环,当接收完成之后
判断我USART_RX_BUF[0]是否是1或者2.因为我是1或2长度是1。USART_RX_BUF[0]是一个u8的数据类型。
当收到1时,LCD显示1,LED0亮,LED1灭。
当收到2时,LCD显示2,LED0灭,LED1亮。

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"

 int main(void)
 {
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 	//串口初始化为115200
 	LED_Init();			     //LED端口初始化
	LCD_Init();
	POINT_COLOR=RED; 
  	while(1) 
	{	
  if(USART_RX_STA&0x8000)#接收完成
	{	    
    if(USART_RX_BUF[0]==0x31)
		{
			LCD_ShowxNum(100,50,1,1,24,0);
            LED0=0;
            LED1=1;
		}
	if(USART_RX_BUF[0]==0x32)
    {
          LCD_ShowxNum(100,50,2,1,24,0);
          LED0=1;
          LED1=0;
    }
    USART_RX_STA=0;
  }
   
	} 
}
 

主循环内则一直判断接收中断标志最高位有没有置1,置1表示有一帧数据来到,可以进行处理,处理内容为发送接收到的数据同时判断接收的第一位。
这个一定要加 USART_RX_STA=0; 否则标志位不回到0就不继续接收了。

四、测试结果

4.1当收到1时

在这里插入图片描述

4.2当收到2时

在这里插入图片描述

4.3 测试视频

在这里插入图片描述

总结

这就是这次的分享,希望能够帮助到大家。
参考博文:
\n \r \n\r \r\n回车还换行?有啥区别??
ASCII码对照表(包括十六进制、十进制和字符)
STM32CubeMX-串口中断实验

  • 54
    点赞
  • 480
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学工科的皮皮志^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值