K210 UART串口通信介绍与 STM32通信

目录

K210-UART串口通信相关函数:

使用K210串口的时候需要映射引脚:

K210与STM32串口通信 

发送单字节:

K210端

STM32端

发送数据包

K210端

STM32端 

K210的UART模块支持全双工通信,可以同时进行数据的发送和接收。在K210上使用UART串口通信,你可以连接外部设备,如传感器、显示器、WiFi模块等,实现数据的交换和控制。

K210-UART串口通信相关函数:

1.machine.UART():该函数用于初始化一个UART串口对象。你可以指定串口的编号(如UART1)、波特率、数据位、校验位、停止位、TX引脚和RX引脚等参数。

import machine# 初始化串口
uart = machine.UART(1, baudrate=115200, tx=12, rx=13)

在这个示例中,我们使用machine.UART()函数初始化了一个串口对象,指定了串口的编号(1)、波特率(115200)、TX引脚(12)和RX引脚(13)。

或者可以:

machine.UART(uart,baudrate,bits,parity,stop,timeout, read_buf_len)

machine.UART()函数是用于初始化一个UART串口对象的函数,它可以接受以下参数:

  • uart:串口编号,可以为1、2、3。
  • baudrate:波特率,用于指定串口通信的数据传输速率。
  • bits:数据位数,可以为5、6、7、8。
  • parity:校验位,可以为None、0、1、2。
  • stop:停止位,可以为1、2。
  • timeout:超时时间,单位为毫秒。
  • read_buf_len:读缓冲区长度,用于指定串口读取数据时的缓冲区大小。

其中,uart参数是必需的,其他参数都有默认值。下面分别介绍这些参数的含义和用法:

  • uart:串口编号,可以为1、2、3。如果你的开发板上有多个串口,需要指定使用哪个串口进行通信。
  • baudrate:波特率,用于指定串口通信的数据传输速率。常见的波特率有9600、115200等,需要根据实际情况进行设置。
  • bits:数据位数,可以为5、6、7、8。一般情况下使用8位数据位即可。
  • parity:校验位,可以为None、0、1、2。校验位用于检查数据传输中是否出现错误,一般情况下可以设置为None。
  • stop:停止位,可以为1、2。停止位用于指定每个数据帧的结束位置,一般情况下使用1个停止位即可。
  • timeout:超时时间,单位为毫秒。当读取串口数据时,如果在超时时间内没有读取到任何数据,则会返回None。
  • read_buf_len:读缓冲区长度,用于指定串口读取数据时的缓冲区大小。如果读取的数据量较大,可以适当增大该值,以避免数据丢失。


2.uart.write():该函数用于向串口发送数据。你可以发送字符串或者字节数据。

# 发送数据
uart.write('Hello, UART!')

3.uart.read():该函数用于从串口接收数据。它会阻塞程序直到接收到指定数量的数据或者超时

# 接收数据
data = uart.read(10)
print(data)

这段代码从串口读取最多10个字节的数据,并将其打印出来。

4.uart.any():该函数用于检查串口是否有未读取的数据。如果有,返回值为True;否则返回False。

# 检查是否有未读取的数据
if uart.any():data = uart.read()print(data)

这段代码首先调用uart.any()函数检查串口是否有未读取的数据,如果有,则调用uart.read()函数将数据读取并打印出来。

5.uart.flush():该函数用于清空串口的缓冲区,将所有未读取的数据丢弃

使用K210串口的时候需要映射引脚

# IO6→RX1,IO7→TX1
fm.register(6, fm.fpioa.UART1_RX, force=True)
fm.register(7, fm.fpioa.UART1_TX, force=True)

fm.register()函数是用于配置FPIOA(Flexible Peripheral I/O Assignments)的函数,它可以将指定的引脚与相应的功能进行绑定。

K210与STM32串口通信 

K210与STM32串口通信发送分为两种:一种是发送单字节,一种是发送数据包。因为发送的数据不一样,从而K210的代码和STM32的代码都是不一样的。

本篇文章只涉及K210发送给STM32。

发送单字节:

K210端

