• 旭日x3派上实时订阅yolov5识别到的内容并通过串口发送到stm32f10系上并通过oled实时显示的stm32代码怎么写


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 ROS研究员 2024-03-25 22:22 采纳率: 35.7% 浏览 12 首页/ 编程语言 / 旭日x3派上实时订阅yolov5识别到的内容并通过串口发送到stm32f10系上并通过oled实时显示的stm32代码怎么写 python 旭日x3派上实时订阅yolov5识别到的内容并通过串口发送到stm32f10系上并通过oled实时显示jiesou.py import rclpy from rclpy.node import Node from ai_msgs.msg import PerceptionTargets from distance import miao_distance class MinimalSubscriber(Node): def __init__(self): super().__init__('minimal_subscriber') self.subscription = self.create_subscription( PerceptionTargets, 'hobot_dnn_detection', self.listener_callback, 10) self.subscription # prevent unused variable warning self.count = 0 def listener_callback(self, msg): # 回调函数,每帧推理结果产生后就会运行这个函数 # 这里给出解析的方法 print("\n \033[31m---\033[0m This Frame: FPS = %d \033[31m---\033[0m"%msg.fps) for num, target in enumerate(msg.targets): h = target.rois[0].rect.height dis_cm = miao_distance(h) print("Traget \033[0;32;40m%d\033[0m: "%num, end="") print("Type: %s, x_offset=%d, y_offset=%d, height=%d, width=%d, conf=%.2f,distance=%.2f"%(target.rois[0].type, target.rois[0].rect.x_offset, target.rois[0].rect.y_offset, target.rois[0].rect.height, target.rois[0].rect.width, target.rois[0].confidence, dis_cm)) def main(args=None): rclpy.init(args=args) minimal_subscriber = MinimalSubscriber() rclpy.spin(minimal_subscriber) minimal_subscriber.destroy_node() rclpy.shutdown() # 给main函数一个入口,省得colcon build编译 if __name__ == '__main__': main() 串口发送的代码fs.py import serial import subprocess # 初始化串口通信 ser = serial.Serial('/dev/ttyS3', 9600) # 替换为实际串口设备和波特率 # 启动订阅节点的命令 cmd = "python3 jieshou.py" process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) while True: output = process.stdout.readline() if output == b'' and process.poll() is not None: break if output: print(output.strip()) ser.write(output.strip()) # 将数据通过串口发送 # 关闭串口连接 ser.close() stm32的主函数代码不会写,有朋友会写么 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    1条回答 默认 最新

    • 山外有山a 2024-03-27 02:07
      关注

      以下是一个简单的STM32主函数代码示例,用于说明如何实现这一功能。

      首先,我们需要包含必要的头文件,并定义与串口和OLED显示屏通信相关的宏和函数原型。

      #include "stm32f10x.h"
      #include "misc.h"
      #include "stm32f10x_usart.h"
      #include "stm32f10x_gpio.h"
      #include "stm32f10x_rcc.h"
      #include "fonts.h" // 假设您有一个包含字体定义的头文件
      
      // 定义串口接收缓冲区大小
      #define RX_BUFFER_SIZE 128
      
      // 定义OLED显示屏的初始化和显示函数
      void OLED_Init(void);
      void OLED_ShowString(u8 x, u8 y, u8 *str);
      
      // 串口接收完成的回调函数
      void USART1_RX_IRQHandler(void);
      
      // 串口接收缓冲区
      u8 rxBuffer[RX_BUFFER_SIZE];
      u8 rxBufferIndex = 0;
      
      

      接下来,我们可以实现串口初始化、OLED显示屏初始化和显示字符串的函数。

      // 初始化串口
      void USART1_Init(void) {
          GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
      
          // 使能USART1和GPIOA时钟
          RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
      
          // 配置USART1的TX和RX引脚为复用推挽输出
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
          GPIO_Init(GPIOA, &GPIO_InitStructure);
      
          // 初始化USART1
          USART_InitStructure.USART_BaudRate = 9600;
          USART_InitStructure.USART_WordLength = USART_WordLength_8b;
          USART_InitStructure.USART_StopBits = USART_StopBits_1;
          USART_InitStructure.USART_Parity = USART_Parity_No;
          USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
          USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
          USART_Init(USART1, &USART_InitStructure);
      
          // 使能USART1接收中断
          USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
          NVIC_InitTypeDef NVIC_InitStructure;
          NVIC_InitStructure.NVIC_IRQChannel = USART1_RX_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
          NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
          NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);
      
          // 启用USART1
          USART_Cmd(USART1, ENABLE);
      }
      
      // 初始化OLED显示屏
      void OLED_Init(void) {
          // 这里添加您的OLED初始化代码
      }
      
      // 在OLED显示屏上显示字符串
      void OLED_ShowString(u8 x, u8 y, u8 *str) {
          // 这里添加您的OLED显示字符串代码,使用字体库来显示字符串
      }
      
      

      现在,我们可以编写中断服务例程来处理串口接收到的数据。

      // 串口接收中断服务程序
      void USART1_RX_IRQHandler(void) {
          if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
              u8 data = USART_ReceiveData(USART1);
              if (rxBufferIndex < RX_BUFFER_SIZE - 1) {
                  rxBuffer[rxBufferIndex++] = data;
              }
              if (data == '\n' || rxBufferIndex >= RX_BUFFER_SIZE - 1) {
                  rxBuffer[rxBufferIndex] = '\0'; // 添加字符串结束符
                  rxBufferIndex = 0; // 重置索引,准备接收下一组数据
                  OLED_ShowString(0, 0, (u8 *)"Received:"); // 显示接收到的数据
                  OLED_ShowString(0, 8, rxBuffer); // 显示接收到的数据
              }
          }
      }
      
      

      最后,我们可以实现主函数,设置系统时钟、初始化串口和OLED显示屏,并进入一个无限循环来持续检查是否有新的数据接收。

      
      
      
      
      int main(void) {
          // 设置系统时钟
          SystemInit();
      
          // 初始化串口
          USART1_Init();
      
          // 初始化OLED显示屏
          OLED_Init();
      
          // 主循环
          while (1) {
              // 这里可以添加其他任务,例如定时检查串口接收状态等
          }
      }
      

      请注意,这个代码示例是一个基本的框架,您需要根据您的硬件配置和需求来填充具体的初始化和显示代码。此外,确保您的OLED显示屏驱动库已经准备好,并且您已经正确配置了相关的硬件接口。

      展开全部

      评论
      山外有山a 2024-03-27 02:10

      为了使上述代码在实际环境中运行,您需要以下几个方面的支持和准备:

      硬件连接:

      确保STM32F10系列微控制器的USART1的TX和RX引脚已经正确连接到您的OLED显示屏和用于与上位机通信的串口设备。
      如果您的OLED显示屏需要特定的电源电压,请确保它已经正确供电。
      库文件和驱动:

      您需要有适用于STM32F10系列的USART和GPIO库函数,这些通常可以在STM32的标准外设库(SPL)或硬件抽象层(HAL)中找到。
      对于OLED显示屏,您需要一个支持该显示屏的库,其中包含初始化显示屏、清除显示屏、设置显示位置和打印字符串等功能的函数。
      中断配置:

      根据您使用的编译器和开发环境,您可能需要配置中断向量和中断优先级。确保USART1_RX_IRQn中断已经正确映射到USART1_RX_IRQHandler函数。
      启动代码和链接脚本:

      您需要一个适合STM32F10系列的启动代码(startup file),它负责初始化微控制器的内存布局和设置中断向量表。
      链接脚本(linker script)应该被配置为定义程序的内存布局,包括代码、数据和堆栈的大小和位置。
      编译和调试环境:

      选择一个适合STM32F10系列的编译器,如Keil MDK、IAR Embedded Workbench或者免费的开源工具链,如GCC ARM Embedded。
      准备一个调试器或仿真器,如ST-Link,用于下载程序到STM32F10系列微控制器并进行调试。
      代码适配:

      根据实际的OLED显示屏和串口设备的特性,您可能需要修改或添加一些函数来适配硬件。
      如果您的硬件平台与示例代码中的不同,确保更新相关的GPIO和USART端口定义。
      测试和验证:

      在实际硬件上测试代码,验证串口通信和OLED显示功能是否正常工作。
      如果遇到问题,使用调试工具进行故障排除。
      确保在实际部署之前,您已经对代码进行了充分的测试和验证,以确保系统的稳定性和可靠性。

      回复
      编辑
      预览

      报告相同问题?

    • 相关阅读:
      页面间通信postMessage和onmessage
      Polygon zkEVM哈希状态机——Keccak-256和Poseidon
      CADD课程学习(5)-- 构建靶点已知的化合结构(ChemDraw)
      Go 查找重复的行
      IIS服务器下如何支持url重写
      Feign踩坑源码分析--@FeignClient注入容器
      数据结构与算法之折半查找
      大学宿舍IP一键视频对讲
      视频编解码器的现状 (2022)
      Redis入门 (店铺营业状态设置) --苍穹外卖day4
    • 原文地址:https://ask.csdn.net/questions/8078957