Kvaser Leaf light HS v2 | 如何使用Excel发送和接收CAN报文数据

news2025/1/16 19:09:01

从1980年代,Kvaser就开始CAN产品的研发,在相关产品开发领域有近40多年的经验,对CAN和相关总线技术有着非常深入的研究。我们将分享一些有趣的发现和一些特定情况的技术处理,欢迎关注❤️广州智维电子科技有限公司❤️!
所有人的电脑上都有Microsoft Office,平时我们用它列表和计算,除此之外,它还可以被用来进行CAN总线数据收发的工作,进而辅助你进行其他工作。本文就由Kvaser客户软件经理Dan Arvidson分享如何巧用Excel进行该操作。

我们可以利用Windows电脑上的Microsoft Office Excel进行如下操作:
◾从工作表中的任意单元格向CAN总线发送数据
◾以工作表的任意单元格从CAN总线接收数据
Kvaser CANlib可用于Visual Basic for Applications (VBA)。此多功能库支持Kvaser的所有适配器,并辅助你编写高级和创新的解决方案。

有这么多其他语言可以用,为什么还要使用VBA呢?
首先,如果你平时使用Microsoft Office,那么使用它会更容易。Excel使用广泛,通过VBA,你可应用Excel的所有功能,以及你自己的创意和创新想法。另外,使用Excel不会产生额外成本,也更方便与他人或其他公司分享数据。

本文我们会简要介绍如何在Microsoft Excel中使用CANlib、VBA向CAN总线发送/接收数据。

应用此方法,你需要:
根据本文的步骤,你需要使用Kvaser CANlib和Excel VBA。任意版本的Microsoft Office都可以,但最好是Office 2010,因为VBA 7是在2010年推出的。64位和32位Office均可使用(请参阅下文“VBA实例”中的“32和64位Microsoft Office”内容)。本文中,使用的是Office 365和Excel(版本2202 Build 16.0.14931.20116)64位。
你还需要安装“用于Windows的Kvaser驱动程序”。请咨询客服13824417328获取最新版本CANlib并依照其步骤进行安装。如果你需要进一步使用CANlib,我们建议下载Kvaser CANlib SDK,从上述同一链接即可获得。

VBA介绍
VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程序功能,特别是Microsoft Office软件。它也可以说是一种应用程式视觉化的 Basic 脚本。
VBA是Microsoft编程语言Visual Basic 6的一个子集,它使用同一编辑器的精简版本以及类似的调试功能。因此,如果你了解VB6,也就能了解VBA的使用方法。Visual Basic是为了简化编程而创建的,VBA编程的过程不难,使用它就类似于用英语的语句来告诉电脑该做什么。

Application.ActiveDocument.SaveAs (“New Document Name.docx”)
将活动文档另存为 “New Document Name.docx”

需要注意的是,VBA是单线程的,这意味着它将一次执行一个任务。(请参阅下文“VBA示例”中的“多任务处理”内容)

默认情况下,Office不显示“开发工具”选项卡,你必须通过如下步骤启用它:
1️⃣从“File文件”选项卡中,选择“Options选项”打开对话框。
2️⃣选择对话框左侧的“Customize Ribbon自定义功能区”。
3️⃣在对话框左侧的“Choose Commands From从中选择命令”中,选择“Common Commands常用命令”。
4️⃣在右侧的“Customize the ribbon自定义功能区”中,从下拉列表中选择“Main Tab主选项卡”,然后选择“Developer开发工具”复选框。
5️⃣选择OK。

从“开发工具”选项卡,你可以打开编辑器并创建按钮、下拉菜单等。或者,你可以在Office应用程序中使用快捷键:ALT+F11。

如果你还是不了解如何操作,可以在网上进行VBA示例搜索,即使需求不完全相同,你也能从中参考到类似的步骤。
VBA实例
第一个示例将显示当某个单元出现更改时如何作出反应,并将该值发送到CAN总线。
在VBA编辑器中,双击你需要对其作出反应的单元格所在的工作表,然后选择该工作表的“更改(Change)”步骤。
在这里插入图片描述每当该工作表中发生更改时,都会执行工作表更改事件,将其缩小到特定的一个单元格,我使用VBA中的Intersect()函数。此函数确定更改的单元格是否与我们指定的单元格“匹配”。为了简化此示例,我假设工作表处于活动状态,并且我们要发送的值介于0-255之间。有关canWrite中使用的参数,以及如何从CAN总线接收数据的更多信息,请见下一个示例。
在另一个示例中,我已将一个记录文件导入Excel(在此示例中,它是一个.ASC文件)。我这样做只是为了向CAN总线发送数据。
在这里插入图片描述
当然,你的数据可以是来自任何地方的,在VBA中打开一个文件,也可以在Excel中编写几个具体应发送的帧等。
在这里,不会深入探讨CANlib,这个示例主要是启发你可以如何利用VBA和CANlib。在本文,我将演示如何使用Kvaser CANlib从Excel中的任意单元格发送数据,以及如何以Excel中的任意单元格接收数据。
编码