from machine import UART, Timer
from fpioa_manager import fm#映射串口引脚
fm.register(6, fm.fpioa.UART1_RX, force=True)
fm.register(7, fm.fpioa.UART1_TX, force=True)
while True:text=uart.read() #读取数据if text: #如果读取到了数据uart.write('1')

STM32端

void Usart3_Init(unsigned int baud)
{GPIO_InitTypeDef gpio_initstruct;USART_InitTypeDef usart_initstruct;NVIC_InitTypeDef nvic_initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);//PA2	TXDgpio_initstruct.GPIO_Mode = GPIO_Mode_AF_PP;gpio_initstruct.GPIO_Pin = GPIO_Pin_10;gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpio_initstruct);//PA3	RXDgpio_initstruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;gpio_initstruct.GPIO_Pin = GPIO_Pin_11;gpio_initstruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &gpio_initstruct);usart_initstruct.USART_BaudRate = baud;usart_initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;		usart_initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;						usart_initstruct.USART_Parity = USART_Parity_No;									usart_initstruct.USART_StopBits = USART_StopBits_1;								usart_initstruct.USART_WordLength = USART_WordLength_8b;							USART_Init(USART3, &usart_initstruct);USART_Cmd(USART3, ENABLE);	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);									nvic_initstruct.NVIC_IRQChannel = USART2_IRQn;nvic_initstruct.NVIC_IRQChannelCmd = ENABLE;nvic_initstruct.NVIC_IRQChannelPreemptionPriority = 0;nvic_initstruct.NVIC_IRQChannelSubPriority = 1;NVIC_Init(&nvic_initstruct);}
if(USART_ReceiveData(USART3)=='1')//K210
{numbert++;
}

发送数据包

K210端

def str_int(data_str):bb = binascii.hexlify(data_str)bb = str(bb)[2:-1]#print(bb)#print(type(bb))hex_1 = int(bb[0])*16hex_2 = int(bb[1],16)return hex_1+hex_2def send_data(x,y,w,h,msg):start = 0x24end = 0x23length = 5class_num = 0x05 #例程编号class_group = 0xBB #例程组data_num = 0x00 #数据量fenge = 0x2c #逗号crc = 0 #校验位data = [] #数据组#参数都为0if x==0 and y==0 and w==0 and h ==0:passelse:#x(小端模式)low = x & 0xFF #低位high = x >> 8& 0xFF #高位data.append(low)data.append(fenge) #增加","data.append(high)data.append(fenge) #增加","#y(小端模式)low = y & 0xFF #低位high = y >> 8& 0xFF #高位data.append(low)data.append(fenge) #增加","data.append(high)data.append(fenge) #增加","#w(小端模式)low = w & 0xFF #低位high = w >> 8& 0xFF #高位data.append(low)data.append(fenge) #增加","data.append(high)data.append(fenge) #增加","#h(小端模式)low = h & 0xFF #低位high = h >> 8& 0xFF #高位data.append(low)data.append(fenge) #增加","data.append(high)data.append(fenge) #增加","if msg !=None:#msgfor i in range(len(msg)):hec = str_int(msg[i])data.append(hec)data.append(fenge) #增加","#print(data)data_num = len(data)length += len(data)#print(length)send_merr = [length,class_num,class_group,data_num]for i in range(data_num):send_merr.append(data[i])#print(send_merr)#不加上CRC位,进行CRC运算for i in range(len(send_merr)):crc +=send_merr[i]crc = crc%256send_merr.insert(0,start) #插入头部send_merr.append(crc)send_merr.append(end)#print(send_merr)global send_bufsend_buf = send_merr

首先是 str_int 函数,它的作用是将输入的字符串转换为整数。具体实现上,它使用了 Python 的标准库中的 binascii.hexlify 方法将输入的字符串 data_str 转换为十六进制表示的字节串,然后对于每一个字节,分别将其高四位和低四位转换成十进制数,并进行一定的运算,最终返回一个整数。

接下来是 send_data 函数,它的作用是组装一个特定格式的数据包。函数接受五个参数 x, y, w, h, msg,其中 x, y, w, h 是四个整数,msg 是一个字符串。根据这些参数,函数构建了一个包含起始标识、长度、例程编号、例程组、数据量、数据内容以及校验位的数据包。

