Qt CAN总线API扩展

2023-11-06

Qt CAN Bus API extensions

Qt CAN总线API扩展

April 20, 2023 by Ivan Solovev | Comments

​2023年4月20日:Ivan Solovev |评论

The latest Qt 6.5 release introduced a lot of new features. You can read about all of them in the recent blog post. This blog post will give an overview of the improvements that we have made to the Qt CAN Bus module.

​最新发布的Qt 6.5引入了许多新功能。可以在最近的博客文章中阅读到所有这些内容。这篇博客文章将概述我们对Qt CAN总线模块所做的改进。

The Brief History

简史

The Qt CAN Bus module has always provided APIs for high-level manipulation with CAN bus: 

Qt CAN总线模块始终为CAN总线的高级操作提供API:

  • QCanBusDevice represents a CAN device. This class can be used to read and write CAN frames. 
  • QCanBusDevice表示一个CAN设备。此类可用于读取和写入can帧。
  • QCanBusFrame represents an actual CAN frame. 
  • QCanBusFrame表示实际的CAN帧。

The CAN bus frame consists of a FrameId and a Payload. In the existing API, the FrameId is represented as an unsigned integer, and the payload is just a QByteArray holding some raw bytes. 

​CAN总线框架由一个FrameId和一个Payload组成。在现有的API中,FrameId表示为一个无符号整数,有效载荷只是一个保存一些原始字节的QByteArray

In practice, higher-level protocols are applied on top of CAN bus frames. This overcomes the generic definition of arbitrary payloads and FrameIds, which replaces it with unique identifiers for bus devices, message and signal types which may occur, and provides type information for the values within signals.

在实践中,更高级别的协议应用于CAN总线框架之上。这克服了任意有效载荷和FrameId的通用定义,后者将其替换为总线设备、可能出现的消息和信号类型的唯一标识符,并为信号内的值提供类型信息。

Before Qt 6.5, the users had to provide their own implementation for extracting these values. With Qt 6.5, we introduced a set of APIs to simplify this process.

在Qt 6.5之前,用户必须提供自己的实现来提取这些值。在Qt 6.5中,我们引入了一组API来简化这个过程。

New APIs to Parse CAN Frames

解析CAN帧的新API

The new APIs provide a way to describe the top-level protocol. Later on, these rules can be used to decode an incoming CAN frame, as well as to encode data into a CAN frame before sending it to a device. 

新的API提供了一种描述顶级协议的方法。稍后,这些规则可以用于解码传入的can帧,以及在将数据发送到设备之前将数据编码到can帧中。

Let’s have a closer look at the APIs: 

让我们仔细看看API:

  • QCanUniqueIdDescription defines the rules for storing and extracting a unique identifier within a CAN frame. 
  • QCanUniqueIdDescription定义了在CAN帧中存储和提取唯一标识符的规则。
  • QCanSignalDescription defines the rules for storing and extracting individual signal values within a CAN frame. 
  • QCanSignalDescription定义了在CAN帧内存储和提取单个信号值的规则。
  • QCanMessageDescription defines a CAN message. A message contains a unique identifier and multiple signals. 
  • QCanMessageDescription定义了一条CAN消息。一条消息包含一个唯一的标识符和多个信号。
  • QCanFrameProcessor can be used to decode an incoming CAN frame or encode the provided values into a CAN frame to be sent to the receiver. 
  • QCanFrameProcessor可用于解码传入的can帧,或将提供的值编码为can帧,发送至接收器。

The QCanFrameProcessor class uses the descriptions provided by other new classes. It provides two main methods for encoding and decoding the frames: 

​QCanFrameProcessor类使用其他新类提供的描述。它提供了对帧进行编码和解码的两种主要方法:

Let’s develop a small example to demonstrate the new APIs in action.

让我们开发一个小示例来演示新的API在实际中的作用。

Demo Time

Let’s consider a protocol with the following format: 

