树莓派4B串口通信

本文详细介绍了如何在树莓派4B上配置串口通信,包括修改配置文件以启用额外的硬件串口,以及通过示例代码进行串口测试。步骤包括修改cmdline.txt和config.txt文件,以及串口与GPIO引脚的对应关系。测试代码展示了如何使用wiringSerial库进行串口通信,并验证通信稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树莓派4B串口通信

需要了解的一些知识

树莓派3B的时候,一共有两个串口。

硬件串口:/dev/ttyAMA0 mini串口:/dev/ttyS0 硬件串口有独立的时钟源,通信稳定,但默认分配成了蓝牙功能。可以通过禁用蓝牙等操作来使用这个串口。

而mini串口的时钟源由cpu提供,会随主频的变化而变化,通信不稳定,但可以通过固定CPU主频来稳定通信。

为追求稳定的串口通信,树莓派3需要经过非常复杂的操作才得以实现。

树莓派4B配置第一步

初次使用树莓派串口编程,需要配置,将串口改用成通信。把这个用作调试端口的串口修改为能够通信的串口。

/* 修改 cmdline.txt文件 */
>cd /boot/
>sudo vim cmdline.txt
删除【】之间的部分
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

 然后 sudo reboot

树莓派4B配置第二步

树莓派4B增加了四个硬件串口,但需要修改配置来打开。(用硬件串口会比较好)

sudo nano /boot/config.txt

追加以下内容到末尾:

dtoverlay=uart2 ​

dtoverlay=uart3 ​

dtoverlay=uart4 ​

dtoverlay=uart5

大概就是以下内容:

然后CTRL+O保存,然后回车,最后CTRL+X退出。

修改完这个配置文件然后重启树莓派:sudo reboot

查看硬件串口是否可用

ls /dev/ttyA*

 

串口与GPIO的对应关系

建议使用除ttyAMA0之外的串口

GPIO14 = TXD0 -> ttyAMA0

GPIO0 = TXD2 -> ttyAMA1

GPIO4 = TXD3 -> ttyAMA2

GPIO8 = TXD4 -> ttyAMA3

GPIO12 = TXD5 -> ttyAMA4

GPIO15 = RXD0 -> ttyAMA0

GPIO1 = RXD2 -> ttyAMA1

GPIO5 = RXD3 -> ttyAMA2

GPIO9 = RXD4 -> ttyAMA3

GPIO13 = RXD5 -> ttyAMA4

树莓派4GPIO引脚图

测试代码

#include <wiringSerial.h>
#include <wiringPi.h>
#include <stdio.h>
​
int main()
{
        wiringPiSetup();
        int fd;
        int cmd=0;
        int data=0;
        fd=serialOpen("/dev/ttyAMA1",9600);
        while(1)
        {
                while(serialDataAvail(fd) != -1 )
                {
                        serialPuts(fd,"jinru\r\n");
                         cmd=serialGetchar(fd);
                        printf("%d\n",cmd);
                        perror("why");
                }
                serialFlush(fd);
        }
​
​
        return 0;
}

注意:这里使用的是AMA1GPIO1 = RXD2 -> ttyAMA1,GPIO0 = TXD2 -> ttyAMA1,注意硬件接线,串口波特率设置为9600树莓派要和ch340共地。串口发送’7‘给树莓派(验证树莓派的RXD),树莓派接收到数据,先打印“jinru”(验证树莓派的TXD),然后再打印这个数据。

 

### 地面分割算法概述 地面分割是指从三维点云数据中识别并分离出属于地面的部分。这一过程对于自动驾驶、机器人导航等领域至关重要。不同的应用场景和技术需求促使多种地面分割算法的发展。 #### Patchwork++ 算法 Patchwork++ 算法通过将点云划分为较小的块,并对每个块进行地面/非地面分类,实现了高效的地面分割[^1]。该方法适用于各种点云处理应用,能够为后续任务提供可靠的地面信息支持。 #### 基于区域的方法 基于区域的方法利用邻域信息来归类具有相似属性的附近点,从而形成分割区域,并有效地区分不同区域间的差异性[^2]。这类方法通常比基于边缘的方法更加精确,尽管存在一些挑战,比如如何准确界定区域边界等问题。 #### PCL 库中的 SACSegmentation 方法 PCL库提供了`pcl::SACSegmentation<pcl::PointXYZ>`函数用于简单的平面分割任务,在某些情况下可以直接采用这种方法来进行快速有效的地面检测[^3]。其优势在于参数调整相对容易,且能取得不错的分割效果。 #### RANSAC 模型拟合 在完成初步的地面点提取之后,可以运用随机抽样一致性(RANSAC)算法对这些点集执行模型拟合操作,进而获取更为精准稳定的地面表示形式[^4]。此步骤有助于提升整体分割质量。 #### 细化分割流程 由于初始阶段可能会出现过分割现象或者误判情况(如障碍物被错误标记成地面),因此有必要实施精细化处理措施以修正这些问题。具体做法包括但不限于重新评估候选点与其周围环境的关系等手段[^5]。 ```cpp // 使用C++和PCL库实现基本的RANSAC平面分割逻辑 #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/sample_consensus/method_types.h> #include <pcl/sample_consensus/model_types.h> #include <pcl/segmentation/sac_segmentation.h> int main(int argc, char** argv){ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 加载点云文件... pcl::SACSegmentation<pcl::PointXYZ> seg; pcl::PointIndices::Ptr inliers (new pcl::PointIndices); pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); seg.setOptimizeCoefficients(true); seg.setModelType(pcl::SACMODEL_PLANE); // 设置模型类型为平面 seg.setMethodType(pcl::SAC_RANSAC); // 选择RANSAC作为估计方法 seg.setMaxIterations(1000); // 设定最大迭代次数 seg.setDistanceThreshold(0.01); // 定义距离阈值 seg.setInputCloud(cloud); seg.segment(*inliers,*coefficients); } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aurora Smith

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值