CANlib API - 和句柄声明
Option Explicit 'Force explicit variable declaration so that an undeclared variable generates error.

#If VBA7 Then
Private Declare PtrSafe Sub canInitializeLibrary Lib “CANLIB32.DLL” ()
Private Declare PtrSafe Function canUnloadLibrary Lib “CANLIB32.DLL” () As Long
Private Declare PtrSafe Function canGetNumberOfChannels Lib “CANLIB32.DLL” (ByRef channelCount As Long) As Long
Private Declare PtrSafe Function canGetChannelData Lib “CANLIB32.DLL” (ByVal channel As Long, ByVal item As Long, ByRef buffer As Any, ByVal bufsize As Long) As Long
Private Declare PtrSafe Function canOpenChannel Lib “CANLIB32.DLL” (ByVal handle As Long, ByVal Flags As Long) As LongPtr
Private Declare PtrSafe Function canClose Lib “CANLIB32.DLL” (ByVal handle As LongPtr) As Long
Private Declare PtrSafe Function canBusOn Lib “CANLIB32.DLL” (ByVal handle As LongPtr) As Long
Private Declare PtrSafe Function canBusOff Lib “CANLIB32.DLL” (ByVal handle As LongPtr) As Long
Private Declare PtrSafe Function canSetBusParams Lib “CANLIB32.DLL” (ByVal handle As LongPtr, ByVal freq As Long, ByVal tseg1 As Long, ByVal tseg2 As Long, ByVal sjw As Long, ByVal noSamp As Long, ByVal syncMode As Long) As Long
Private Declare PtrSafe Function canWrite Lib “CANLIB32.DLL” (ByVal handle As LongPtr, ByVal id As Long, ByRef msg As Any, ByVal dlc As Long, ByVal flag As Long) As Long
Private Declare PtrSafe Function canReadWait Lib “CANLIB32.DLL” (ByVal handle As LongPtr, ByRef id As Long, ByRef msg As Any, ByRef dlc As Long, ByRef flag As Long, ByRef time As Long, ByRef timeout As Long) As Long
#Else
Private Declare Sub canInitializeLibrary Lib “CANLIB32.DLL” ()
Private Declare Function canUnloadLibrary Lib “CANLIB32.DLL” () As Long
Private Declare Function canGetNumberOfChannels Lib “CANLIB32.DLL” (ByRef channelCount As Long) As Long
Private Declare Function canGetChannelData Lib “CANLIB32.DLL” (ByVal channel As Long, ByVal item As Long, ByRef buffer As Any, ByVal bufsize As Long) As Long
Private Declare Function canOpenChannel Lib “CANLIB32.DLL” (ByVal handle As Long, ByVal Flags As Long) As Long
Private Declare Function canClose Lib “CANLIB32.DLL” (ByVal handle As Long) As Long
Private Declare Function canBusOn Lib “CANLIB32.DLL” (ByVal handle As Long) As Long
Private Declare Function canBusOff Lib “CANLIB32.DLL” (ByVal handle As Long) As Long
Private Declare Function canSetBusParams Lib “CANLIB32.DLL” (ByVal handle As Long, ByVal freq As Long, ByVal tseg1 As Long, ByVal tseg2 As Long, ByVal sjw As Long, ByVal noSamp As Long, ByVal syncMode As Long) As Long
Private Declare Function canWrite Lib “CANLIB32.DLL” (ByVal handle As Long, ByVal id As Long, ByRef msg As Any, ByVal dlc As Long, ByVal flag As Long) As Long
Private Declare Function canReadWait Lib “CANLIB32.DLL” (ByVal handle As Long, ByRef id As Long, ByRef msg As Any, ByRef dlc As Long, ByRef flag As Long, ByRef time As Long, ByRef timeout As Long) As Long
#End If
'Constant declarations
Private Const canOK = 0
Private Const canOPEN_ACCEPT_VIRTUAL = &H20
Private Const canBITRATE_250K = -3
Private Const canCHANNELDATA_CARD_SERIAL_NO = 7