在函数内部,首先定义了一些常量,如起始标识、结束标识、长度、例程编号、例程组等。然后根据传入的参数判断是否需要加入 x, y, w, h 这四个整数。如果这四个整数全部为 0,那么就不将它们加入数据包中,否则将它们按照小端模式(即低位在前、高位在后的顺序)加入到数据中。接下来是对传入的字符串 msg 进行处理,将其中每个字符转换为整数后加入数据中。

接着计算数据量和长度,并将所有数据组装成一个列表 send_merr。最后,计算校验位并将其加入到 send_merr 中,同时在开头和结尾分别加上起始标识和结束标识,最终得到一个完整的数据包。

STM32端 

char buf_msg[100] = {'\0'};
u8 new_flag = 0;
u8 r_index = 0;
u16 buf_crc = 0;
u8 tou_flag = 0;
u8 len_flag = 0;
u8 buf_len = 0;
char data[50];void recv_k210msg(uint8_t recv_msg)
{if (recv_msg == '$'){new_flag = 1;}if (recv_msg == '#'){if (buf_len == r_index){new_flag = 0;tou_flag = 0;len_flag = 0;buf_crc -= buf_msg[r_index - 1];buf_crc %= 256;if (buf_crc == buf_msg[r_index - 1]){deal_recvmsg();}else{r_index = 0;buf_crc = 0;}}}if (new_flag == 1){if (recv_msg == '$' && tou_flag == 0){tou_flag = 1;}else{buf_msg[r_index++] = recv_msg;buf_crc += recv_msg;if (len_flag == 0){buf_len = buf_msg[0];len_flag = 1;}}}
}void deal_recvmsg(void)
{u8 index, data_i = 0;u8 eg_num = buf_msg[1];u8 number = buf_msg[3];u8 i_duo = 0;if (r_index != buf_len){buf_len = 0;return;}for (index = 0; index < number; index++){if (buf_msg[4 + index] == 0x2c && i_duo == 0){i_duo = 1;continue;}data[data_i++] = buf_msg[4 + index];i_duo = 0;}buf_crc = 0;r_index = 0;memset(buf_msg, 0, sizeof(buf_msg));deal_data(eg_num);
}void deal_data(u8 egnum)
{u16 x, y, w, h;u8 msg[20] = {'\0'};u8 icopy = 0;u16 id = 999;switch (egnum){case 1:case 5:case 6:x = data[1] << 8 | data[0];y = data[3] << 8 | data[2];w = data[5] << 8 | data[4];h = data[7] << 8 | data[6];break;case 2:case 3:x = data[1] << 8 | data[0];y = data[3] << 8 | data[2];w = data[5] << 8 | data[4];h = data[7] << 8 | data[6];while (*(data + 8 + icopy) != '\0'){msg[icopy] = *(data + 8 + icopy);icopy++;}break;case 4:x = data[1] << 8 | data[0];y = data[3] << 8 | data[2];w = data[5] << 8 | data[4];h = data[7] << 8 | data[6];id = data[8] << 8 | data[9];while (*(data + 10 + icopy) != '\0'){msg[icopy] = *(data + 10 + icopy);icopy++;}break;case 7:case 8:x = data[1] << 8 | data[0];y = data[3] << 8 | data[2];w = data[5] << 8 | data[4];h = data[7] << 8 | data[6];id = data[8];break;case 9:x = data[1] << 8 | data[0];y = data[3] << 8 | data[2];w = data[5] << 8 | data[4];h = data[7] << 8 | data[6];while (*(data + 8 + icopy) != '\0'){msg[icopy] = *(data + 8 + icopy);icopy++;}break;case 10:case 11:id = data[0];break;}k210_msg.class_n = egnum;k210_msg.x = x;k210_msg.y = y;k210_msg.w = w;k210_msg.h = h;k210_msg.id = id;strcpy((char*)k210_msg.msg_msg, (char*)msg);memset(data, 0, sizeof(data));
}
void USART2_IRQHandler(void)
{uint8_t Rx2_Temp;if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){Rx2_Temp = USART_ReceiveData(USART2);recv_k210msg(Rx2_Temp);}
}
  1. recv_k210msg 函数用于接收 K210 模块传来的消息,并根据特定的起始符号 $ 和结束符号 # 进行消息解析。具体流程如下:

    • 当接收到 $ 符号时,表示开始接收新的消息,将 new_flag 置为 1。
    • 当接收到 # 符号时,表示消息接收完毕,进行消息处理。如果消息长度符合要求,计算消息校验和并调用 deal_recvmsg 进行处理。
    • 在接收到其他字符时,如果处于接收新消息状态,将字符存入缓冲区 buf_msg 中,并更新校验和 buf_crc
  2. deal_recvmsg 函数用于对接收到的消息进行处理,主要是根据消息类型和内容进行解析,并调用 deal_data 函数进行进一步处理。具体流程如下:

    • 根据消息中指定的格式提取数据,并调用 deal_data 函数进行处理。
    • 处理完成后,清空缓冲区 buf_msg 和相关标志位,以便接收下一条消息。
  3. deal_data 函数用于根据不同类型的消息对数据进行解析和处理。具体流程如下:

    • 根据消息的类型进行不同的数据解析操作,提取出消息中的有用信息,并赋值给 k210_msg 结构体。
    • 结构体 k210_msg 包含了消息的分类、位置信息、ID 信息以及消息内容。
    • 处理完成后,清空数据缓冲区 data

 有读者看到这里可能会想问,能不能用单字节的方式发送字符串,STM32中USART_ReceiveData(USART3)=='1'此处没法等于字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx启用WebSocket支持

