STM32接收串口数据并且存储SD,Python读取SD验证

news2024/11/24 13:55:40

在我们使用 STM32 或者 FPGA 采集数据的时候,需要将数据存储到SD卡中,因为数据是按照地址存储的,并且没有文件结构,所以不能直接用电脑的文件管理器读取,下面是一种读取数据的办法

0. 实验平台

正点原子STM32F407ZG探索者

1. Python生成写入的数据

# %%
# 定义生成文件的大小(字节数)
file_size = 512

# 递增数据的起始值
start_value = 1

# 打开文件并写入递增数据
with open('output.bin', 'wb') as file:
    # 递增循环直到达到文件大小
    for i in range(file_size):
        # 将递增数据写入文件(使用小端字节序)
        file.write(start_value.to_bytes(1, byteorder='little'))
        # 递增起始值
        start_value += 1
        # 如果起始值超过255,则回绕到0
        if start_value > 10:
            start_value = 0

运行完此代码后,将会在当前文件夹里面生成一个output.bin的二进制文件,我们可以使用16进制的文本阅读器打开查看里面的内容
在这里插入图片描述

2. STM32源码

注意:数据需要以0x66aa结尾,这里是自定义的,具体的结尾标志可以自己设定。完整代码可以查看本文章顶部的资源

2.1 接收串口中断函数

void USART_UX_IRQHandler(void)
{
    uint8_t rxdata;
#if SYS_SUPPORT_OS  /* 如果SYS_SUPPORT_OS为真,则需要支持OS. */
    OSIntEnter();
#endif

    if (USART_UX->SR & (1 << 5))                /* 接收到数据 */
    {
        rxdata = USART_UX->DR;

        if ((g_usart_rx_sta & 0x8000) == 0)     /* 接收未完成? */
        {
            if (g_usart_rx_sta & 0x4000)        /* 接收到了0x66? */
            {
                if (rxdata != 0xaa)             /* 接收到了0xaa? (必须先接收到到0x66,才检查0xaa) */
                {
                    g_usart_rx_sta &= ~0x4000;
                    g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = 0x66;   /* 存储数据到 g_usart_rx_buf */
                    g_usart_rx_sta++;
                    
                    if (rxdata == 0x66)
                    {
                        g_usart_rx_sta |= 0x4000;   /* 标记接收到了 0x66 */
                    }
                    else
                    {
                        g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = rxdata;   /* 存储数据到 g_usart_rx_buf */
                        g_usart_rx_sta++;
                        if (g_usart_rx_sta > (USART_REC_LEN - 1))g_usart_rx_sta = 0;/* 接收数据溢出, 重新开始接收 */
                    }
                }
                else
                {
                    g_usart_rx_sta |= 0x8000;   /* 收到了0x0a,标记接收完成了 */
                }
            }
            else      /* 还没收到0x0d */
            {
                if (rxdata == 0x66)
                {
                    g_usart_rx_sta |= 0x4000;   /* 标记接收到了 0x66 */
                }
                else
                {
                    g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = rxdata;   /* 存储数据到 g_usart_rx_buf */
                    g_usart_rx_sta++;
                    if (g_usart_rx_sta > (USART_REC_LEN - 1))g_usart_rx_sta = 0;/* 接收数据溢出, 重新开始接收 */
                }
            }
        }
    }
    #if SYS_SUPPORT_OS  /* 如果SYS_SUPPORT_OS为真,则需要支持OS. */
    OSIntExit();
#endif
}

2.2 主函数

int main(void)
{
    uint8_t key;
    uint16_t t = 0;
    sys_stm32_clock_init(336, 8, 2, 7);         /* 设置时钟,168Mhz */
    delay_init(168);                            /* 延时初始化 */
    usart_init(84, 115200);                     /* 串口初始化为115200 */
    led_init();                                 /* 初始化LED */
    key_init();                                 /* 初始化按键 */

    while (sd_init())    /* 检测不到SD卡 */
    {

    }
    /* 打印SD卡相关信息 */
    show_sdcard_info(); 
    
    uint8_t k=0;
    uint8_t i=0;
    state[i] = sd_write_disk(data,0,10);
    uint16_t len;
    len = 0;

    while (1)
    {
        key = key_scan(0);
        if (key == KEY0_PRES)       /* KEY0按下了 */
        {
            sd_test_read(0,1);  /* 从0扇区读取1*512字节的内容 */
        }
        
        if (g_usart_rx_sta & 0x8000)        /* 接收到了数据? */
        {
            len = g_usart_rx_sta & 0x3fff;  /* 得到此次接收到的数据长度 */
            for (t = 0; t < len; t++)
            {
                USART_UX->DR = g_usart_rx_buf[t];
                while ((USART_UX->SR & 0X40) == 0); /* 等待发送结束 */
            }
            state[0] = sd_write_disk(g_usart_rx_buf,0,1);
            if (state[0] == 0)
            {
                printf("\r\n%d\r\n",len);
                printf("Write over!\r\n");
            }
            printf("\r\n\r\n"); /* 插入换行 */
            g_usart_rx_sta = 0;
        }
    }
}