'Declaration of CAN handles
#If VBA7 Then
Private hnd0, hnd1 As LongPtr
#Else
Private hnd0, hnd1 As Long
#End If

这些声明是必要的,以便指定哪些dll调用可用,并指出此dll的位置。通过Kvaser的安装程序安装时,CANlib32.dll位于系统路径中。这就是说你不必指定它的具体位置。
[ Public | Private ] Declare Sub name Lib “libname” [ ( [ arglist ] ) ]
[ Public | Private ] Declare Function name Lib “libname” [ ( [ arglist ] ) ] [ As type ]
使用Private表明,只有在声明它的模块中才能访问它。
Kvaser CANlib SDK目前不包含任何VB或VBA声明,因此你必须根据需要编写这些声明。有关在线Kvaser CANlib SDK,请访问咨询客服vx:13824417328
有任何问题,你可以联系我们的技术支持人员,本文结尾处提供了联系方式。

调用 CANlib API
初始化CANlib并获取可用通道数
Sub CANLib_Start()
Dim chCount, stat, i As Long
Dim buffer As String
Dim myArr(32) As Byte
Dim ws As Worksheet
canInitializeLibrary
stat = canGetNumberOfChannels(chCount)
If stat <> canOK Then GoTo ErrorHandler
在使用任何其他函数之前,必须先调用canInitializeLibrary函数。它将初始化驱动程序。
canGetNumberOfChannels, 此函数将返回电脑中可用CAN通道的数量。虚拟通道包括在此通道数中。
准备工作表以读取一些设备信息
Sheets.Add(Before:=Sheets(1)).name = “Device info” ’ Add a sheet called “Device info” to the first position
Range(“A1”).Value = “Nof channels”
Range(“B1”).Value = chCount

在这里,我们给第一个位置添加一个新的工作表,并在该工作表的单元格B1中写入可用通道数。

读取每个可用通道的一些设备信息
For i = 0 To chCount - 1
stat = canGetChannelData(i, canCHANNELDATA_CARD_SERIAL_NO, myArr(0), 32)
buffer = StrConv(myArr(), vbUnicode)
If buffer <> Empty Then
Cells(i + 2, 1).Value = “Serial”
Cells(i + 2, 2).Value = buffer
End If
Next i

在这里,我们查看每个可用的通道,并询问设备的序列号,并且我们将其写入每个通道的第二列中的新行(即B)。

打开通道,设置参数并启动总线
hnd0 = canOpenChannel(0, canOPEN_ACCEPT_VIRTUAL)
hnd1 = canOpenChannel(1, canOPEN_ACCEPT_VIRTUAL)
stat = canSetBusParams(hnd0, canBITRATE_250K, 0, 0, 0, 0, 0)
If stat <> canOK Then GoTo ErrorHandler
stat = canSetBusParams(hnd1, canBITRATE_250K, 0, 0, 0, 0, 0)
If stat <> canOK Then GoTo ErrorHandler
stat = canBusOn(hnd0)
If stat <> canOK Then GoTo ErrorHandler
stat = canBusOn(hnd1)
If stat <> canOK Then GoTo ErrorHandler

在这里,我们打开第一个和第二个通道,以获得所有其他调用所需的句柄。我们继续准备这两个打开的通道,为它们设置相同的比特率。

为读取数据准备工作表
DeleteSheet (“Read data”)
Set ws = Sheets.Add()
ws.name = “Read data”
ws.Cells(1, 1).Value = “ID”
ws.Cells(1, 2).Value = “Data1”
ws.Cells(1, 3).Value = “Data2”
ws.Cells(1, 4).Value = “Data3”
ws.Cells(1, 5).Value = “Data4”
ws.Cells(1, 6).Value = “Data5”
ws.Cells(1, 7).Value = “Data6”
ws.Cells(1, 8).Value = “Data7”
ws.Cells(1, 9).Value = “Data8”
这里我们准备一个工作表来存储读取的数据。我首先删除“读取数据(Read data)”表,如果它已经存在。然后我创建此工作表并命名,同时添加一些标题注释,以便更好地理解输出内容。