让我们考虑一个具有以下格式的协议:

  • A unique identifier is encoded into the first 11 bits of the FrameId. 
  • 一个唯一的标识符被编码到FrameId的前11个比特中。
  • A payload contains 8 bytes. 
  • 有效载荷包含8个字节。
  • The first two bytes represent a signal called “Signal 0”. This signal contains an unsigned integer number. 
  • 前两个字节表示一个称为“信号0”的信号。此信号包含一个无符号整数。
  • The next 4 bytes represent a signal called “Signal 1”. This signal contains a signed integer number. 
  • 接下来的4个字节表示一个称为“信号1”的信号。此信号包含一个带符号的整数。
  • The bytes are in Little-Endian format. 
  • 字节采用的是Little Endian格式。

This format can be visualized with the following image.

这种格式可以通过下面的图像进行可视化。

Let’s see how we can describe this protocol in terms of the new API.

让我们看看如何用新的API来描述这个协议。

Unique Identifier

唯一标识符

Let’s start with the unique identifier.

让我们从唯一标识符开始。

QCanUniqueIdDescription uid; 
uid.setSource(QtCanBus::DataSource::FrameId); 
uid.setEndian(QSysInfo::Endian::LittleEndian); 
uid.setStartBit(0); 
uid.setBitLength(11); 

We define the source (FrameId), the endian (Little-Endian), the start bit and the bit length of the unique identifier.

我们定义了唯一标识符的源(FrameId)、端(Little endian)、起始位和位长度。

The source defines a part of the CAN frame which will be used to extract the value. It can be either a FrameId, or a Payload.

​源定义了CAN帧的一部分,该部分将用于提取值。它可以是FrameId,也可以是Payload。

Signal and Message Descriptions

信号和消息描述

Next, let’s define the signal descriptions.

接下来,让我们定义信号描述。

QCanSignalDescription s0;
s0.setName(u"signal 0"_s);
s0.setDataSource(QtCanBus::DataSource::Payload);
s0.setDataEndian(QSysInfo::Endian::LittleEndian);
s0.setDataFormat(QtCanBus::DataFormat::UnsignedInteger);
s0.setStartBit(0);
s0.setBitLength(16);

QCanSignalDescription s1;
s1.setName(u"signal 1"_s);
s1.setDataSource(QtCanBus::DataSource::Payload);
s1.setDataEndian(QSysInfo::Endian::LittleEndian);
s1.setDataFormat(QtCanBus::DataFormat::SignedInteger);
s1.setStartBit(16);
s1.setBitLength(32);

For both signals, we define the signal name, the source (Payload), the endian (Little-Endian), the data type, the start bit, and the bit length. Note that the bit numbering is continuous for the whole payload. Bit 0 represents the first bit of Byte 0, and Bit 63 represents the last bit of Byte 7. The signal name must be unique within a message description. The signal names are used to provide meaningful results when parsing the frame, and also to identify the proper rules for encoding the values into a newly generated frame. The QCanSignalDescription class allows you to specify more parameters. Please refer to the documentation for the full list. 

​对于这两个信号,我们定义了信号名称、源(Payload)、端序(Little endian)、数据类型、起始位和位长度。注意,比特编号对于整个有效载荷是连续的。比特0表示字节0的第一个比特,比特63表示字节7的最后一个比特。信号名称在消息描述中必须是唯一的。信号名称用于在解析帧时提供有意义的结果,还用于确定将值编码到新生成的帧中的正确规则。QCanSignalDescription类允许您指定更多参数。请参阅文档以获取完整列表

Once the signal description is specified, we can define the message description.

一旦指定了信号描述,我们就可以定义消息描述。

QCanMessageDescription msg; 
msg.setName(u"example message"_s); 
msg.setSize(8); 
msg.setUniqueId(QtCanBus::UniqueId{0x123}); 
msg.setSignalDescriptions({s0, s1}); 

For the message description, we specify the payload size, the list of signal descriptions contained in this message, and a unique identifier. The unique identifier will be used to select a proper message description when decoding the incoming CAN frame. Like with signal descriptions, the QCanMessageDescription class allows you to specify more parameters, so make sure to check the documentation. 