3. Python读取SD卡代码

使用读卡器将 SD 卡连接到电脑上,
如果弹出磁盘已损坏之类的千万不要管!!!
如果弹出磁盘已损坏之类的千万不要管!!!
如果弹出磁盘已损坏之类的千万不要管!!!
继续往下看!

import struct
disk = open(r"\\.\PhysicalDrive1","rb") # 打开磁盘0,PhysicalDrive不区分大小写
# 读取第一个扇区, 也就是磁盘主引导记录, 1扇区为512字节
data = disk.read(512)
data = struct.unpack(len(data)*'B',data)
print(data)

然后注意上方代码中的PhysicalDrive1这里的1对应电脑的硬盘序号,可以此电脑(右键)->管理->磁盘管理中看到,这里的序号就是 PhysicalDrive 后面要跟的数字,我的电脑显示是磁盘 1,所以写的是 1
在这里插入图片描述
在这里插入图片描述

4. 验证结果

运行上面的程序即可得到结果,这里是没有解包的结果
在这里插入图片描述

这一段代码是解包的过程,详细的可以查看这一篇博客:Python Struct 库之 pack 和 unpack 详解
取消注释下列代码后的结果

data = struct.unpack(len(data)*'B',data)

在这里插入图片描述

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

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

相关文章

mysql 是否包含 返回索引 截取字符串

是否包含返回索引 原文链接&#xff1a;https://www.cnblogs.com/shoshana-kong/p/16474175.html 方法1&#xff1a;使用通配符%。 通配符也就是模糊匹配&#xff0c;可以分为前导模糊查询、后导模糊查询和全导匹配查询&#xff0c;适用于查询某个字符串中是否包含另一个模糊…

TCP协议是如何实现可靠传输的

一、TCP最主要的特点 1.TCP 是面向连接的运输层协议&#xff0c;在无连接的、不可靠的 IP 网络服务基础之上提供可靠交付的服务。为此&#xff0c;在 IP 的数据报服务基础之上&#xff0c;增加了保证可靠性的一系列措施。 2.TCP最主要的特点 &#xff08;1&#xff09;TCP 是…

SpringBootWeb AOP(上)

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

php通过cURL爬取数据(2):CURLINFO_HTTP_CODE返回0

CURLINFO_HTTP_CODE返回0 一、项目说明二、curl_getinfo返回异常1.小鹅通SDK2.CURLINFO_HTTP_CODE为0的原因有哪些&#xff1f;3.返回CURLINFO_HTTP_CODE0的解决方案4.请求超时和服务器配置&#xff0c;CPU的使用率有关系吗5.结论 三、阿里云短信发送延迟后而集中发送1.发送集中…

自动化测试Junit

目录 Junit5注解TestDisabledBeforeAll、AfterAll、BeforeEach、AfterEach 参数化单参数多参数CSV获取参数方法获取参数 测试用例执行顺序断言 assert断言相等断言不相等断言为空断言不为空 测试套件 自动化测试项目1. 熟悉项目2. 针对核心流程设计手工测试用例3. 将手工测试用…

智能生成的登录、注册和找回密码界面,让您的网站更加便捷和高效

chatgpt国内镜像 https://chat.xingheai.life 恰饭广告 智能生成的登录、注册和找回密码界面&#xff0c;让您的网站更加便捷和高效 本文介绍了一种基于ChatGPT的智能生成技术&#xff0c;用于生成登录、注册和找回密码界面。我们使用了自然语言处理和机器学习技术&#xff0c;…

七、进程地址空间

一、环境变量 &#xff08;一&#xff09;概念 环境变量(environment variables)&#xff1a;系统当中用做特殊用途的系统变量。 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可…

深入理解深度学习——正则化(Regularization):Dropout

分类目录&#xff1a;《深入理解深度学习》总目录 Dropout供了正则化一大类模型的方法&#xff0c;计算方便且功能强大。在第一种近似下&#xff0c;Dropout可以被认为是集成大量深层神经网络的实用Bagging方法。Bagging涉及训练多个模型&#xff0c;并在每个测试样本上评估多个…

数组扁平化的8种方法 - js篇

文章目录 方式1&#xff1a;使用基础的递归遍历方式2&#xff1a;使用reduce函数递归遍历方式3&#xff1a;数组强制类型转换方式4&#xff1a;while循环结合findIndex与concat方式5&#xff1a;直接使用ES6的flat方法方式6&#xff1a;使用JSON的函数和正则表达式方式7&#x…

