STM32 自定义串口协议

2023-05-16

STM32 自定义串口协议

  • 1 串行通信
    • 1.1 原理与优缺点
    • 1.2 分类
      • 1.2.1 按通信方向
      • 1.2.2 按通信方式
    • 1.3 异步串行引脚连接
      • 1.3.1 串口外设之间
      • 1.3.2 ARM与PC之间
    • 1.4 字符帧格式
    • 1.5 串口通信过程
    • 1.6 串口框图
  • 2 并行通信
    • 2.1 传输原理与优缺点
  • 3 异步串行实例(自定义通信协议)
    • 3.1 项目需求
    • 3.2 项目框架
    • 3.3 上位机下传帧格式
    • 3.4 代码设计
    • 3.5 下载文档介绍
    • 3.6 下载链接

在设计实现某种功能的系统时,常需要不同设备之间的通信。通信主要有串行和并行两种方式,应用比较广泛的UART(Universial Asynchonous Receiver Transmitter)通用异步收发器,SPI(Serial Peripheral Interface)串行外设接口,I2C(Inter Integrated Circuit)集成电路总线都属于这两种方式之一。下面就以应用比较广泛的串口通信作以介绍,文末附有自定义通信协议的代码。

1 串行通信

1.1 原理与优缺点

数据按位依次传输,使用少数几条通信线路就可以完成系统间交换信息,适合于主机与主机,主机与外设之间的远距离通信。优点是占用引脚资源少,缺点是速度相比并行要慢。

1.2 分类

1.2.1 按通信方向

按通信方向分为单工、半双工、全双工三种。
a、单工:数据传输只支持数据在一个方向上传输。
b、半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。
c、全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。

按通信方向分类

1.2.2 按通信方式

按通信方式分为同步串行和异步串行。
同步串行:同步通信时,通信双方共用一个时钟,这是同步通信区分于异步通信的最显著的特点。同步通信中,数据开始传送前用同步字符来指示(常约定1~2 个),并由时钟来实现发送端和接收端的同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到一块数据传送完毕。同步传送时,字符之间没有间隙,也不要起始位和停止位,仅在数据开始时用同步字符SYNC来指示。例如SPI,I2C通信接口。
异步串行:无时钟信号的驱动,收发双方约定数据帧的格式。每一帧由起始位、数据位、奇偶校验位和停止位组成。传送过程字符之间可以有空隙的存在。例如UART,单总线。

按通信方式分类

1.3 异步串行引脚连接

RXD:数据输入引脚,数据接收。
TXD:数据发送引脚,数据发送。

1.3.1 串口外设之间

串口外设之间的连接

1.3.2 ARM与PC之间

串口外设与PC之间的连接
在这里插入图片描述

当ARM与电脑USB口连接传输数据时,需要一个USB转串口的装置,因为电脑无法识别TTL电平,所以需要连接一个RS232转换器将TTL电平转换成232电平。常采用的是MAX232或国产的CH340芯片。

TTL电平232电平
高电平 1:2.0V ~ 5V高电平1: -15V ~ -13V
低电平 0:0V ~ 0.8V低电平0:+15V ~ +13V

对于LVTTL,高低电平范围分别是 2.4–5V,0-- 0.4V,即LOW VOLTAGE TTL,是低电平标准的TTL。

更多RS232电平连接方式及知识可参考:链接1

1.4 字符帧格式

  1. 起始位
  2. 数据位
  3. 奇偶校验位:奇偶校验位:奇检验就是保证8位数据位中1的个数为基数个,如果1是基数个则检验位就为0,反之为1;偶检验就是保证8位数据位中1的个数为偶数个,如果1是偶数个则检验位就为0,反之为1;

一帧数据的格式

  1. 停止位
  2. 波特率:波特率是指数据传送时,每秒传送数据二进制代码的位数,它的单位是位/秒(bit/s)。在异步串行通信中,接收设备和发送设备保持相同的传送波特率,并以每个字符数据的起始位与发送设备保持同步。起始位。数据位。奇偶位和停止位的约定,在同一次传送过程中必须保持一致,这样才能成功的传送数据。

1.5 串口通信过程

串口通信过程

1.6 串口框图

详细图片可查看STM32F4数据手册26.3节。文末下载链接里有提供STM32F4中文数据手册。

串口通信框图

2 并行通信

2.1 传输原理与优缺点

数据各位同时传送,快速设备之间采用并行通信,例如CPU 与存储设备、存储器与存储器、主机与打印机等都采用并行通信。并行通信,有多少位数据就必须有多少根数据线。优点是传输速度快,效率高,多用在对实时性要求高的场合。缺点是长距离通信时抗干扰能力差,占用引脚资源多。并行通信应用较少,在此不多做介绍。

3 异步串行实例(自定义通信协议)