​对于消息描述,我们指定有效负载大小、此消息中包含的信号描述列表以及唯一标识符。在解码传入CAN帧时,唯一标识符将用于选择正确的消息描述。与信号描述一样,QCanMessageDescription类允许指定更多参数,因此请务必查看文档

Frame Processor

帧处理器

Once we have created the description for a unique identifier and for the message, we can create an instance of QCanFrameProcessor.

​一旦我们为唯一标识符和消息创建了描述,我们就可以创建QCanFrameProcessor的实例。

QCanFrameProcessor processor;
processor.setUniqueIdDescription(uid);
processor.setMessageDescriptions({msg});

The frame processor is initialized with the previously-generated unique id description and a list of message descriptions. In our case, the list contains only one element.

帧处理器用先前生成的唯一id描述和消息描述列表进行初始化。在我们的例子中,列表只包含一个元素。

Processing CAN Frames

处理CAN帧

This section describes how the above message description can be used to parse incoming and encode new frames.

本节描述了如何使用上述消息描述来解析传入帧和对新帧进行编码。

For simplicity, let's create a CAN frame manually.

为了简单起见,让我们手动创建一个CAN帧。

QCanBusFrame frame(0x123, QByteArray::fromHex("ABCD123456780000"));

In practice, such frames will be received from a QCanBusDevice. Note that the frame has a unique identifier which matches the unique identifier of the message description which was created earlier.

​在实践中,这样的帧将从QCanBusDevice接收。请注意,该帧具有与先前创建的消息描述的唯一标识符相匹配的唯一标识符。

To parse this frame, simply call a parseFrame() method:

​要解析此帧,只需调用parseFrame()方法:

QCanFrameProcessor::ParseResult result = processor.parseFrame(frame);
qDebug() << Qt::hex << Qt::showbase << Qt::uppercasedigits
         << "Unique ID:" << result.uniqueId << Qt::endl
         << "Values:" << result.signalValues;

This method returns a ParseResult struct which contains a unique identifier and a map holding signal names and signal values. The output of the qDebug() call is shown below.

​此方法返回一个ParseResult结构,该结构包含一个唯一标识符和一个包含信号名称和信号值的映射。qDebug()调用的输出如下所示。

Unique ID: 0x123 
Values: QMap(("signal 0", QVariant(qulonglong, 0xCDAB))("signal 1", QVariant(qlonglong, 0x78563412)))

To generate a frame, we need to call the prepareFrame() method, and pass a unique identifier and a map of signal names and signal values as parameters. The signal names must match those of the signal descriptions. For this example, we will re-use the values returned by the parseFrame() method.

​要生成一个帧,我们需要调用prepareFrame()方法,并传递一个唯一的标识符和一个信号名称和信号值的映射作为参数。信号名称必须与信号描述的名称相匹配。对于这个例子,我们将重用parseFrame()方法返回的值。

QCanBusFrame generated = processor.prepareFrame(result.uniqueId,
                                                result.signalValues);
qDebug() << Qt::hex << Qt::showbase << Qt::uppercasedigits
         << generated.frameId() << generated.payload().toHex().toUpper();

The generated frame should be similar to the initial one. And that's what we see in the qDebug() output.

生成的帧应该与初始帧相似。这就是我们在qDebug()输出中看到的。

0x123 "ABCD123456780000"

Automatically Extracting Bus Information

自动提取总线信息

The example in the previous section shows how to manually specify CAN message descriptions. This approach is rather verbose and error-prone.

上一节中的示例显示了如何手动指定CAN消息描述。这种方法相当冗长且容易出错。

Can we do better?

我们能做得更好吗?

Luckily, there are already some well-known standards for describing CAN bus parameters. One such standard is DBC. It is a text-based format that is widely used in various industries.

​幸运的是,已经有一些众所周知的标准来描述CAN总线参数。DBC就是这样一个标准。它是一种基于文本的格式,广泛应用于各个行业。

In Qt 6.5, we have introduced a QCanDbcFileParser class. This class parses an input DBC file, and automatically generates the message descriptions. The DBC format also contains well-defined requirements for unique identifier, so the class also has a static method to generate the unique identifier description.

