STM32与K210串口通信

article/2025/10/14 8:25:42

目录

1.前言

 2.接线部分

3.代码部分

1.k210部分

1.调用自带的库文件

2.将I/O18设置为UART1_TX功能并设置串口

3.数据发送函数

4.主函数

4.程序现象

2.STM32部分

1主函数

2.串口接收程序

3.程序现象

 4.完整代码

5.总结


1.前言

        这篇文章是为了填上一篇k210的简单PID巡线埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。

        本文代码运行的平台是STM32F103C8T6K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

 2.接线部分

        STM32使用串口外设是USART1,由于只接受数据所以只用到I/O的PA10;K210的串口通信I/O可以自行定义,我使用的是靠5V口近的GPIO18。STM32上的3.3V电源和GND分别K210上的5V电源和GND连接。最后测试的时,直接用typ-c给K210供电,K210再给stm32供电。这个时候就有人会问了“为什么5V可以直接STM32供电?”因为一般的STM32F103C8T6最小系统上自带一块线性稳压器,它可以将K210的5V电源转化为3.3V给STM32芯片供电。(这只是为了方便测试,请检查你的STM32上是否有线性稳压器,若没有请单独供电

K210    TX发送STM32F103   RX接收
GPIO 18PA 10
5V3.3V
GNDGND

3.代码部分

1.k210部分

1.调用自带的库文件

import time #延迟函数 
from machine import UART #串口库函数
from fpioa_manager import fm # GPIO重定向函数

2.将I/O18设置为UART1_TX功能并设置串口

fm.register(18, fm.fpioa.UART1_TX, force=True)
uart_A = UART(UART.UART1, 115200, 8, 0, 1, timeout=1000, read_buf_len=4096)

        在使用 uart1 前,我们需要使用 fm 来对芯片引脚进行映射和管理,将 I/O 18 设置为 uart1 的发送引脚。

        波特率设置为115200,这里注意要和STM32设置的一样。8位数据宽度,不需要奇偶校验位,1位停止位。

        timeout 为串口接收超时时间。read_buf_len 串口接收缓冲,串口通过中断来接收数据,如果缓冲满了,将自动停止数据接收

3.数据发送函数

def sending_data(x,y,z):FH = bytearray([0x2C,0x12,x,y,z,0x5B])uart_A.write(FH);

        传入你所需要发送的数据x、y、z,FH = bytearray([0x2C,0x12,x,y,z,0x5B])是将你的数据存入FH这个数组中。

        uart_A.write用于使用串口发送数据,将这个数据包发送出去。

4.主函数

Cx = 0
Cy = 0
Cz = 0while True:Cx+=1;Cy+=1;Cz+=1;sending_data(Cx,Cy,Cz)print("Cx:",Cx,"Cy",Cy,"Cz:",Cz)time.sleep_ms(1000)

        该例子是让Cx、Cy、Cz每一秒自加一并发送给STM32。

4.程序现象

         程序运行后,串行终端每一秒打印一次

         用一个CH340模块连接电脑读取一下串口数据。        

        电脑可以成功接收每组6个的数据包,每组数据中不变的就是帧头的两个2C,12和帧尾的5B。知道了这个格式,那么我们就可以开始编写STM32上的代码了。

2.STM32部分

1主函数

        本次程序在STM32上要实现的功能是接收数据后显示到OLED上,只需要初始化OLED和串口,在编写一下OLED显示的代码就行了。

#include "stm32f10x.h"                  // Device header
#include "OLED.h"
#include "Serial.h"
int main (void)
{OLED_Init();Serial_Init();OLED_ShowString(1,1,"Cx:");OLED_ShowString(2,1,"Cy:");OLED_ShowString(3,1,"Cz:");while(1){OLED_ShowNum(1,4,Cx,4);OLED_ShowNum(2,4,Cy,4);OLED_ShowNum(3,4,Cz,4);}}

        这里的Cx、Cy、Cz我是直接在Serial.h中使用了extern 外部变量声明。

2.串口接收程序

 先进行串口初始化。

#include "stm32f10x.h"                  // Device headeruint8_t Cx,Cy,Cz;         void Serial_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//USART1_RX	  PA10GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate = 115200;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&NVIC_InitStructure);USART_Cmd(USART1, ENABLE);
}

        使用的是USART1,它对应的接收引脚为PA10,将PA10设置为GPIO_Mode_IPU(输入上拉)模式,波特率设置为115200,8位数据宽度,不需要奇偶校验位,1位停止位,要和K210一致。再初始化串口中断并使能中断。

 接收数据包的逻辑编写

