STM32串口通讯:直通线与交叉线的使用解析

需积分: 40 267 下载量 12 浏览量 更新于2024-08-06 收藏 26.76MB PDF 举报
"STM32开发中的直通线和交叉线原理及其应用" 在STM32微控制器的开发过程中,串口通信是一个重要的组成部分,而串口线的类型主要有直通线和交叉线。这两者之间的区别在于信号线的连接方式。直通线,顾名思义,其数据线是直接对应的,例如,一端的TX连接到另一端的RX,反之亦然。而交叉线则是TX对RX,RX对TX,这样设计是为了在需要交换数据的全双工通信中确保正确连接。 在野火STM32开发板的例子中,如图1-2所示,PA10(USART1的Rx)连接到DB9接口的第2针脚,PA9(USART1的Tx)连接到第3针脚,这与PC的串口接法一致。这意味着当需要PC与开发板通讯时,需要使用交叉线,因为两者的RX连接到对方的TX,TX连接到对方的RX,以实现全双工通信。 为何野火板子采用PC的串口接法?这种设计的目的是为了简化连接线的选择。如果都采用PC接法,无论是PC与板子通讯还是两个相同板子之间的通讯,都可以使用交叉线,避免了因接线方式不同而需要更换不同类型的串口线。如果板子的串口接线与PC相反,那么PC与板子通讯就需要直通线,两个相同板子之间通讯则需交叉线。 野火团队的《零死角玩转STM32》系列教程,包括初级、中级、高级和系统篇,旨在提供全面的学习资源,帮助初学者逐步掌握STM32的使用。同时,他们还有一本《STM32库开发实战指南》,对于深入理解和实践STM32开发非常有帮助。 在实际编程和下载程序的过程中,用户通常会使用如Keil MDK这样的集成开发环境(IDE)。在MDK中,有三个关键的编译按钮:Translate用于检查语法错误但不生成可执行文件,Build用于编译并生成可执行文件,而Rebuild则会重新编译整个工程,适合在项目发生大量改动时使用。通常,仅需使用Build按钮即可完成程序的编译和更新。 下载程序时,野火STM32开发板提供了JLINKV8和串口两种方式。JLINK下载允许在BOOT0拨动开关处于VCC或GND状态时进行,但下载完成后应将BOOT0拨到GND,以进入正常运行模式。串口下载则通常需要特定的设置和软件支持,如ST-Link Utility或STM32CubeProgrammer。 理解串口线的类型和STM32开发的基本流程,是成功进行STM32项目开发的关键步骤。通过合理选择和使用串口线,以及熟练掌握编程和下载工具,开发者可以更高效地进行STM32微控制器的应用开发。

void QtWidgetsApplication2::pt_clicked(QString data1, QString data2) { pcl::console::TicToc time; // --------------------------------读取点云------------------------------------ pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("opened_cloud.pcd", *cloud) == -1) { PCL_ERROR("Cloudn't read file!"); } //cout << "滤波前点的个数为:" << cloud->size() << endl; // --------------------------------直通滤波------------------------------------ float a = data1.toFloat(); float b = data2.toFloat(); pcl::PointCloud<pcl::PointXYZ>::Ptr filtered(new pcl::PointCloud<pcl::PointXYZ>); std::string fv = "z"; // 滤波字段 filtered = pcl_filter_passthrough(cloud, a, b, fv); //cout << "直通滤波用时:" << time.toc() << " ms" << endl; pcl::io::savePCDFileASCII("opened_cloud.pcd", *filtered); ui.textBrowser->clear(); QString Pointsize = QString("%1").arg(cloud->points.size()); ui.textBrowser->insertPlainText(QStringLiteral("点云数量:") + Pointsize); QString Pointsize1 = QString("%1").arg(filtered->points.size()); ui.textBrowser->insertPlainText(QStringLiteral("\n滤波后点云数量:") + Pointsize1); auto renderer2 = vtkSmartPointer<vtkRenderer>::New(); auto renderWindow2 = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New(); renderWindow2->AddRenderer(renderer2); viewer.reset(new pcl::visualization::PCLVisualizer(renderer2, renderWindow2, "viewer", false)); ui.openGLWidget->setRenderWindow(viewer->getRenderWindow()); viewer->setupInteractor(ui.openGLWidget->interactor(), ui.openGLWidget->renderWindow()); viewer->setBackgroundColor(0, 0, 0); //设置背景 pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(filtered, "z"); viewer->addPointCloud<pcl::PointXYZ>(filtered, fildColor, "sample cloud"); viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud"); viewer->resetCamera(); update(); };这段代码存在内存泄漏的问题

2023-05-26 上传