​在Qt 6.5中,我们引入了一个QCanDbcFileParser类。这个类解析输入的DBC文件,并自动生成消息描述。DBC格式还包含对唯一标识符的定义良好的要求,因此类也有一个静态方法来生成唯一标识符描述。

This example can illustrate the typical pattern for using this class.

这个例子可以说明使用这个类的典型模式。

QCanDbcFileParser dbcParser;
if (dbcParser.parse("path/to/file.dbc")) {
    QCanFrameProcessor processor;
    processor.setUniqueIdDescription(QCanDbcFileParser::uniqueIdDescription());
    processor.setMessageDescriptions(dbcParser.messageDescriptions());
    // Do the actual processing
} else {
    // Failed to extract data from DBC file
    qDebug() << "Got error:" << dbcParser.error();
    qDebug() << "Error details:" << dbcParser.errorString();
}

If the DBC file parsing is successful, we can use the generated message and unique identifier descriptions to create a frame processor and start processing. If the parsing fails, the API provides some convenient methods to handle the errors.

如果DBC文件解析成功,我们可以使用生成的消息和唯一标识符描述来创建帧处理器并开始处理。如果解析失败,API会提供一些方便的方法来处理错误。

Conclusion

结论

Thanks for reading that far. The new APIs are released as Technical Preview, so your feedback is extremely valuable to us. If you encounter any bugs or have any suggestions for improving the API, please submit your reports in our bugtracker under the SerialBus: CAN Bus component.

 ​感谢您阅读本文。新的API以技术预览版的形式发布,因此您的反馈对我们非常有价值。如果您遇到任何错误或有任何改进API的建议,请在我们的错误跟踪器中的SerialBus:CAN总线组件下提交您的报告。

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

Qt CAN总线API扩展 的相关文章

  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Qt:更改 Mac OS X 上的应用程序 QMenuBar 内容

    我的应用程序对多个 页面 使用 QTabWidget 其中顶级菜单根据用户所在的页面而变化 我的问题是 尝试重新创建菜单栏的内容会导致严重的显示问题 它在除 Mac OS X 之外的所有平台上按预期使用第一种和第三种样式 尚未测试第二种 但
  • 在 Qt GraphicsView 中创建长线(或十字线)光标的最佳方法

    创建长十字线光标 与视口一样长 的简单方法是创建一条十字线graphicsItem 当鼠标移动时 设置该项目的pos财产 但是当场景复杂时这种方式会很慢 因为它要更新整个视口来更新光标的pos 另一种简单的方法是setCursor QCur
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • 使用 QNetworkAccessManager 的 Qt 控制台应用程序

    我正在尝试写一个Qt调用网络服务的应用程序 这是一个控制台应用程序 url 将作为命令行参数传入 我搜索了例如http程序在Qt并找到这个链接 http qt project org doc qt 5 qnetworkaccessmanag
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • QML 圆规

    我目前正在创建一个虚拟仪表板 我想获得针后面的进度条类型 如以下链接所示 https forum qt io topic 89307 qml circular gauge styling needle trailing colour glo
  • 从 QFile 获取句柄

    我有一个QFile 但我需要在其上调用一些仅接受HANDLE 有没有办法找回底层HANDLE of the QFile 我找到了一种使用的方法 get osfhandle 在 MinGW 和 VS 中可用 QFile file HANDLE
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • PyQt:在运行时向滚动区域添加小部件

    我试图在运行时通过按下按钮来添加新的小部件 在下面的示例中我使用标签 这里是例子 import sys from PyQt4 QtCore import from PyQt4 QtGui import class Widget QWidge
  • 如何找到位于给定 (X,Y) 位置的 DOM 节点? (命中测试)

    我有 HTML 文档中一个点的坐标 X Y 如何确定这些坐标处的 DOM 节点是什么 一些想法 是否有我错过的 DOM 命中测试函数 它需要一个点 X Y 并返回那里的 DOM 元素 有没有一种有效的方法来遍历 DOM 元素树来查找包含元素
  • Qt 文本选择白线和文本宽度

    我想在 QTextEdit 中自定义文本选择 我想要两件事 选择时删除空格 线条 能够选择选择的宽度 或者小部件宽度 或文本宽度 空白 线条 通常 我想要的是 来自 Bear 应用程序 熊文本选择 在使用 QTextEdit 小部件时 我注
  • QComboBox:仅在展开时显示图标

    从 正常 开始QCombobox 我想要一个QCombobox仅在展开时显示图标 但在折叠时不显示图标 我找到了类似问题的几个答案 但它们都显示了更复杂情况的代码 而我还没有设法提炼出它的核心 我见过两种方法 QListView或使用QIt
  • QSettings - ini 文件的位置在哪里?

    我在用着QSettings在 Windows 中将一些数据存储为 ini 文件 我想查看ini文件 但我不知道ini文件的位置在哪里 这是我的代码 QSettings set new QSettings QSettings IniForma
  • 如何防止 QTableView 项目在双击时被清除

    使用 QAbstractTableModel 将 QTableView 设置为可编辑flag method def flags self index return Qt ItemIsEnabled Qt ItemIsSelectable Q
  • Qt 按键事件 Enter

    void LoginModle keyPressEvent QKeyEvent event qDebug lt lt event gt key lt lt t lt lt Qt Key Enter lt lt t lt lt QKeyEve
  • 防止 QGraphicsItem 移出 QGraphicsScene

    我有一个场景 其固定尺寸从 0 0 到 481 270 scene gt setSceneRect 0 0 481 270 在里面 我有一个习惯GraphicsItem多亏了旗帜我可以移动它ItemisMovable 但我希望它留在场景中