#【六·一】让代码创造童话,共建快乐世界# 庆祝儿童节的Html和Python代码

文章目录 1.儿童节的简介2.中国庆祝儿童节的方式3.一段庆祝儿童节的Python代码4.一段庆祝儿童节的Html代码 1.儿童节的简介 国际儿童节&#xff08;又称儿童节&#xff0c;International Children’s Day&#xff09;定于每年的6月1日。为了悼念1942年6月10日的利迪策惨案和全…

dvwa靶场通关(五)

第五关 File Upload&#xff08;文件上传漏洞&#xff09; File Upload&#xff0c;即文件上传漏洞&#xff0c;通常是由于对上传文件的类型、内容没有进行严格的过滤、检查&#xff0c;使得攻击者可以通过上传木马获取服务器的webshell权限 low low等级没有任何的防护 创建…

10 【组件编码流程 组件自定义事件 全局事件总线】

1.组件编码流程 组件化编码流程&#xff1a; ​ (1).拆分静态组件&#xff1a;组件要按照功能点拆分&#xff0c;命名不要与html元素冲突。 ​ (2).实现动态组件&#xff1a;考虑好数据的存放位置&#xff0c;数据是一个组件在用&#xff0c;还是一些组件在用&#xff1a; ​ 1…

将MSYS2 MinGW集成到Windows终端

微软开发了一款Windows终端的开源软件&#xff0c;非常好用。安装后在Win7及以上系统会在右键菜单中添加一条“在终端中打开”的命令&#xff0c;非常方便。它默认配置了Windows命令行以及PowerShell&#xff0c;如果安装了Visual Studio 2022还会配置Visual Studio 2022的命令…

C++入门教程||C++ Web 编程

C Web 编程 什么是 CGI&#xff1f; 公共网关接口&#xff08;CGI&#xff09;&#xff0c;是一套标准&#xff0c;定义了信息是如何在 Web 服务器和客户端脚本之间进行交换的。CGI 规范目前是由 NCSA 维护的&#xff0c;NCSA 定义 CGI 如下&#xff1a;公共网关接口&#xf…

《Java并发编程实战》课程笔记(十二)

CountDownLatch 和 CyclicBarrier&#xff1a;如何让多线程步调一致&#xff1f; 原始对账系统 对账系统的业务简化后&#xff1a; 首先用户通过在线商城下单&#xff0c;会生成电子订单&#xff0c;保存在订单库&#xff1b;之后物流会生成派送单给用户发货&#xff0c;派送…

软件测试面试怎样介绍自己的测试项目?会问到什么程度?

想知道面试时该怎样介绍测试项目&#xff1f;会问到什么程度&#xff1f;那就需要换位思考&#xff0c;思考HR在这个环节想知道什么。 HR在该环节普遍想获得的情报主要是下面这2个方面&#xff1a; 1&#xff09;应聘者的具体经验和技术能力&#xff0c; 2&#xff09;应聘者的…

【企业化部署】Tomcat部署及优化

文章目录 前言一、Tomcat 的概念1. Tomcat 核心组件1.1 什么是 servlet1.2 什么是 JSP 2. Tomcat 功能组件结构2.1 Container 结构分析 3. Tomcat 请求过程4. 配置文件4.1 安装目录4.2 conf 子目录 二、Tomcat 服务部署1. 下载并安装 JDK1.1 关闭防火墙&#xff0c;将安装 Tomc…

码垛机械臂工作站系统设计

码垛机械臂工作站系统设计 第一章 控制系统硬件设计1.1 引言1.2 控制系统总体方案1.3 控制系统硬件的选型1.3.1 可编程控制器的选型1.3.2 工业触摸屏的选型1.3.3 传感器的选型 1.4 硬件的接线与通讯1.4.1 可编程控制器的I/O分配与接线1.4.2 伺服电机驱动器的接线1.4.3 触摸屏与…

XML入库后空白字符丢失问题

最近项目上在做电子病历&#xff0c;使用的是第三方的电子病历组件&#xff0c;该病历组件是利用XML来组织数据的。界面上渲染出来的效果如下图&#xff1a; XML渲染后的界面 对应的后台数据&#xff08;已做简化处理&#xff09;是如下XML格式的&#xff0c;其中的空格部分是…

Windows 下配置Vitis HLS OpenCV仿真库(记录帖)

遇到的问题 我的配置&#xff1a; Vitis Vision 2022 opencv-4.4.0 vision Library 2022 Vitis HLS 2021.1 实测有BUG&#xff0c;编译好之后无法综合&#xff0c;别问我为什么知道 1. Download opencv_ffmpeg.dll 卡住 解决方法 打开 new_build 目录&#xff08;编译路径&…