ROS研究员 2024-03-25 22:22 采纳率: 35.7%
浏览 25

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

旭日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的主函数代码不会写,有朋友会写么

  • 写回答

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显示屏驱动库已经准备好,并且您已经正确配置了相关的硬件接口。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月25日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价