STM32与K210串口通信

这篇具有很好参考价值的文章主要介绍了STM32与K210串口通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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屏上。

STM32与K210串口通信

 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 18 PA 10
5V 3.3V
GND GND

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 = 0

while 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.程序现象

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

STM32与K210串口通信

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

STM32与K210串口通信

        电脑可以成功接收每组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 header

uint8_t Cx,Cy,Cz;         
                           
void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	//USART1_RX	  PA10
	GPIO_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每秒加一

STM32与K210串口通信

 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 = 0

while 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通信https://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速度环去调节小车的速度,才能完成一个完整的循迹小车,有时间我会更新后面的代码。文章来源地址https://www.toymoban.com/news/detail-457650.html

到了这里,关于STM32与K210串口通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 电赛备赛日记(一):K210与STM32串口通信

       拖更了n久的备赛日记终于来啦,最近实现了关于K210图像识别并将所需数据(即目标类别,目标在图像中的加权坐标)其中,加权坐标指K210识别到的目标并框出的框的宽和高与框左上顶点的坐标加权,希望以此来判断目标所处的位置并方便后续进行诸如寻迹,目标跟随等

    2024年02月04日
    浏览(65)
  • STM32CubeMx学习与K210串口通信+识别橘色色块——点亮小灯

     K210模块的串口发送代码 识别色块 +数字处理 这里zz是4个数字的数,则需要分成千百位和低二位传输 zz是距离。也映射了距离的算法 整体K210代码 STM32串口接受端函数 判断帧头帧尾 如果数据正常 判断 数据是否合格 若合格则点灯 否则灭灯 不要忘记加入

    2024年02月14日
    浏览(52)
  • P27[9-3]STM32:串口通信(串口发送)(内含:1.接线图+2.实物图+3.代码部分+4.解决串口发送数据,数据是汉字,结果发送结果为乱码的现象)

    1.接线图如下: 跳线帽接在4~5引脚,2,3引脚连接PA9和PA10引脚。下图也可得出USART接PA9和PA10引脚。 TX和RX是交叉连接。PA9(黄线)是TX,接RXD。PA9(绿线)是RXD,接TX. 图中的串口模块和STINK都接电脑上,使之拥有独立供电。 2.实物图: 黄色为跳线帽,接4~5引脚。

    2024年02月09日
    浏览(45)
  • 亚博k210视觉模块与stm32双向通信

    【K210模块】使用UART模块发送和接收数据_KevinGuo457的博客-CSDN博客 K210的串口_uart_a.write_飞鸟211的博客-CSDN博客 ①每隔1s终端以及串口助手收到消息并显示 ②通过串口助手发送123,K210收到数据并显示 这里如果想要指定K210接收的数据,判断条件不能直接用==(原因参考上面的链接

    2024年04月23日
    浏览(105)
  • K210追小球程序与STM32最小系统板通信(自主学习)

    本人先通过学习OPENMV,再延申到K210中。(主要是OPENMV我还没买屏幕,但是K210有)在OPENMV官网中,有相关追小球的函数,但是是用OPENMV单片机来进行调试的。在网上找到的相关源码,加载到OPENMV后发现帧数很慢。 学校实训的要求是要做出能追一定物体的平衡小车,我的小车的

    2024年02月16日
    浏览(43)
  • 【K210】K210学习笔记五——串口通信

    本人大四学生,电赛生涯已经走到尽头,一路上踩过不少坑,但运气也不错拿了两年省一,思来想去,决定开始写博客,将电赛经验分享一二,能力有限,高手轻喷。 往期的博客讲述了 K210 的感光元件模块 sensor 的配置,机器视觉模块 image 中部分函数的使用(目前是用 find

    2024年04月28日
    浏览(47)
  • k210——maix bit串口通信

    k210 一共有 3个 uart ,每个 uart 可以进行自由的引脚映射。 一、API函数介绍 1.1 register(pin, function, force=True) K210 可以通过映射来改变引脚功能,设置引脚(pin)对应的外设功能(func),默认启用强制绑定参数(force=True) pin: 功能映射引脚 function: 芯片功能 force: 默认为Tru

    2024年02月15日
    浏览(47)
  • STM32通过K210进行PID巡线,使用蓝牙模块与电脑通信从而进行P,I,D参数的调节

    目录 一.前言部分(废话部分) 二.K210色块识别 1.必要知识 2.色块识别 3.单片机的接收代码 三.通过蓝牙连接在电脑上实现PID的调参 我使用的是HAL库,如果你使用的是标准库的话可以根据对应标准库的函数进行更改即可 因为之前使用灰度传感器进行巡线,即使用上PID,最后的效果也

    2024年02月14日
    浏览(47)
  • STM32如何通过K210进行物体识别(1.开发环境搭建)

    本来参加智能物流机器人比赛是要用OpenMV的,但无奈于诸多因素只有K210可以使用,这也算是不幸中的万幸吧。这篇文章也作为我这一段时间的学习K210进行物体识别的复习与总结(因为种种原因,比赛也面临无法完成,大哭;人工智能小白一枚,欢迎各路大神指正,求轻喷)

    2023年04月10日
    浏览(44)
  • K210串口接收数据包

    目录 1.前言 2.代码部分 1.调用自带的库文件 2.将I/O19设置为UART1_RX功能并设置串口 3.数据接收函数 4.主程序             之前更新了K210与STM32之间的串口通信,是K210发送信息STM32接收信息,这篇博客讲解一下K210 DOCK接收数据包。  在使用 uart1 前,我们需要使用 fm 来对芯片引脚

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包