发送、接收和填充单元格
Sub CANlib_Traffic()
Dim tb As ListObject
Dim iCol, iRow As Integer
Dim sData(1 To 8), sCol As String
Dim bDataTx(1 To 8) As Byte
Dim bDataRx(1 To 8) As Byte
Dim stat, lID, lDlc, lFlags, lTime As Long
Worksheets(“Imported ASC”).Activate
Set tb = ActiveSheet.ListObjects(“TestLog”)
For iRow = 1 To tb.Range.Rows.Count
lDlc = tb.DataBodyRange.Cells(iRow, tb.ListColumns(“DLC”).Index) ’ Get how many data bytes
For iCol = 1 To lDlc
sCol = “Data” + Trim(Str(iCol)) 'Create the headline to read from
sData(iCol) = tb.DataBodyRange.Cells(iRow, tb.ListColumns(sCol).Index)
bDataTx(iCol) = CByte(“&H” & sData(iCol)) ’ Convert the Hex value to decimal
Next iCol
’ Send the byte stream of CAN data on the first channel
stat = canWrite(hnd0, CLng(iRow), bDataTx(1), lDlc, 0)
DoEvents
’ Read out the received data on the second channel
stat = canReadWait(hnd1, lID, bDataRx(1), lDlc, lFlags, lTime, 50)
If stat = canOK Then
With Worksheets(“Read data”) ’ Populate cells in Excel with read CAN data
.Cells(lID + 1, 1).Value = lID
’ .Cells(lID + 1, 2).Value = CStr(Hex(bDataRx(1))) ’ Use this if value should be in hexadecimal
.Cells(lID + 1, 2).Value = bDataRx(1)
.Cells(lID + 1, 3).Value = bDataRx(2)
.Cells(lID + 1, 4).Value = bDataRx(3)
.Cells(lID + 1, 5).Value = bDataRx(4)
.Cells(lID + 1, 6).Value = bDataRx(5)
.Cells(lID + 1, 7).Value = bDataRx(6)
.Cells(lID + 1, 8).Value = bDataRx(7)
.Cells(lID + 1, 9).Value = bDataRx(8)
End With
End If
Next iRow
MsgBox “Traffic done!”
End Sub
首先确定要读取的工作表已激活。在我的示例中,我将导入数据的工作表命名为TestLog,并将其设置为ListObject变量。我这样做是为了在获取要发送的值时更容易循环操作,这样我可以使用工作表的标题来指定我正在读取的列。第一个循环设置为读取导入数据的整个范围。我读取数据长度代码(dlc)值,以了解还要读取和稍后发送的字节数。第二个循环迭代数据字节,将它们从文本格式的十六进制转换为十进制值,并将值存储在字节数组中。

然后,通过调用CANlib函数canWrite,将CAN数据的字节数组与报文id(在本例中为行号)和数据长度代码(dlc)一起发送。

DoEvents可以更轻松地停止正在运行的宏。DoEvents函数允许中断执行代码,并允许计算机处理器同时运行其他任务。使用DoEvents会延长执行时间,但另一方面,它也会让宏停止运行。

canReadWait从接收缓冲区读取报文。如果没有可用的报文,则该函数将等待报文到达或超时。

最后,用该读取值填充之前创建的“读取数据”工作表并使用报文id指定单元格行。通过在写入单元格时使用命名工作表,我不必激活该工作表(Worksheets(“Read data”). Cells (Row, Column).Value),同时能保持保存导入数据的工作表处于活动状态。

操作后清理
Sub CANLib_Stop()
canBusOff (hnd0)
canBusOff (hnd1)
canUnloadLibrary
MsgBox “CANlib is unloaded!”
End Sub

canBusOff把指定句柄关闭。如果同一通道上没有其他句柄处于活动状态,则也将把此通道关闭。canUnloadLibrary将释放分配的内存,卸载已加载的DLL canlib32.,并取消初始化数据结构。

结果在这里插入图片描述
如果选择将输出数据格式化为十六进制,这样更便于比较,然后将单元格格式化为文本: ws.Columns(“A:I”).NumberFormat = “@”,当将值放入这些单元格时,需要进行如下转换:Cells(col, row).Value = CStr(Hex(MyDecValue))。
但在本次操作中,为了让后续分析更方便,我选择了十进制。(也可以使用十六进制值,但有时需要进行转换,因为VBA和Excel中的图表对象需要其值为十进制格式。)
可使用Excel图表可视化数据,例如:
在这里插入图片描述

图表可以在VBA代码中生成,也可以在以后使用Excel的工具栏生成。
32位与64位Microsoft Office
两个Office版本都可用,但VBA版本7中添加了一些新的64位功能。

