CH9101 USB转串口替换FT232R和FT230XQ

本文介绍了CH9101 USB转串口芯片,作为FT232R和FT230XQ的替代品。该芯片具有3Mbps的高速串口、RS485收发控制、串口I/O独立供电等特性,简化了与不同电压设备的连接。此外,还详细讨论了SUSPEND、ACT、RXS、TXS和WAKEUP等引脚的功能,展示了其在节能和唤醒计算机等方面的实用性。

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

学生党一枚,前段时间跟着导师做的项目因为上面用到USB转串口芯片FT232R迟迟买不到,所以打算更换成国产USB转串口芯片CH340,对CH340的认识也很早了,很多年前开始直到现在各种开发板上基本都会标配一颗CH340,像某宝上的STC 51的板子,STM32开发板。串口这种通讯接口基本是MCU必备的,所以通过USB转串口实现MCU和计算机之间的连接十分便捷好用。

言归正传,CH340芯片量产了这么多年,一直以来也没有对这个芯片和其他系列进行过多研究,最近有时间逛了下芯片原厂官网,不看不知道,仅仅USB转串口芯片就更新迭代了这么多型号。单串口和多串口芯片都有很多款可选。

因为咱也不是专门研究这类芯片的,专业的事儿交给专业的人处理,直接发邮件给官方咨询关于芯片选型的问题,主要目的是替代FT232芯片,功能参数方面可以满足我们项目需求即可。意想不到的是,上面表格中的CH9101芯片和FT232RL、FT232RQ、FT230XS、FT230XQ系列的是PinToPin引脚兼容的型号。先去官网看了下芯片手册(说实话,因为懒,很多FT芯片特性的英文资料也没有好好理解&

### 实现思路 为了在 Qt 中结合 Eigen Boost 库实现 Matlab 的 `griddata(x, y, con, X, Y, 'v4')` 功能,需解决以下几个核心问题: 1. **数据结构换**:将输入的 `QVector<double>` 类型变量 `(x, y, con)` 换为适合插值运算的数据结构。 2. **插值算法选择**:尽管 Boost Eigen 不直接支持 `'v4'` 方法,但可以通过反距离权重法(IDW)或其他空间插值方法近似实现。 3. **二维数组处理**:针对 `X` `Y` 作为二维数组的情况,逐点计算插值结果并将其存入输出容器。 --- ### 解决方案代码 以下是完整的实现代码: ```cpp #include <QVector> #include <boost/geometry.hpp> #include <boost/geometry/index/rtree.hpp> #include <Eigen/Dense> using namespace boost::geometry; using namespace boost::geometry::index; typedef model::d2::point_xy<double> Point; // 定义二维点类型 typedef std::pair<Point, double> Value; // 存储点及其对应的值 // 插值函数:基于反距离权重法(IDW) double interpolate(const std::vector<Value>& data_points, const Point& query_point) { rtree<Value, quadratic<16>> tree(data_points.begin(), data_points.end()); // 查询最接近的 k=4 邻居用于插值 std::vector<Value> nearest_neighbors; tree.query(nearest(query_point, 4), back_inserter(nearest_neighbors)); double sum_weights = 0.0; double weighted_sum = 0.0; for (const auto& neighbor : nearest_neighbors) { double distance_sq = distance(query_point, neighbor.first); if (distance_sq == 0) { // 如果距离为零,则直接取该点的值 return neighbor.second; } double weight = 1 / distance_sq; // 反距离权重法 sum_weights += weight; weighted_sum += weight * neighbor.second; } return weighted_sum / sum_weights; // 返回加权平均值 } // 主函数:实现 griddata 功能 QVector<QVector<double>> qtGridData( const QVector<double>& x, const QVector<double>& y, const QVector<double>& con, const QVector<QVector<double>>& Xq, const QVector<QVector<double>>& Yq ) { // 将输入数据为标准形式 std::vector<Value> data_points; for (int i = 0; i < x.size(); ++i) { data_points.emplace_back(Point(x[i], y[i]), con[i]); } // 初始化结果矩阵 QVector<QVector<double>> result(Xq.size(), QVector<double>(Xq[0].size())); // 对每个查询点进行插值 for (size_t j = 0; j < Yq.size(); ++j) { for (size_t i = 0; i < Xq[j].size(); ++i) { Point query_point(Xq[j][i], Yq[j][i]); result[j][i] = interpolate(data_points, query_point); // 计算插值 } } return result; } ``` --- ### 关键说明 1. **反距离权重法(IDW)** 上述代码实现了 IDW 插值方法。通过构建 Boost.Geometry 的 R-Tree 来高效检索邻居节点,并利用其距离平方作为权重因子完成插值操作[^1]。 2. **二维数组处理** 输入的 `Xq` `Yq` 是二维数组,因此需要遍历每一行每一列,分别对每个查询点调用插值函数。最终结果同样以二维数组形式返回。 3. **性能优化** 利用 Boost.Geometry 的 R-Tree 加速了最近邻搜索过程,从而显著提升了大规模数据集下的运行效率。 4. **边界条件处理** 当查询点恰好位于某个已知数据点位置时,直接返回该点的值以避免除零错误。 5. **兼容性** 输出结果严格遵循题目要求,返回 `QVector<QVector<double>>` 类型的数据。 --- ### 示例使用 假设输入数据如下: ```cpp QVector<double> x = {1, 2, 3}; QVector<double> y = {1, 2, 3}; QVector<double> con = {10, 20, 30}; QVector<QVector<double>> Xq = {{1.5, 2.5}, {1.5, 2.5}}; QVector<QVector<double>> Yq = {{1.5, 2.5}, {1.5, 2.5}}; QVector<QVector<double>> result = qtGridData(x, y, con, Xq, Yq); for (auto row : result) { for (auto val : row) { qDebug() << val; } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值