随机推荐

  • 如何重载前置++和后置++

    前置 即 运算符位于操作数的前面 例如 i 后置 即 运算符位于操作数后面 例如 i 注意一下几点 1 前置 重载时没有参数 而后置 重载时有参数 不会使用其参数 仅仅是区分用 可以理解为前置 后面有参数了 所以不需要参数 2 前置 需要返
  • XP能访问samba,WIN7不能访问解决方案

    win7无法访问Samba 转自 http hi baidu com t byz item b2ee893e52ca885981f1a79e 默认情况下 Windows 7无法正常访问NAS或者Samba服务器上的共享文件夹 原因在于从Vi
  • JavaWeb练习题

    JavaWeb练习题 JavaWeb试题解析链接 https blog csdn net Lvruoyu article details 124440007 关注拂晓DayBreak公众号 回复javaweb练习题 便捷观看 题干 选项A
  • stm32三相逆变程序,pcb,以及板子。stm32输出三相spwm波驱动6个mos管实现三相逆变

    逆变器本身可稳压 可任意设定输出电压 pid参数可用电脑通过串口调节 输入12 40 v 自动生成辅助电源供电 资料齐全 程序注释详细 稳定可靠 适合新手学习以及项目应用 stm32三相逆变开环驱动程序 stm32三相逆变闭环程序 modb
  • Git学习之将不空的文件夹关联到远程仓库

    昨天和今天在将 本地不空的文件夹关联到远程Git仓库 的时候遇到了很多瓶颈 主要方法一般都是在本地创建一个空的文件夹 然后 仓库化 再关联到远程仓库 或者是将远程仓库直接克隆到本地 下面说说将不空的文件夹关联到远程仓库的方法 因为我试了好多
  • 学习UI设计有哪些figma插件

    自2016年推出以来 Figma已发展成为市场领先者UI设计工具之一 因为它不仅简单易用 功能优秀 而且基于云服务 可以实时编辑 节省大量手动下载或复制文件的时间 不仅如此 Figma还提供合作功能 让您和您的团队同时处理文件 避免许多潜在
  • 反诈题库---合计100道(解析版最新)

    反诈题库一合计100 一 判断题 40题 1 小A在淘宝购物 商家发了一条非淘宝的商品链接让其拍下 小A直接点击链接付款 X 解析 淘宝购物坚持按担保交易流程下单 如果卖家要求通过陌生链接或二维码要求付款 100 是骗子 请到安全中心举报
  • postgresql客户端连接错误的解决方法

    今天在重新设置postgresql服务器以后却发现启动不了服务器 错误如下 psql
  • 为什么机油使用后变红_上汽大众为什么开始使用低粘度机油

    2020年注定是一个不平凡的年份 年初的新冠疫情打乱了所有中国人的生活 现在疫情已经一步一步的趋向平缓 所有人的生活也正在回归正常 复工后收到上汽大众总部发来的通知 要求所有新款EA211和EA888国六发动机必须使用符合大众VW50800
  • python小记(2)

    目录 一 安装 问题 二 题目 代码 三 结果 一 安装 问题 Pycharm中File gt setting gt Python Interpreter添加opencv python及opencv contrib python 调用时直接
  • 2023蓝桥杯省赛出成绩时间

    看看各年蓝桥杯出成绩的时间吧 2018年 4 1 4 9 8天 2019年 3 24 3 31 7天 2020年 10 17 10 26 9天 2021年 4 18 4 28 10天 2022年 4 9 4 28 19天 2023年 4 8
  • 卷积操作的过程、参数说明、用CNN实现分类任务的代码

    因为自己初学时候混淆过CNN中图像尺寸变化与通道数变化 本文从理论 gt 使用 根据自己遇到的问题对相关概念作出说明 卷积 相关理论 笼统地说 卷积操作是通过滤波器对原图像进行特征提取的过程 其中涉及卷积核 kernel 步长 stride
  • mnist格式(ubyte)数据与jpg、png格式数据的相互转化

    在学习深度学习的过程中 会发现教程中的模型大多都是用mnist和cifar这两个数据集来演示的 想要使用这些模型在自己的数据上看一下效果 就想到将自己的数据做成与mnist或者cifar格式一样的数据 这里 主要是总结一下自已通过一番百度和
  • MySQL 核心知识点

    数据库基础知识 什么是SQL 结构化查询语言 Structured Query Language 简称SQL 是一种数据库查询语言 作用 用于存取数据 查询 更新和管理关系数据库系统 什么是MySQL MySQL是一个关系型数据库管理系统
  • QT 连mysql数据库

    要在QT中连接MySQL数据库 需要进行以下步骤 1 安装MySQL数据库和QT开发环境 2 在QT中添加MySQL驱动程序 可以在QT的 帮助 菜单中找到 关于插件 的选项 然后选择 SQL驱动程序 选项卡 查看是否已经安装了MySQL驱
  • LINUX后台运行Java项目

    今天在linux部署项目时用的SecureCRT远程连接的 发现在关闭CRT后项目也跟着关闭了 查了文档发现 要想让项目能够后台运行我们可以使用nohup命令来实现 gt nobup java jar xxx jar 当我使用这个命令时又出
  • 输入年份和天数,输出对应的年、月、日

    如果将某个变量的地址作为函数的实参 相应的形参就是指针 若要通过函数调用来改变主调函数中某个变量的值 将该变量的地址或者指向该变量的指针作为实参即可 输入年份和天数 输出对应的年 月 日 要求定义和调用函数month day year ye
  • [创业之路-68]:科创板上市公司符合哪些条件

    上交所发布 关于在上交所设立科创板并试点注册制相关情况答记者问 上交所将认真落实习指示 在证监会的指导下 积极研究制订科创板和注册制试点方案 向市场征求意见并履行报批程序后实施 科创板是独立于现有主板市场的新设板块 并在该板块内进行注册制试
  • could not establish connection to host:The VS Code Server failed to start

    即 vscode使用ssh无法连接远程主机 报出 The VS Code Server failed to start 解决方法 查看VSCode的版本和安装的扩展包Remote SSH是否版本配合 用过cuda的跑过深度学习的人应该对版本
  • Qt CAN总线API扩展

    Qt CAN Bus API extensions Qt CAN总线API扩展 April 20 2023 by Ivan Solovev Comments 2023年4月20日 Ivan Solovev 评论 The latest Qt