在这里插入图片描述

VBA中除数据类型Byte外,没有无符号数据类型。但这并不是完全不可行 – 可以在VBA中读取无符号值,例如本例介绍了如何对2147483647以上的值使用双精度类型。
Private Const MAX_UINT32 = 4294967296#
Private Const MAX_INT32 = 2147483647
Function LongToUnsigned(ByVal Value As Long) As Double
If Value < 0 Then
LongToUnsigned = Value + MAX_UINT32
Else
LongToUnsigned = Value
End If
End Function
Function UnsignedToLong(ByVal Value As Double) As Long
If Value < 0 Or Value >= MAX_UINT32 Then Error 6
If Value <= MAX_INT32 Then
UnsignedToLong = Value
Else
UnsignedToLong = Value - MAX_UINT32
End If
End Function

多任务处理
VBA是单线程的,这意味着它将一次执行一个任务。仍然可以创建一个线程或使用回调函数,如CANlib中的kvSetNotifyCallback,但我不建议这样做。如果关闭一个线程并在主线程中等待,则创建一个线程是可以的,但创建更多线程或尝试写入主线程外的单元格,可能会导致Excel冻结并关闭。为了避免麻烦和花费额外时间,建议保持它的简单性和主线程。

对于那些有使用VBA经验的用户,有一些方法可以解决这个问题,例如从代码中的循环中启动一个新的Excel实例,并从该新实例调用主工作簿中的一个过程。
我的建议是保持在主线程里。

结论
在本文中,我们简要介绍了如何在Microsoft Excel中使用CANlib和VBA向CAN总线发送和从CAN总线接收数据。希望此示例可让你了解如何操作可行,并辅助你进一步分析数据或编写解决方案。如果您对本文有任何有问题,可以拨打下方电话13824417328,或者发送邮件至hsales@triv.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/44789.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微信小程序】冒泡事件与非冒泡事件、将文章数据从业务中分离、wxml的模块化

&#x1f3c6;今日学习目标&#xff1a;第十四期——冒泡事件与非冒泡事件、将文章数据从业务中分离、wxml的模块化 &#x1f603;创作者&#xff1a;颜颜yan_ ✨个人主页&#xff1a;颜颜yan_的个人主页 ⏰预计时间&#xff1a;30分钟 &#x1f389;专栏系列&#xff1a;我的第…

Day14--商品详情-渲染商品详情的数据并优化详情页的显示

提纲挈领&#xff1a; 那么如何在小程序中将这些html的字符串渲染成这莫好看的结构呢&#xff1f; 官方文档&#xff1a;【使用uni-ui组件库中的rich-text组件】 1.渲染商品详情信息 我的操作&#xff1a; 1》在页面结构中&#xff0c;使用 rich-text 组件&#xff0c;将带有…

盘点一个批量提取pdf文件目标信息的实用案例

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注回复“书籍”即可获赠Python从入门到进阶共10本电子书今日鸡汤你若盛开,清风自来。大家好&#xff0c;我是皮皮。一、前言前几天在帮助粉丝解决问题的时候&#xff0c;遇到一个简单的小需求&#xff0c;需要批量提取pdf文…

【零基础入门SpringMVC】第六期——尾声

一、注解配置SpringMVC 采用全注解开发&#xff0c;替代我们的web.xml和SpringMVC的核心配置文件 我们需要创建对应的配置类&#xff0c;继承AbstractAnnotationConfigDispatcherServletInitializer 使用的Servlet版本要求在3.0以上项目启动后容器会找到配置了&#xff0c;基于…

台积电跪舔美国,日本却醒悟了而选择独立发展芯片产业

近期台积电大举包机10架将精英人才和设备转往美国引发争议&#xff0c;然而这个时候日本却选择了独立发展芯片产业的道路&#xff0c;摆脱美国的限制&#xff0c;显然日本清醒地认识到依赖美国不会有好结果。台积电之前还在左右摇摆&#xff0c;希望既能继续获得美国芯片的订单…

测试用例的重要性,看完这篇就够了

测试用例对于测试工作的作用&#xff1a;1、指导测试的实施测试用例主要适用于集成测试、系统测试和回归测试。在实施测试时测试用例作为测试的标准&#xff0c;测试人员一定要按照测试用例严格按用例项目和测试步骤逐一实施测试。并对测试情况记录在测试用例管理软件中&#x…