报错内容nginx.conf proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 问题解决WebSocket跨域 add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Credentials true;

常用芯片学习——AMS1117芯片

AMS1117 1A 低压差线性稳压器 使用说明 AMS1117 是一款低压差线性稳压电路&#xff0c;该电路输出电流能力为1A。该系列电路包含固定输出电压版本和可调输出电压版本&#xff0c;其输出电压精度为士1.5%。为了保证芯片和电源系统的稳定性&#xff0c;XBLWAMS1117 内置热保护和…

对鸢尾花进行分类预测-----pycharm

项目说明 #项目&#xff1a; 对鸢尾花进行分类预测 #实例数量150个(3类各50个) #属性数量&#xff1a;4(数值型&#xff0c;数值型&#xff0c;帮助预测的属性和类) #特征&#xff1a;花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度 单位&#xff1…

SVG 字体 – SVG defs(15)

简介 defs 元素中嵌套了在SVG图片中可重用的定义。在def元素内定义的图形不会展示在SVG图片上。必须通过use元素来引用。 例子 <svg width="500" height="500"><defs>

什么是事务?

事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位。事务会把所有的操作作为一个整体&#xff0c;一起向数据库提交或者是撤销操作请求。所以这组操作要么同时成功&#xff0c;要么同时失败。 1. 事务管理 怎么样来控制这组操作&#xff0c;让这组操作同时成功或…

【MySQL复制】半同步复制

介绍 除了内置的异步复制之外&#xff0c;MySQL 5.7 还支持通过插件实现的半同步复制接口。本节讨论半同步复制的概念及其工作原理。接下来的部分将涵盖与半同步复制相关的管理界面&#xff0c;以及如何安装、配置和监控它。 异步复制 MySQL 复制默认是异步的。源服务器将事…

第三代互联网趋势分析

需求&#xff1a;近日工业和信息化部等七部门关于推动未来产业创新发展的实施意见&#xff1a;工信部联科&#xff08;2024)12号文件下发&#xff0c;物联网时代迎来了政府支持的快速发展期。 1&#xff0c;第三代互联网&#xff0c;也被称为万物互联&#xff08;IoT&#xff0…

机器学习 强化学习 深度学习的区别与联系

机器学习 强化学习 深度学习 机器学习 按道理来说&#xff0c; 这个领域&#xff08;机器学习&#xff09;应该叫做 统计学习 &#xff08;Statistical Learning&#xff09;&#xff0c;因为它的方法都是由概率统计领域拿来的。这些人中的领军人物很有商业头脑&#xff0c; 把…

亚马逊测评:卖家如何操作测评,安全高效(自养号测评)