void USART1_IRQHandler(void)			 
{u8 com_data; u8 i;static u8 RxCounter1=0;static u16 RxBuffer1[6]={0};static u8 RxState = 0;	if( USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  	   //接收中断  {USART_ClearITPendingBit(USART1,USART_IT_RXNE);   //清除中断标志com_data = USART_ReceiveData(USART1);if(RxState==0&&com_data==0x2C)  //0x2c帧头{RxState=1;RxBuffer1[RxCounter1++]=com_data;}else if(RxState==1&&com_data==0x12)  //0x12帧头{RxState=2;RxBuffer1[RxCounter1++]=com_data;}else if(RxState==2){RxBuffer1[RxCounter1++]=com_data;if(RxCounter1==6 && com_data == 0x5B)       //RxBuffer1接受满了,接收数据结束{Cx=RxBuffer1[RxCounter1-4];Cy=RxBuffer1[RxCounter1-3];Cz=RxBuffer1[RxCounter1-2];RxCounter1 = 0;RxState = 0;	}else if(RxCounter1 > 6)            //接收异常{RxState = 0;RxCounter1=0;for(i=0;i<6;i++){RxBuffer1[i]=0x00;      //将存放数据数组清零}}}else   //接收异常{RxState = 0;RxCounter1=0;for(i=0;i<6;i++){RxBuffer1[i]=0x00;      //将存放数据数组清零}}}}

        com_data 用于读取STM32串口收到的数据,这个数据会被下一个数据掩盖,所以要将它用一个数组储存起来。

        RxBuffer1[6]={0} 定义一个6个成员的数组,可以存放6个数据,刚好放下一个数据包。

        RxCounter1 用来计次,让RXBufeer1这个数组能依次存入数据包。

        RxState 接收状态,判断程序应该接收第一个帧头、第二个帧头、数据或帧尾。

        com_data = USART_ReceiveData(USART1); 读取 将串口接收到的数据。

        if(RxState==0&&com_data==0x2C)  //0x2c帧头
                {
                    RxState=1;
                    RxBuffer1[RxCounter1++]=com_data;
                }

        当RXState处于0时,为接收帧头1模式。若接收到帧头1(0x2C),将RXState置1,切换到接收帧头2模式,并将帧头1存入RxBuffer1[0]的位置,RxCounter1加一。

else if(RxState==1&&com_data==0x12)  //0x12帧头
                {
                    RxState=2;
                    RxBuffer1[RxCounter1++]=com_data;
                }

        当RXState处于1时,为接收帧头2模式。若接收到帧头2(0x12),将RXState置2,切换到保存数据模式,并将帧头2存入RxBuffer1[1]的位置,RxCounter1加一。

else if(RxState==2)
                {
                    RxBuffer1[RxCounter1++]=com_data;

                    if(RxCounter1==6 && com_data == 0x5B)     //RxBuffer1接受满了,接收数据束
                    {      
                        Cx=RxBuffer1[RxCounter1-4];
                        Cy=RxBuffer1[RxCounter1-3];
                        Cz=RxBuffer1[RxCounter1-2];
                        RxCounter1 = 0;
                        RxState = 0;    
                    }

                }        

        当RXState处于2时,为保存数据模式。RxBuffer1[]将接收到的数据依次存入RxBuffer1[2]、RxBuffer1[3]、RxBuffer1[4]、RxBuffer1[5]中。当接收到第六位数据时,进行判断是否为帧尾(0x5B),若是帧尾分别保存数据RxBuffer1[2]、RxBuffer1[3]、RxBuffer1[4]Cx、Cy、 Cz中。

else if(RxCounter1 > 6)
                    {
                        RxState = 0;
                        RxCounter1=0;
                        for(i=0;i<6;i++)
                        {
                                RxBuffer1[i]=0x00;      //将存放数据数组清零
                        }
                    }

        若是不是帧尾帧尾将会把RxState、RxCounter1和RxBuffer1[]全部置零做接收异常处理。

else   //接收异常
                {
                        RxState = 0;
                        RxCounter1=0;
                        for(i=0;i<6;i++)
                        {
                                RxBuffer1[i]=0x00;      //将存放数据数组清零
                        }
                }

        }

        若没接收到帧头1(0x2C)和帧头2(0x12),将会把RxState、RxCounter1和RxBuffer1[]全部置零做接收异常处理。

3.程序现象

        OLED显示Cx、Cy、 Cz每秒加一

 4.完整代码

        K210

# Untitled - By: User - 周日 4月 23 2023
import time
from machine import UART #串口库函数
from fpioa_manager import fm # GPIO重定向函数fm.register(18, fm.fpioa.UART1_TX, force=True)
uart_A = UART(UART.UART1, 115200, 8, 0, 1, timeout=1000, read_buf_len=4096)def sending_data(x,y,z):FH = bytearray([0x2C,0x12,x,y,z,0x5B])uart_A.write(FH);Cx = 0
Cy = 0
Cz = 0while True:Cx+=1;Cy+=1;Cz+=1;sending_data(Cx,Cy,Cz)print("Cx:",Cx,"Cy",Cy,"Cz:",Cz)time.sleep_ms(1000)

        STM32

k210与stm32通信icon-default.png?t=N3I4https://gitee.com/AD123zsg/electronic-game-code/tree/486edcd7466f0e19a2ecc559c43238f8af6af34b/%E4%B8%BB%E6%8E%A7/C8T6/k210%E4%B8%8Estm32%E9%80%9A%E4%BF%A1

5.总结

        目前已经讲述了STM32驱动A4950、K210的简单PID循迹,但要做出一辆循迹小车还是不够的,还需要PID速度环去调节小车的速度,才能完成一个完整的循迹小车,有时间我会更新后面的代码。


http://chatgpt.dhexx.cn/article/4HtIuj7A.shtml

相关文章

八、STM32串口通信

目录 一、串口通信 1.1串口通信物理层 1.2USB转串口模块 1.3串口通信的其他应用 1.4串口数据包的基本组成 二、串口的结构体与函数讲解 2.1串口讲解 2.2结构体讲解 2.3串口初始化函数讲解 三、串口发送字符 3.1如何配置串口的发送 3.2项目实战 四、串口的中断接收 …

基于是stm32的串口通信

文章目录 一、串口协议和RS-232标准&#xff08;一&#xff09;、TTL电平标准&#xff08;二&#xff09;、RS232标准二、搭建STM32开发环境1.安装jdk2.安装STM32CubeMX三、实现LED的点亮3.1分析相应的原理图3.2使用CubeMX生成相关代码3.3实验结果四、STM32的USART串口通讯程序…

STM32串口通信详解(嵌入式学习)

STM32串口通信 1.通信基础知识1.1 时钟信号区分同步通信异步通信波特率总线协议(电气协议) 1.2 通信方式划分串行通信并行通信 1.3 通信方向划分单工通信半双工通信全双工通信常见通信总结 2. USARTUSART 介绍 3. 串口通信协议4. 相关寄存器串口控制寄存器波特率寄存器中断和状…

第七篇,STM32串口通信编程

1.通信的基本概念 &#xff08;1&#xff09;串行通信和并行通信 &#xff08;2&#xff09;单工&#xff0c;半双工和全双工 &#xff08;3&#xff09;通信速率 单位时间内传输的比特数表示传输速度&#xff0c;叫做波特率(bps) &#xff08;4&#xff09;通信协议(串口) 通…

STM32串口通信配置(USART/UART)

在配置USART和UART之前&#xff0c;得先明白什么是USART和UART以及它们之间有什么区别&#xff0c;其实两者是同步和异步的区别。 UART&#xff1a;universal asynchronous receiver and transmitter通用异步收发器&#xff1b; USART&#xff1a;universal synchronous asynch…

STM32_USART 串口通讯详解

对51单片机有了解的都知道51单片机的串口通讯工作原理&#xff0c;我们单片机使用的电平TTL电平&#xff0c;为了使我们的的单片机与PC进行通信&#xff0c;就需要一个电平转换芯片&#xff0c;把TTL电平转换为USB电平&#xff08;使用的USB接口&#xff0c;如果使用的DB9接口&…

STM32之串口通信

串口通信原理 串口通信的概念非常简单&#xff0c;串口按位&#xff08;bit&#xff09;发送和接收字节。尽管比按字节&#xff08;byte&#xff09;的并行通信慢&#xff0c;但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如…

STM32(六)——串口通信原理

本节为——正点原子笔记&#xff0c;海创电子学习笔记 我们先来看看我们学习的内容 一、 串行接口的基本知识 而我们今天主要说说 串行通信 而这些又是怎么样理解的&#xff1f; 接下来还有一个问题——即是串行通讯的同步与异步的问题 而 UART 是属于全双工 异步通讯 —— 即可…

OPENMV-STM32串口通信

OPENMV-STM32串口通信 目录标题 OPENMV-STM32串口通信前言硬件选择硬件的通信连接OPENMV软件分析效果展示图 前言 最近要准备工巡赛&#xff0c;突然要发现需要进行视觉传动&#xff0c;所以我最近几天又温顾了一下Openmv,以前学习Openmv都是通过电脑对其进行控制&#xff0c;…

STM32——串口通信原理

STM32——串口通信 一、硬件部分1、RS232标准2、USB转串口&#xff08;TTL&#xff09;3、原生的串口到串口&#xff08;TTL->TTL&#xff09; 二、串口通信协议三、STM32串口通信功能框图1、引脚2、USART通信相关寄存器&#xff08;最好过一遍&#xff0c;或者在试验之后回…

STM32串口通信,CH340工作原理

目录 一、串口协议 1.设备间的通信方式 2.RS-232标准 1.RS232电平与TTL电平的区别 2.RS-232串口简介 二、USB转232模块&#xff08;CH340为例&#xff09; 1.CH340简介 2.实物接线 三、参考文献 一、串口协议 串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的…

STM32-串口通信

1 串行通信接口背景知识 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式&#xff0c;因为它简单便捷&#xff0c;因此大部分电子设备都支持该通讯方式&#xff0c;其通讯协议可分层为协议层和物理层。物理层规定通信协议中具有机械、电子功能的特性&#…

STM32 USART—串口通信

目录 一、串口通信协议物理层电平标准&#xff1a; 1.RS232标准&#xff1a; 2.USB转串口通讯&#xff08;常用&#xff09; 3.原生的串口到串口 二、串口通信协议软件层&#xff1a; 三、串口功能框图 1.引脚 2.数据寄存器USART_DR 3.字符帧组成介绍 4.发送与接收数据…

STM32 —— STM32 的串口通信

STM32 —— STM32 的串口通信 STM32的串口通信接口有两种&#xff0c;分别是&#xff1a;UART(通用异步收发器)、USART(通用同步异步收发器)。而对于大容量 STM32F10x 系列芯片&#xff0c;分别有 3 个 USART 和 2 个 UART 串口通信过程&#xff1a; 目前还处于入门阶段&#x…

STM32——串口通信

首先声明&#xff0c;本文是在查阅资料之后进行的一些内容总结&#xff0c;仅用于个人学习记录。 一、串口通信基本原理 按照数据传送方向分类 1、单工&#xff1a;数据传输只支持数据在一个方向上传输 2、半双工&#xff1a;允许数据在两个方向上传输。但是&#xff0c;在…

STM32 - 串口(USART)通信详解

STM32 - 串口&#xff08;USART&#xff09;通信 文章目录 STM32 - 串口&#xff08;USART&#xff09;通信1、STM32 串口简介2、串口的工作方式3、串口通信协议3.1&#xff1a; 物理层3.1.1&#xff1a; TTL、RS-232 标准3.1.2&#xff1a;USB 转串口&#xff08;划重点&#…

STM32-串口通信详解总结

1. 串口通信方式 UART&#xff1a;universal asynchronous receiver and transmitter 通用异步收/发器&#xff0c;即串行异步全双工收发器。 USART: universal synchronous asynchronous receiver and transmitter 通用同步/异步收/发器&#xff0c;即串行异步/同步全双工收发…

(十三)STM32——串口通信(UART)

目录 学习目标 内容 通信方法 并行通信 串行通信 通信方向 通信方式 UART 特点 串口参数 通信流程 寄存器 USART_SR USART_DR USART_BRR 过程 代码 运行结果 运行结果 遇到的问题 总结 学习目标 本节我们要学习的的是STM32的通信部分&#xff0c;主要介绍…

STM32—串口通讯详解

串口通讯目录 物理层协议层USART简介开发板与上位机的连接代码讲解&#xff1a;一.初始化结构体二.NVIC配置中断优先级三.USART配置函数讲解四.传输数据的函数&#xff1a;1.发送一个字节2.发送字符串3.重定向printf函数发送字符串4.重定向getchar函数接收字符5.通过中断接收 结…

stm32实现串口通信和LED灯点亮

stm32串口通信 串口协议和RS—232标准RS232电平与TTL电平的区别USB/TTL转RS232 CH340串口安装安装stm32cubemx并编写程序实现led灯的周期闪烁 用stm32完成USART串口通信接下来进行波形观察总结 两个工程完整代码 串口协议和RS—232标准 串口通信协议&#xff1a;是指规定了数据…