干货 | 数字经济创新创业——如何发展绿色经济

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”&#xff08;数字经济创新创业课程)的精彩内容。主讲嘉宾&#xff1a;Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…

[附源码]计算机毕业设计springboot房屋租赁系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【毕业设计】27-基于单片机的家庭监控及防盗报警_热释电报警_人体系统工程设计(原理图+源代码+仿真+实物照片+答辩论文)

【毕业设计】27-基于单片机的家庭监控及防盗报警/热释电报警/人体系统工程设计&#xff08;原理图源代码仿真实物照片论文&#xff09; 文章目录【毕业设计】27-基于单片机的家庭监控及防盗报警/热释电报警/人体系统工程设计&#xff08;原理图源代码仿真实物照片论文&#xff…

【Java实战】工作中规范使用Java集合

目录 一、前言 二、规范使用Java集合 1.【强制】关于 hashCode 和 equals 的处理&#xff0c;遵循如下规则&#xff1a; 2.【强制】判断所有集合内部的元素是否为空&#xff0c;使用 isEmpty() 方法&#xff0c;而不是 size() 0 的方式。 3.【强制】在使用 java.util.str…

接口自动化测试实践指导(中):接口测试场景有哪些

在第一篇文章中详细给小伙伴们讲解了接口自动化需要做哪些准备工作&#xff0c;准备工作中最后一步接口测试用例设计是非常重要的一个环节&#xff0c;用例设计的好不好&#xff0c;直接关系到我们的测试质量。那如何进行测试用例设计呢&#xff1f;这里呢我结合自身经验&#…

PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据...

原文链接&#xff1a;http://tecdat.cn/?p27099 金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机&#xff08;与确定性相反&#xff09;变量&#xff08;点击文末“阅读原文”获取…

【 医学影像| 数据预处理】

影像读取及预处理&#xff1a;预处理后的数据集建议保存在本地&#xff0c;可以减少训练时的部分资源消耗。里面提到了归一化的 对分割的一些理解&#xff1a;基于深度学习来做医学图像处理&#xff0c;主要的工作集中在了数据预处理部分&#xff1a;深入理解医学图像的格式和特…

GLAD:体全息

概述 自从伽伯1948年提出全息术后&#xff0c;光学全息术已经被广泛用于三维光学成像领域。体全息成像技术是采用体全息光栅作为成像元件对物体进行三维成像的技术。 1990年,由Barbastathis和Brady提出体全息成像技术&#xff0c;采用体全息光栅作为选择成像元件&#xf…

【微信小程序高频面试题——精选一】

微信小程序高频面试题小程序中如何进行接口请求&#xff1f;会不会跨域&#xff0c;为什么小程序的常用命令有哪些你认为微信小程序的优点是什么&#xff0c;缺点是什么微信小程序中的js和浏览器中的js以及node中的js的区别微信小程序中的数据渲染浏览器中有什么不同小程序中如…

全国所有地级市环境污染、企业、公路、固定资产、外商投资-最新面板数据

一、1990&#xff0d;2019年地级市面板数据 1、数据来源&#xff1a;中国城市统计年鉴、WIND数据库 2、时间跨度&#xff1a;2000-2019 3、区域范围&#xff1a;所有地级市 4、指标说明&#xff1a; 该份部分数据指标如下&#xff1a; 主营业务税金及附加(万元) 发明专利…

android-CHECK_xxx分析

android-CHECK_xxx 在android源码中有不少类似这样的用法&#xff0c;上图中就是检查获得的hal版本是否大于等于版本1_3&#xff0c;满足继续往下走&#xff0c;不满足则assert&#xff0c;并报错。 接下来就展开看看CHECK_xx家族&#xff1a; 用法 类型用法含义CHECK_EQ(val…

【SpringCloud】07 流量管理sentinel

sentinel Sentinel 是面向分布式服务架构的高可用流量防护组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 1. 微服务中的服务雪崩 服务雪崩效应是一种因“服务提供者的不可…

Springboot系列(二十二):如何纯文本转成.csv格式文件?|超级详细,建议收藏

一、前言&#x1f525; 不知道大家有咩有遇到这么个需求&#xff0c;给你一长串文本&#xff0c;要求你能导成excel格式展示数据&#xff0c;一时间我陷入了沉思&#xff0c;如果要常规转excel&#xff0c;最明显的一点就是固定表头名&#xff0c;然而并不是&#xff0c;这表头…

[附源码]计算机毕业设计springboot冬奥资讯系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…