说明:本实例适合于具体项目中需要自定义帧头、帧尾等数据传输格式的应用场合。比较基础的串口设置步骤例如使能时钟,初始化参数等在此不多做介绍,具体可参考原子哥的STM32F4 开发指南(库函数版) ->5.3.3节和第九章《串口通信实验》。
更多串口接收数据的方式还可以参考:链接2
由于涉及具体项目,故不会透露太多细节,只对通信协议进行介绍,方便大家移植。进入正题。

3.1 项目需求

系统分为三个模块,ARM(STM32F4)、FPGA、模拟电路。具体的系统功能由模拟电路实现。ARM负责接收来自上位机的指令,并控制FPGA输出命令信息和通信信息。

3.2 项目框架

上位机与ARM通过板载的蓝牙通信,采用了HC-05蓝牙转串口模块,模块的引脚RXD与TXD分别与ARM的串口收发端相连接,这样即可实现上位机与ARM的通信。
ARM收到正确的上位机指令后,将指令或数据按照通信协议发送给FPGA,由FPGA控制模拟电路完成系统功能。
在这里插入图片描述
连接方式如下图所示,在图示的基础上,还要将HC-05模块的AT指令设置脚连接到ARM的IO上,AT指令用来设置蓝牙模块的参数,如设备名,密码,波特率之类。尤其要注意的是要设置蓝牙的波特率与程序中设置的串口波特率一样。设置方法见文末下载链接里的文档—HC-05芯片手册。
在这里插入图片描述

3.3 上位机下传帧格式

上位机下传的帧格式
说明:如果是自定义帧头的话,尽量选择55,AA之类不容易在数据部分出现的码,或者是用两个字节充当帧头。
校验和为开始标识+命令号+数据长度+数据(16进制求和)。表中省略号的部分……当然是懒得算啦,一个一个加也太傻了。分享一个计算校验和的网站:链接3
当然帧头/尾、数据长度、数据、校验和这些你可以任意安排,只要上位机按照这种数据格式发送数据,作为处理器端按这种数据格式接收数据就行。这就是双方的通信协议。
数据长度与校验和都是高位在前,低位在后发送。例如命令号为01,没有数据的上位机指令为:C1D20100000194E3F4

3.4 代码设计

当上位机指令有错误时,ARM会返回对应的错误号码,上位机发送指令正确,则会返回上位机发送的数据(只是帧格式中的数据,不包含命令号等其他的)。发送上位机指令用的是串口助手,串口助手设置见下图,串口助手的参数一定要跟ARM程序中设置的一样,就像两个人能正常交流那就得用约定好的语言规则。
不同指令运行结果见下图:

运行结果
开发板型号:正点原子F4探索者
使用芯片:STM32F40ZGT6
开发环境:IAR

//串口初始化
void uart_init(u32 bound){
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟
  
  //串口1对应引脚复用映射
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
  
  //USART1端口配置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10
  
  //USART1 初始化设置
  USART_InitStructure.USART_BaudRate = bound;//波特率设置
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  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); //初始化串口1
  
  USART_Cmd(USART1, ENABLE);  //使能串口1 
  USART_ClearFlag(USART1, USART_FLAG_TC);
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
  
  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
  NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、
}

下面是串口一的中断服务函数,前面设置了字长为8位,串口的收发也是以一个字节为基本单位进行,设计思路是每接收一帧数据,会根据数据下标N来判断数据是否正确,正确则继续接收,错误则返回错误编号且初始化变量。全部接收正确则进入下一个状态。

