当前位置: 首页 > news >正文

树莓派3:64位系统串口(UART)使用问题的解决方法

前言

当我们要使用串口进行zigbee的短距离通信时,发现无法使用串口.

原因

树莓派3bCPU内部有两个串口,一个硬件串口(就是我们平时使用的UART),还有一个迷你串口(mini-uart),在老版本的树莓派中把硬件串口分配在GPIO上,可以单独使用.但是在新的树莓派中官方把硬件串口给了蓝牙模块上,而将一个没有时钟源,必须使用内核提供时钟参考源的mini串口,分发给GPIO的串口,这样以来由于内核的频率本身是在一直变换的,导致"mini串口"的速率不稳定,出现不能使用的情况.(我这边甚至没有显示出来(就是没有/dev/serial0 ->ttyS0)),工程师也知道这个bug了就没直接启动mini串口,只准我们用蓝牙.

解决只有serial1 -> ttyAMA0的情况

这是没打开GPIO串口的情况,只有serial1(蓝牙)使用的是ttyAMA0(硬件串口):

这里我试了很多方法,大体分为两种:
1,sudo  nano  /boot/config.txt 去里面打开写enable_uart=1,或者其他这就要看(cd /boot/overlays/#提供了README)这个文件的README了.
下面就是README的全部有关UART的解释

  krnbt_baudrate          Set the baudrate of the PL011 UART when usedwith krnbt=onuart0                   Set to "off" to disable uart0 (default "on")uart1                   Set to "on" or "off" to enable or disable uart1(default varies)
Name:   disable-bt
Info:   Disable onboard Bluetooth on Pi 3B, 3B+, 3A+, 4B and Zero W, restoringUART0/ttyAMA0 over GPIOs 14 & 15.N.B. To disable the systemd service that initialises the modem so itdoesn't use the UART, use 'sudo systemctl disable hciuart'.
Load:   dtoverlay=disable-bt
Params: <None>Name:   dpi18
Info:   Overlay for a generic 18-bit DPI displayThis uses GPIOs 0-21 (so no I2C, uart etc.), and activates the output2-3 seconds after the kernel has started.
Load:   dtoverlay=dpi18
Params: <None>Name:   dpi18cpadhi
Info:   Overlay for a generic 18-bit DPI display (in 'mode 6' connection scheme)This uses GPIOs 0-9,12-17,20-25 (so no I2C, uart etc.), and activatesthe output 3-3 seconds after the kernel has started.
Load:   dtoverlay=dpi18cpadhi
Params: <None>Name:   dpi24
Info:   Overlay for a generic 24-bit DPI displayThis uses GPIOs 0-27 (so no I2C, uart etc.), and activates the output2-3 seconds after the kernel has started.
Load:   dtoverlay=dpi24
Params: <None>Name:   midi-uart0
Info:   Configures UART0 (ttyAMA0) so that a requested 38.4kbaud actually gets31.25kbaud, the frequency required for MIDI
Load:   dtoverlay=midi-uart0
Params: <None>Name:   midi-uart1
Info:   Configures UART1 (ttyS0) so that a requested 38.4kbaud actually gets31.25kbaud, the frequency required for MIDI
Load:   dtoverlay=midi-uart1
Params: <None>Name:   midi-uart2
Info:   Configures UART2 (ttyAMA1) so that a requested 38.4kbaud actually gets31.25kbaud, the frequency required for MIDI
Load:   dtoverlay=midi-uart2
Params: <None>Name:   midi-uart3
Info:   Configures UART3 (ttyAMA2) so that a requested 38.4kbaud actually gets31.25kbaud, the frequency required for MIDI
Load:   dtoverlay=midi-uart3
Params: <None>Name:   midi-uart4
Info:   Configures UART4 (ttyAMA3) so that a requested 38.4kbaud actually gets31.25kbaud, the frequency required for MIDI
Load:   dtoverlay=midi-uart4
Params: <None>Name:   midi-uart5
Info:   Configures UART5 (ttyAMA4) so that a requested 38.4kbaud actually gets31.25kbaud, the frequency required for MIDI
Load:   dtoverlay=midi-uart5
Params: <None>Name:   miniuart-bt
Info:   Switch the onboard Bluetooth function on Pi 3B, 3B+, 3A+, 4B and Zero Wto use the mini-UART (ttyS0) and restore UART0/ttyAMA0 over GPIOs 14 &15. Note that this may reduce the maximum usable baudrate.N.B. It is also necessary to edit /lib/systemd/system/hciuart.serviceand replace ttyAMA0 with ttyS0, unless using Raspbian or anotherdistribution with udev rules that create /dev/serial0 and /dev/serial1,in which case use /dev/serial1 instead because it will always becorrect. Furthermore, you must also set core_freq and core_freq_min tothe same value in config.txt or the miniuart will not work.
Load:   dtoverlay=miniuart-bt,<param>=<val>
Params: krnbt                   Set to "on" to enable autoprobing of Bluetoothdriver without need of hciattach/btattachName:   pi3-miniuart-bt
Info:   This overlay has been renamed miniuart-bt, keeping pi3-miniuart-bt asan alias for backwards compatibility.
Load:   <Deprecated>Name:   qca7000-uart0
Info:   in-tech's Evaluation Board for PLC Stamp micro (UART)This uses uart0/ttyAMA0 over GPIOs 14 & 15 to connect the QCA7000.But it requires disabling of onboard Bluetooth onPi 3B, 3B+, 3A+, 4B and Zero W.
Load:   dtoverlay=qca7000-uart0,<param>=<val>
Params: baudrate                Set the baudrate for the UART (default"115200")Name:   sc16is750-i2c
Info:   Overlay for the NXP SC16IS750 UART with I2C InterfaceEnables the chip on I2C1 at 0x48 (or the "addr" parameter value). Toselect another address, please refer to table 10 in reference manual.
Load:   dtoverlay=sc16is750-i2c,<param>=<val>
Params: int_pin                 GPIO used for IRQ (default 24)addr                    Address (default 0x48)xtal                    On-board crystal frequency (default 14745600)Name:   sc16is752-i2c
Info:   Overlay for the NXP SC16IS752 dual UART with I2C InterfaceEnables the chip on I2C1 at 0x48 (or the "addr" parameter value). Toselect another address, please refer to table 10 in reference manual.
Load:   dtoverlay=sc16is752-i2c,<param>=<val>
Params: int_pin                 GPIO used for IRQ (default 24)addr                    Address (default 0x48)xtal                    On-board crystal frequency (default 14745600)Name:   sc16is752-spi0
Info:   Overlay for the NXP SC16IS752 Dual UART with SPI InterfaceEnables the chip on SPI0.
Load:   dtoverlay=sc16is752-spi0,<param>=<val>
Params: int_pin                 GPIO used for IRQ (default 24)xtal                    On-board crystal frequency (default 14745600)Name:   sc16is752-spi1
Info:   Overlay for the NXP SC16IS752 Dual UART with SPI InterfaceEnables the chip on SPI1.N.B.: spi1 is only accessible on devices with a 40pin header, eg:A+, B+, Zero and PI2 B; as well as the Compute Module.Name:   uart0
Info:   Change the pin usage of uart0
Load:   dtoverlay=uart0,<param>=<val>
Params: txd0_pin                GPIO pin for TXD0 (14, 32 or 36 - default 14)rxd0_pin                GPIO pin for RXD0 (15, 33 or 37 - default 15)pin_func                Alternative pin function - 4(Alt0) for 14&15,7(Alt3) for 32&33, 6(Alt2) for 36&37Name:   uart1
Info:   Change the pin usage of uart1
Load:   dtoverlay=uart1,<param>=<val>
Params: txd1_pin                GPIO pin for TXD1 (14, 32 or 40 - default 14)rxd1_pin                GPIO pin for RXD1 (15, 33 or 41 - default 15)Name:   uart2
Info:   Enable uart 2 on GPIOs 0-3. BCM2711 only.
Load:   dtoverlay=uart2,<param>
Params: ctsrts                  Enable CTS/RTS on GPIOs 2-3 (default off)Name:   uart3
Info:   Enable uart 3 on GPIOs 4-7. BCM2711 only.
Load:   dtoverlay=uart3,<param>
Params: ctsrts                  Enable CTS/RTS on GPIOs 6-7 (default off)Name:   uart4
Info:   Enable uart 4 on GPIOs 8-11. BCM2711 only.
Load:   dtoverlay=uart4,<param>
Params: ctsrts                  Enable CTS/RTS on GPIOs 10-11 (default off)Name:   uart5
Info:   Enable uart 5 on GPIOs 12-15. BCM2711 only.
Load:   dtoverlay=uart5,<param>
Params: ctsrts                  Enable CTS/RTS on GPIOs 14-15 (default off)


2,以下为第二种方法:

sudo raspi-config

找到Interfacing选项,找到serial。
第一个问题是:would you like a login shell to be accessible  over serial? 选否。
第二个问题是would you like the serial port hardware to be enabled?选是。
我用的系统版本是2018-11-13-raspbian-stretch,你的问题顺序可能不一样,看清对应问题选择。

补充

/dev/serial0(对应的shell串口,有引脚引出) ->ttyS0(mini串口,用的是内核时钟不稳定,实际测试关闭shell之后并没有出现过异常情况)
/dev/serial1(对应的蓝牙,没有引脚引出) ->ttyAMA0(硬件串口稳定)

cd /boot/overlays/#提供了README

 

Name:   disable-bt
Info:   Disable onboard Bluetooth on Pi 3B, 3B+, 3A+, 4B and Zero W, restoringUART0/ttyAMA0 over GPIOs 14 & 15.N.B. To disable the systemd service that initialises the modem so itdoesn't use the UART, use 'sudo systemctl disable hciuart'.
Load:   dtoverlay=disable-bt
Params: <None>

README文件中说明了这个文件的功能是将树莓派3的蓝牙切换到mini串口(ttyS0),并且恢复硬件串口(ttyAMA0)到GPIO 14&15脚中。并且给出了载入的方法。

 

ls -l /dev

 此时GPIO映射的串口是默认的/dev/ttyS0这个mini串口。

使用下面这条指令编辑 /boot/config.txt 文件

sudo nano /boot/config.txt

在该文件中增加一行代码

dtoverlay=disable-bt

然后保存文件,重启树莓派使之生效。
再通过 ls -l /dev 命令查看修改后的映射关系

对比修改前的关系,可以看出serial0和serial1 与 ttyAMA0和ttyS0的映射关系对换完成了,也就是ttyAMA0映射到了引出的GPIO Tx Rx上。

禁用串口的控制台功能

前面的步骤已经交换了硬件串口与mini串口的映射关系,但现在想使用树莓派外接串口模块进行通信还不行,因为树莓派IO引出的串口默认是用来做控制台使用的,它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。因此需要禁用这个默认功能,使得串口为我们自由使用。

在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能
 

sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service

由于我们前面已经交换了串口的映射关系,因此这里注意是ttyAMA0。

然后通过下列指令编辑cmdline.txt文件
sudo nano /boot/cmdline.txt

 然后看到里面类似如下的内容

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

把console=serial0,115200删掉 console=serial0,115200 ,剩下的内容类似如下

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

 然后重新启动树莓派,使修改生效

编写一个简单的串口程序

新建一个test.py文件

# -*- coding: utf-8 -*
import serial
import time
# 打开串口
ser = serial.Serial("/dev/ttyAMA0", 9600)
def main():while True:# 获得接收缓冲区字符count = ser.inWaiting()if count != 0:# 读取内容并回显recv = ser.read(count)print(recv)ser.write(recv)# 清空接收缓冲区ser.flushInput()# 必要的软件延时time.sleep(0.1)if __name__ == '__main__':try:main()except KeyboardInterrupt:if ser != None:ser.close()

小插曲

#这里switch_function(reading)返回值是数字,但是ser.write()填入的值是数字则意思是发送几个字节
#所以我们把这里整成字符串,格式是utf-8.
count = str(switch_function(reading))if count != 0:recv = count.encode('utf-8')ser.write(recv)
#python中的多线程def Tmer_task(processed_frame):print("收到识别指令,正在处理...")image_base64 = image_to_base64(processed_frame)if image_base64:print("正在识别垃圾类型,请稍候...")reading = analyze_meter_image(image_base64)if reading:print("=" * 30)print(f"识别结果: {reading}")print("=" * 30)count = str(switch_function(reading))if count != 0:recv = count.encode('utf-8')ser.write(recv)print("已发送指令,请等待垃圾处理完成")else:print("识别失败,请重试")def periodic_task(cap, interval):while True:ret, frame = cap.read()if not ret:print("无法获取摄像头画面")break# 处理图像(现在返回彩色图像)processed_frame = img_p(frame)# 显示实时画面#cv2.imshow('Camera Feed', processed_frame)# 调用任务处理函数Tmer_task(processed_frame)# 等待间隔时间time.sleep(interval)ask_thread = threading.Thread(target=periodic_task, args=(cap, 10))task_thread.start()

相关文章:

树莓派3:64位系统串口(UART)使用问题的解决方法

前言 当我们要使用串口进行zigbee的短距离通信时,发现无法使用串口. 原因 树莓派3bCPU内部有两个串口,一个硬件串口(就是我们平时使用的UART),还有一个迷你串口(mini-uart),在老版本的树莓派中把硬件串口分配在GPIO上,可以单独使用.但是在新的树莓派中官方把硬件串口给了蓝牙…...

SemiDrive E3 硬件设计系列---唤醒电路设计

一、前言 E3 系列芯片是芯驰半导体高功能安全的车规级 MCU&#xff0c;对于 MCU 的硬件设计部分&#xff0c;本系列将会分模块进行讲解&#xff0c;旨在介绍 E3 系列芯片在硬件设计方面的注意事项与经验&#xff0c;本文主要讲解 E3 硬件设计中唤醒电路部分的设计。 二、RTC 模…...

淘宝接口高并发采集核心要点解读,开启电商数据智能应用新纪元

一、引言 在电商蓬勃发展的今天&#xff0c;淘宝作为全球知名的电商巨头&#xff0c;其平台上的数据犹如一座蕴藏无限价值的宝藏。准确且高效地采集淘宝接口数据&#xff0c;并通过高并发技术实现大规模数据获取&#xff0c;对于电商企业的精准营销、市场趋势分析、竞品监测以及…...

C#里怎么样快速使用LINQ实现查询?

C#里怎么样快速使用LINQ实现查询? 在C#里使用LINQ,是一个方便的功能, 不过,要学会使用这部分的功能,需要比较多的学习时间,否则,使用起就比较难。 因为它的表现方式,与编程语言通用的功能,还是差别比较大。 当数据量比较小,没有特定的顺序时,使用LINQ访问会比较好…...

2024新版微软edge浏览器输入百度网址时自动补全tn=68018901……小尾巴的解决

以前一直是Windows11 21h2版本&#xff0c;浏览器内输入baidu不会自动补全tnxx的百度推广小尾巴。然后前几天在BIOS内开启了tpm2.0&#xff0c;升级Windows11到了24h2版本。 发现在edge浏览器内只要输入b&#xff0c;就会自动补全为baidu.com?tnXXX的这么一个百度推广形式。开…...

uni-app打包H5自定义微信分享

1、配置分享信息 修改uni-app的index.html,添加Open Graph(OG)标签来配置分享信息。 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" /><meta name="description" content="标题"/>…...

大模型专栏--大模型应用场景

紧接着第一篇&#xff0c;什么是大模型&#xff0c;这篇文章讨论一下大模型的应用场景和应用方式有哪些&#xff1f; 基础使用 随着 GPT 的出现&#xff0c;AI 大模型已经越来越多得出现在日常生活和学术研究&#xff0c;工作中。 按照使用方向有以下几种&#xff1a; 自然语…...

骑砍2霸主MOD开发(29)-顶点动画

一.定制化顶点动画(MorphAnimation) 定制化顶点动画用于人物Agent的面部表情. 1.创建MorphAnimation对应静态资源morph_animation.tpac 2.Agent设置对应MorphAnimation [EngineMethod("set_agent_facial_animation", false)] void SetAgentFacialAnimation(UIntPtr …...

-Dspring.profiles.active=dev与--spring.profiles.active=dev的区别

在Spring Boot应用程序中&#xff0c;-Dspring.profiles.activedev和--spring.profiles.activedev都用于指定要激活的Spring配置文件&#xff08;profile&#xff09;&#xff0c;但它们在不同的环境中使用&#xff0c;并且有不同的作用域。 -Dspring.profiles.activedev&#…...

面向对象高级(2)单例设计对象与代码块

面向对象高级&#xff08;2&#xff09; 单例设计模式、main方法与代码块 引言&#xff1b; 设计模式&#xff1a;特定环境下特定问题的处理方法。可理解为一种经典的可以参照的模板。单例设计模式则是只存在单个对象实例、且只有一种方法获取对象实例的一种设计模式。 单例设…...

47小型项目的规划与实施

每天五分钟学Linux | 第四十七课&#xff1a;小型项目的规划与实施 大家好&#xff01;欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中&#xff0c;我们学习了并发编程的知识&#xff0c;包括如何管理和使用进程与线程。今天&#xff0c;我们将探讨如何规划…...

堤防安全监测系统方案

一、背景情况 堤防是开发利用水资源和防治水灾害的重要工程措施之一&#xff0c;对防洪、供水、生态、发电、航运等至关重要。我国现有堤防9.8万多座&#xff0c;其中大中型堤防4700多座、小型堤防9.4万座&#xff0c;80%以上修建于上世纪50至70年代。由于堤防管护力量薄弱&am…...

聊聊Flink:这次把Flink的window分类(滚动、滑动、会话、全局)、窗口函数讲透

一、窗口 窗口&#xff08;Window&#xff09;是处理无界流的关键所在。窗口将流分成有限大小的“桶”&#xff0c;我们可以在其上应用算子计算。Flink可以使用window()和windowAll()定义一个窗口&#xff0c;二者都需要传入一个窗口分配器WindowAssigner&#xff0c;WindowAs…...

mysql-分析MVCC原理

一、MVCC简介 MVCC是一种用来解决读写冲读的无锁并发控制&#xff0c;也就是为事务分配单增长的时间戳&#xff0c;为每个修改保存一个版本&#xff0c;版本与事务时间戳关联&#xff0c;读操作只读该事务开始前的数据库的快照&#xff0c;所以MVCC可以为数据库解决一些问题。…...

由于答案过大,请对a取模。取模后的答案不是原问题的答案 取模有何意义呢 详解

在许多情况下&#xff0c;处理大数时会将 a 取模&#xff0c;即用 a m o d m a \mod m amodm的结果代替 a a a&#xff0c;然后继续计算。这种做法的核心问题是&#xff1a;取模后的值与原问题之间的关系是否保持一致。取模后的意义在于&#xff0c;它在不改变问题核心特性的前…...

【c++篇】掌握动态内存的奥妙

【C篇】动态内存 一、Static 关键字1.1函数内部的静态变量1.2 全局静态变量1.3静态成员变量1.4静态成员函数 二、内存管理2.1栈区(Stack)2.2堆区&#xff08;Heap&#xff09; 三、动态内存分配机制3.1、动态内存分配的两种方法c语言c 3.2new 和delete的用法3.3语法和类型安全性…...

5.4.2-3 编写Java程序读取HDFS文件

在本次实战中&#xff0c;我们通过Java程序实现了从Hadoop分布式文件系统&#xff08;HDFS&#xff09;读取文件的功能。首先&#xff0c;我们创建了ReadFileOnHDFS类&#xff0c;并在其中实现了两个方法&#xff1a;read1()和read1_()。read1()方法展示了如何打开HDFS文件并逐…...

@EnableConfigurationProperties @ConfigurationProperties

EnableConfigurationProperties && ConfigurationProperties的使用时机 今天在写properties时想到了这个问题&#xff0c;为什么有时候我需要写EnableConfigurationProperties有时候又不需要呢&#xff1f;下面就详细讲讲。 Data Component ConfigurationProperties(pr…...

RK3588适配MTK7921 USB接口WiFi驱动开发

在当前RK原厂提供的SDK里面已经适配的WiFi模组有不少,但是支持的模组大部分集中在realtek、正基、英飞凌等厂家。主要型号有Realtek的RTL8188系列、RTL8723系列、RTL8812系列、RTL8821系列、RTL8822系列和支持WiFi 6 的RTL8852系列,正基的AP6275系列、AP6276系列等。接下来将…...

【数据结构OJ】【图论】图综合练习--拓扑排序

题目描述 已知有向图&#xff0c;顶点从0开始编号&#xff0c;求它的求拓扑有序序列。 拓扑排序算法&#xff1a;给出有向图邻接矩阵 1.逐列扫描矩阵&#xff0c;找出入度为0且编号最小的顶点v 2.输出v&#xff0c;并标识v已访问 3.把矩阵第v行全清0 重复上述步骤&#xff0…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...