亚马逊测评的作用在于让用户更真实、清晰、快捷地了解产品以及产品的使用方法和体验。通过买家对产品的测评&#xff0c;也可以帮助厂商和卖家优化产品缺陷&#xff0c;提高用户的使用体验。这进而帮助他们获得更好的销量&#xff0c;并更深入地了解市场需求。亚马逊测评在满足…

【获奖必看2.0】美赛小技巧之一秒输入一个公式

大家好呀&#xff0c;美赛开赛还有四天的时间&#xff0c;今天给大家带来的是美赛论文写作时非常实用的一个小技巧——快速输入任何复杂公式。 相信很多小伙伴在论文写作的时候都有一个小烦恼&#xff0c;那就是在面对比较复杂的公式的时候&#xff0c;应该怎么进行快速输入呢…

vue3项目中让echarts适应div的大小变化,跟随div的大小改变图表大小

目录如下 我的项目环境如下利用element-resize-detector插件监听元素大小变化element-resize-detector插件的用法完整代码如下&#xff1a;结果如下 在做项目的时候&#xff0c;经常会使用到echarts&#xff0c;特别是在做一些大屏项目的时候。有时候我们是需要根据div的大小改…

【Three.js】Layers图层的使用

目录 前言 创建图层对象 启用图层 关闭图层 其他 前言 Layers 对象为Object3D对象分配了1-32个图层&#xff0c;编号为0-31。在内部实现上&#xff0c;每个图层对象被存储为一个bit mask&#xff0c; 默认所有 Object3D 对象都存储在第 0 个图层上。 图层对象可以用于控制…

美国将限制中国,使用Azure、AWS等云,训练AI大模型

1月29日&#xff0c;美国商务部在Federal Register&#xff08;联邦公报&#xff09;正式公布了&#xff0c;《采取额外措施应对与重大恶意网络行为相关的国家紧急状态》提案。 该提案明确要求美国IaaS&#xff08;云服务&#xff09;厂商在提供云服务时&#xff0c;要验证外国…

深度强化学习(王树森)笔记09

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…

【数据结构:顺序表】

文章目录 线性表顺序表1.1 顺序表结构的定义1.2 初始化顺序表1.3 检查顺序表空间1.4 打印1.5 尾插1.6 头插1.7 尾删1.8 头删1.9 查找1.10 指定位置插入1.11 删除指定位置数据1.12 销毁顺序表 数据结构(Data Structure)是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…

ingres nginx 反向代理常见配置(持续更新)

一、匹配到的location的关键字不传递给后端 如果想实现访问的url 匹配到的location&#xff0c;不携带给后端服务 类似nginx的配置如下 可以看到 proxy_pass http://chatbot_flask/; 后面是带了"/"的&#xff0c;这代表反向代理给后端的upstream节点不携带"im…

2024Cypress自动化测试开发指南!

cypress是基于JavaScript语言为编写语言的自动化测试开发工具&#xff0c;配合使用cucumber测试开发框架&#xff0c;以node.js为服务进程&#xff0c;可以简单的帮助测试人员完成需要人工手点的所有页面人机交互操作&#xff0c;可以模拟键盘和鼠标输入&#xff0c;快捷完成ca…

使用串口WiFi透传模块需要解决的几个问题,2串口双串口,3串口多串口转WiFi模块S2W-M02

我们知道在现在物联网时代&#xff0c;串口设备通过WiFi联网上传数据已经有很多的场景需求。但是&#xff0c;现在市面上的大部分串口转WiFi模块都仅仅支持一个串口的数据透传应用。 如果串口转WiFi模块仅仅有一个串口资源进行透传&#xff0c;那么它的应用场景是如下的&#x…

问卷发放实战指南:提高问卷回收率与数据质量的技巧

进行问卷调查分为四步&#xff1a;制作问卷、发放问卷、收集问卷、分析问卷。其中&#xff0c;发放问卷起到了关键性的作用。他关乎到我们后续收集问卷是否顺利&#xff0c;收集到的问卷数据是否具备真实性和有效性。那么&#xff0c;怎么有效地进行问卷发放呢&#xff1f; ​…

【C项目】顺序表

简介&#xff1a;本系列博客为C项目系列内容&#xff0c;通过代码来具体实现某个经典简单项目 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…