//串口1中断服务程序
void USART1_IRQHandler(void)  
{
  unsigned int rec_data;
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断 RXNE是准备好读取接收到的数据标志位
  {
    USART_ClearITPendingBit(USART1, USART_IT_RXNE);//清除接受中断标志
    if(N==0) 
    my_chk=0;//初始化和校验
    rec_data = USART_ReceiveData(USART1);//赋值临时变量
    my_chk+=rec_data;//计算和校验
    
    //检验开始标识
    if(N==0)
    {
      if(rec_data!=0xC1) 
      {
        commu_err = PROT_W;
      }
    }
    else if(N==1)
    {
      if(rec_data!=0XD2) 
      {
        commu_err = PROT_W;
      }
    }
    
    //检验命令标识
    else if(N==2)
    {
      if(  rec_data!=0x01 && rec_data!=0x02 && rec_data!=0x03 
           && rec_data!=0x04 && rec_data!=0x05 && rec_data!=0x06 ) 
      {
        commu_err = CODE_W;
      }
      else command=rec_data;
    }
    
    //接收数据长度 2Byte
    else if(N==3){
      rec_length=rec_data;
    }
    else if(N==4)
    {
      rec_length = (rec_length << 8) + (rec_data); //合并数据长度
      if(rec_length>599) 
      {
        commu_err = PROT_W;
      }
    }
    else
    {	
      //接收数据
      
      if(N<=rec_length+4)
      {
        //此处可根据不同命令号的数据长度不同,设置不同的N值筛选条件
        USART_RX_BUF[N-5]=rec_data;  
      
      }
      
      
      //接收和校验 2Byte
      else if(N==rec_length+5) 
      {
        rec_chk=rec_data;
      }
      else if(N==rec_length+6) 
      {
        my_chk-=rec_chk;//减去接收到的校验和低位
        my_chk-=rec_data;//减去接收到的校验和高位
        
        rec_chk = (rec_chk << 8) + rec_data; //合并校验和
        
        if(rec_chk != my_chk)  //判断接收到的校验和与计算出来的校验和是否相等
        {
          commu_err = SUMM_W;
        }
      }
      //接收结束标识
      else if(N==rec_length+7)
      {
        if(rec_data!=0xE3) 
        {
          commu_err = PROT_W;
        }
      }
      else if(N==rec_length+8)
      {
        if(rec_data!=0xF4) 
        {
          commu_err = PROT_W;
        }
        else 
        {
          P2A_Flag = 1;  //上位机发送数据符合协议,接收完毕进入下一个状态
        }
      }
    }
    N++;
    if( commu_err == PROT_W || commu_err == CODE_W || commu_err == SUMM_W )
    {
      while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);  //测试用,正式版本删除
      USART_SendData(USART1,commu_err);  
      Init_USART_RX_BUF();
      Init_BUF();	
    }
    
  }	
}

*主函数中判断接收是否完成,完成后可以进入下一个状态。*
```main.c
int main(void)
{ 
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  delay_init(168);		//延时初始化 
  uart_init(38400);	//串口初始化,波特率为38400
  Init_USART_RX_BUF();  //初始化接受寄存器(上位机发送到ARM的数据存储在此数组)
  Init_BUF();  //过程中的变量初始化
  
  while(1)
  { 
   if(P2A_Flag == 1 )
   {
     
     for(j=0;j<rec_length;j++) //测试用,正式版本删除
     {
     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);  
      USART_SendData(USART1,USART_RX_BUF[j]);  
     }  
     
     Init_BUF(); 
     Init_USART_RX_BUF();
   }
  }
}

3.5 下载文档介绍

文末下载链接内的文档如下图所示:

在这里插入图片描述
编号06的文档是本博客的word版,包含除了代码外的所有文字部分。

3.6 下载链接

链接4

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 自定义串口协议 的相关文章

  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • STM32用一个定时器执行多任务写法

    文章目录 main c include stm32f4xx h uint32 t Power check times 电量检测周期 uint32 t RFID Init Check times RFID检测周期 int main Timer
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • [MM32硬件]搭建灵动微MM32G0001A6T的简易开发环境

    作为学习单片机的经典 自然是通过GPIO点亮LED 或者是响应按钮的外部中断例程 这我们看看SOP8封装的芯片MM32G0001A6T得引脚 除了VDD和GND固定外 我们可以使用PA14 PA1 PA13 PA15 PA2 PA3这六个G
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 解决KEIL编译慢问题

    两种方案 使用v6版本的ARM Compiler 如果v6版本编译不过 必须使用v5版本的 则可以勾选掉Browse Information选项 提升很明显 1分多钟能优化到几秒 看代码量 但是这个有个弊端 在KEIL中会影响函数跳转 建议
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能

随机推荐

  • wifi收发数据包分析

    根据802 11n协议WIFI每次发送64字节数据 Intel5300网卡接收的数据包大小为213字节或者393字节或者573字节 说明接受的数据包包含多个发送的包 猜想每个数据包是由多个主体重复加上固定的标志位组成 x 61 1 2 3
  • 清华大学 | 摄像头-激光雷达的时空在线集成标定方法

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 后台回复 多模态综述 获取论文 xff01 后台回复 ECCV2022 获取ECCV2022所有自动驾驶方向论文 xff01 后台回复 领域综述
  • 操作系统-硬件结构(小林coding笔记)

    控制和管理整个计算机系统的硬件和软件资源 xff1b 提供给用户和其他软件方便的接口和环境 xff1b 主要包括进程管理 内存管理 文件系统 设备管理和网络系统 图灵机的工作方式 基本思想就是用机器模拟人类用纸笔进行数学运算的过程 主要包含
  • 操作系统-三、操作系统结构(小林coding笔记)

    3 1Linux内核和Windows内核 Windows和Linux是常见的两款操作系统 xff0c 操作系统最核心的东西就是内核 内核 内核作为应用连接硬件设备的桥梁 内核的四个基本功能 xff1a 进程调度 内存管理 硬件通信 系统调用
  • 操作系统-四、内存管理(小林coding笔记)

    虚拟内存 防止内存运行多个程序时崩溃 把进程所使用的地址隔离开 xff0c 让操作系统为每个进程分配一套独立的虚拟地址 操作系统会提供一种机制 xff0c 将不同进程的虚拟地址和不同内存的物理地址映射起来 内存分段 程序时由若干逻辑分段组成
  • libcurl库

    目录 1 libcurl简介2 libcurl的使用3 libcurl的安装Libcurl库等第三方库的通用编译方法 3 调用libcurl访问百度主页4 libcurl 相关API解读1 curl global init 2 curl g
  • ERROR: cannot launch node of type: rplidar_ros

    1首先使用rospack find 命令查找该功能包 xff0c 如果输出功能包路径则该功能包存在 xff0c 如果提示没有则说明我们需要下载一个rplidar ros rospack find rplidar ros 2使用sudo ap
  • 【jetson nano】jetson nano环境配置+yolov5部署+tensorRT加速模型

    目录 jetson nano环境配置 43 yolov5部署 43 tensorRT加速模型致谢主机和jetson nano环境jetson系统开机烧录 系统设置 换源python环境配置conda环境yolov5环境matplotlib和
  • MDK仿真出现NOT IN SCOPE(不在范围内)

    这两天刚拿到一套GD32F1系列的开发板 xff0c 想着测试一下 xff0c 看和STM32的有啥不同 xff0c 自己仿真时候 xff0c 想要在窗口观察一下数值 xff0c 结果总是提示NOT IN SCOPE没办法 xff0c 就查
  • Keil调试局部变量显示“not in scope“的问题解决

    Keil调试局部变量显示 34 not in scope 34 的问题解决 参考文章 xff1a xff08 1 xff09 Keil调试局部变量显示 34 not in scope 34 的问题解决 xff08 2 xff09 https
  • MPU6050可以读取ID值,温度值和原始数据值为零问题解决

    MPU6050可以读取ID值 xff0c 温度值和原始数据值为零问题解决 参考文章 xff1a xff08 1 xff09 MPU6050可以读取ID值 xff0c 温度值和原始数据值为零问题解决 xff08 2 xff09 https w
  • 英伟达Jetson Xavier NX部署YOLO5

    1 查看JetPack版本 新到手的NX首先需要确定一下JetPack的版本 xff1a sudo apt span class token operator span cache show nvidia span class token
  • 史上最全 | BEV感知算法综述(基于图像/Lidar/多模态数据的3D检测与分割任务)...

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心技术交流群 后台回复 BEV综述 获取论文 xff01 后台回复 ECCV2022 获取ECCV2022所有自动驾驶方向论文
  • matlab-字符串的处理操作

    建立一个字符串向量 xff0c 然后对该向量做如下处理 xff1a 取第1 5个字符组成的子字符串 将字符串倒过来重新排列 将字符串中的小写字母变成相应的大写字母 xff0c 其余字符不变 统计字符串中小写字母的个数 代码 ch 61 39
  • curl发送带有Authorization的POST请求

    一 参数说明 格式 xff1a curl H 请求头 d 请求体 X POST 接口地址 参数内容格式 H header 请求头 Content Type application json d请求内容 remote host 10 163
  • AStar寻路算法 (C#)

    一 介绍 A星算法其实并不是最短路径算法 xff0c 它找到的路径并不是最短的 xff0c 它的目标首先是能以最快的速度找到通往目的地的路 B星实际上是A星的优化 但是B星的缺点是不能向后查找 所以会有问题 还有一种D星的可以用来找最短路径
  • 深度相机介绍(TOF、RGB双目、结构光参数对比)

    一 深度相机的介绍 随着计算机视觉与人工智能技术的飞速发展 xff0c 采用深度相机进行场景三维重建 目标检测 环境感知等应用越来越广泛 xff0c 与传统的2D相机不同 xff0c 深度相机可以通过拍摄空间来获得景深信息 xff0c 从而
  • 网络编程——UDP

    目录 UDP的服务器端 UDP的echo客户端代码 UDP的echo服务器端代码 UDP的服务器端 先运行服务器端 xff0c 再运行客户端 服务端 xff1a 开发者 xff1a Virtuous 开发版本 xff1a 1 0 开发时间
  • HTTP 完全解析

    Http 详解 HTTP 的定义 HTTP即是 xff1a Hypertext Transfer Protocol xff0c 超文本传输协议 xff0c 种 络传输协议 xff0c 位于 TCP IP 协议族的最顶层 应 层 URL 说到
  • STM32 自定义串口协议

    STM32 自定义串口协议 1 串行通信1 1 原理与优缺点1 2 分类1 2 1 按通信方向1 2 2 按通信方式 1 3 异步串行引脚连接1 3 1 串口外设之间1 3 2 ARM与PC之间 1 4 字符帧格式1 5 串口通信过程1 6