CN111158662A - 一种利用LabVIEW设计MSCAN通讯的方法 - Google Patents
一种利用LabVIEW设计MSCAN通讯的方法 Download PDFInfo
- Publication number
- CN111158662A CN111158662A CN201911344001.7A CN201911344001A CN111158662A CN 111158662 A CN111158662 A CN 111158662A CN 201911344001 A CN201911344001 A CN 201911344001A CN 111158662 A CN111158662 A CN 111158662A
- Authority
- CN
- China
- Prior art keywords
- code
- function
- character string
- file
- writing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/33—Intelligent editors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/34—Graphical or visual programming
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Communication Control (AREA)
Abstract
本发明公开了一种利用LabVIEW设计MSCAN通讯的方法,该方法利用了LabVIEW功能丰富的图形化界面,通过该软件设计前面板和程序框图,向用户采集MSCAN通讯的基本设置信息和发送报文信息,再经过信息的处理和代码的拼接,最后生成C语言程序,该程序可供配置了MSCAN模块的微处理器所使用。通过该方法生成的MSCAN通信程序,可以很大程度上减少配置复杂MSCAN模块所需的时间,生成的C语言程序中还包括对MSCAN操作的各子函数程序,方便用户对程序的二次开发。
Description
技术领域
本发明属于CAN通信领域技术领域,具体涉及一种利用LabVIEW设计MSCAN通讯的方法。
背景技术
美国国家仪器有限公司自1976年成立以来就非常注重编程技术的发展,公司的代表产品LabVIEW以图形化编程环境取代了传统的文本表达形式,受到了广大用户的青睐,使LabVIEW语言迅速发展成为全球热门编程语言之一,并迅速占领了测控系统开发的市场。但是LabVIEW语言的通用性远不及C语言,使其难以移植到微处理器中,虽然LabVIEW也注重语言间的相互转换问题,它的“C generator模块”可以使LabVIEW语言直接向C语言进行转换,但从实际使用情况来看,转换的结果并不理想,生成的C语言质量不好,不能够与微处理器直接对接。
发明内容
针对上述问题,本发明提供了一种利用LabVIEW设计MSCAN通讯的方法,该方法能够充分利用许多微处理器的程序已基本实现模块化的特点,利用LabVIEW字符串相连生成C语言程序的方法,显著提高C语言程序的生成质量,使产生的程序能够由编译器直接进行编译后供微处理器使用,提高了编程人员的工作效率。通过该方法设计的自动代码生成器软件操作简单,用户界面友好,降低了用户的技术要求,通过自动代码生成器生成的各子程序文本文件还给用户的二次开发提供了便捷的途径。通过该方法设计的MSCAN通讯软件系统能实现以下几种功能:
1.通过软件的前面板与用户交流,向用户获取MSCAN通讯的基本设置信息,包括MSCAN初始化设置信息:CAN模块、晶振频率、同步跳转宽度、接收中断、CAN时钟源、波特率、采样数量和标识符类型的选择;MSCAN滤波器的设置信息:验收码和屏蔽码的设置。此外,从前面板中还能够获取CAN通信中要发送的报文信息,包括:报文ID、报文长度、报文优先级、报文内容和帧类型。
2.软件本身能够自动检测用户的设置信息是否正确,如果设置错误,会向用户发送警告,提醒用户进行更改。
3.能够根据用户的设置信息和报文信息快速生成C语言程序,生成的C语言程序包括完整的代码程序和各子函数程序,并将它们存放在指定文件夹的文本文件中,供用户使用。
本发明的有益效果:
该方法能够充分利用许多微处理器的程序已基本实现模块化的特点,利用LabVIEW字符串相连生成C语言程序的方法,显著提高C语言程序的生成质量,使产生的程序能够由编译器直接进行编译后供微处理器使用,提高了编程人员的工作效率。
通过该方法设计的自动代码生成器软件操作简单,用户界面友好,降低了用户的技术要求,对于不太精通C语言的用户,也可以采用本程序直接生成所需的MSCAN通讯C语言程序代码。
通过该方法能够直接生成各子程序文本文件,用户可以直接采用本程序生成的子程序文本进行二次开发。
附图说明
图1为本发明中所设计的软件的前面板
图2为本发明中主vi函数的流程图
图3为本发明中滤波器设置子vi函数的程序框图
图4为本发明中主函数子vi函数的层叠式顺序结构第0帧程序框图
图5为本发明中主函数子vi函数的层叠式顺序结构第1帧程序框图
图6为本发明中can初始化子vi函数的层叠式顺序结构第0帧程序框图
图7为本发明中can发送子vi函数的层叠式顺序结构第0帧程序框图
图8为本发明中can接收子vi函数的程序框图
图9为本发明中延时函数的程序框图
图10为本发明中can接收中断函数的程序框图
具体实施方式
为了使本领域的技术人员更好的理解本发明提供的方案,下面结合附图和实施例对本发明作进一步说明。
前面板的设计:
前面板是该方法所设计软件与用户进行交流,以获取MSCAN基本设置信息和发送报文信息的界面。前面板的设计如图1所示,它主要分为以下四个部分:
1.MSCAN初始化信息设置区
该设置区包括:CAN模块、晶振频率、同步跳转宽度、接收中断、CAN时钟源、波特率、采样数量和标识符类型这8个枚举型输入控件。这些枚举型输入控件用于选择MSCAN初始化所需明确的基本内容。CAN模块:简称CAN控制器,主要有5个,分别为:CAN0、CAN1、CAN2、CAN3和CAN4。晶振频率:单片机外接晶振所产生的时钟信号,主要有3个,分别为:8MHz、16MHz和32MHz。同步跳转宽度:用于兼容不同波特率的总线,除了本身设定的波特率,还能接收一个上下容差范围内的波特率,主要有4个,分别为:1Tq、2Tq、3Tq和4Tq。接收中断:是否开启接收中断的功能,使能或禁止。CAN时钟源:确定CAN时钟信号的来源,主要有2个,分别为:晶振时钟和总线时钟。波特率:表示每秒钟传送的码元符号的个数,主要有16个。采样数量:设定每位样本的数量,主要有2个,分别为:每位1个样本和每位3个样本。标识符类型:基于用户所选择的标识符类型,将C语言代码写为相应的形式。具体如表1所示:
表1
2.MSCAN滤波器信息设置区
该设置区包括:验收码字符串输入控件、屏蔽码字符串输入控件和输入格式单选按钮,将它们一起捆绑成簇变量。验收码和屏蔽码这两个字符串输入控件分别用于输入十进制或十六进制格式的验收码和屏蔽码,输入格式单选按钮有十进制和十六进制两项,用于选择验收码和屏蔽码这两个字符串输入控件的输入格式。
3.CAN总线发送报文信息设置区
该设置区包括:报文ID、报文长度、报文优先级和报文内容共4个字符串输入控件和一个帧类型枚举型输入控件。报文ID、报文长度、报文优先级和报文内容这4个字符串输入控件分别用于输入十六进制格式的报文ID、十进制格式的报文长度、十进制格式的报文优先级和字符型格式的报文内容,帧类型枚举型输入控件用于选择报文发送的帧类型,它可以选择发送数据帧或远程帧。
4.软件控制区
该控制区包括一个“生成代码”按钮和一个“退出”按钮,在MSCAN基本设置信息和发送报文信息设置完成以后,“生成代码”按钮用于控制产生C语言程序并将之存放于指定文件夹中的文本文件中;“退出”按钮用于控制软件的退出。
利用“连接字符串”函数,将字符串常量、字符串输入控件或其它函数生成的字符串变量按顺序连接起来,再通过“写入文本文件”函数,将连接好的新字符串写入到指定的文本文件当中,经过多次的字符串连接和写入文本文件,最后可以获得一套完整的C语言程序。
还包括设计替换文本文件中指定字符串的方法:利用LabVIEW的“文件I/O选板”中对文件的各操作函数,将给定路径的文本文件中指定的字符串全部替换成新的字符串,其步骤如下所示:
步骤1:利用“打开/创建/替换文件”函数,给函数输入待操作文件的路径,打开文件;
步骤2:利用“读取文本文件”函数读取文件的内容,读取内容从该函数的“文本”输出口以字符串形式输出;
步骤3:将步骤2输出的字符串输入到“搜索替换字符串”函数的“输入字符串”接口中,并向该函数的“搜索字符串”接口处创建一个字符串常量,该字符串常量的值为要替换的字符串,然后再向该函数的“替换字符串”接口处创建一个字符串常量,该字符串常量的值为替换成的新字符串,然后在函数的“替换全部”接口处连接一个布尔真常量,以全部替换文本文件中所有要替换的字符串,最后在函数的“结果字符串”接口处连接一个字符串显示控件,以获取替换后的文本内容;
步骤4:将文件的路径输入到“关闭文件”函数中,利用该函数关闭文件;
步骤5:将文件的路径输入到“删除”函数中,利用该函数删除文件;
步骤6:利用“打开/创建/替换文件”函数,给函数输入已删除原文件的路径,然后在函数的“操作”接口处创建一个枚举型常量,并选择“replace or create”项,重新创建文本文件;
步骤7:创建一个局部变量并将它指向步骤3的字符串显示控件,利用“写入文本文件”函数,将这个局部变量连接到函数的“文本”输入口中,以向新创建的文本文件写入替换后的文本内容;
步骤8:将已删除原文件的路径输入到“关闭文件”函数中,利用该函数关闭文件。
程序框图的设计:
程序框图是该方法所设计软件的后台运行程序,它从前面板获取MSCAN通讯的基本设置信息和发送报文信息,经过信息的处理和代码的拼接,最后生成可供配置了MSCAN模块的微处理器所使用的C语言程序,同时它也具备一套检验机制,提醒用户设置信息是否正确。程序框图的设计包含主vi函数设计和各子vi函数设计,具体如下所示:
1.主vi函数设计
如图2所示为软件主vi函数的流程图,主vi函数主要生成完整的C语言程序,它把主函数、CAN初始化子函数、CAN发送子函数、CAN接收子函数、延时子函数和接收中断子函数这几个子vi函数生成的C代码按顺序连接起来,并连接一些包含头文件、滤波器设置、结构体声明等C代码形成完整的C语言程序。主vi函数还可以根据CAN模块的选择,进行C语言程序的修改,使C语言程序能够在微处理器中不同的CAN模块当中应用。主vi函数的步骤如下:
步骤1:判断前面板中的“生成代码”按钮是否被按下,若是则进入步骤2;
步骤2:检测路径为“E:\自动代码”的“自动代码”文件夹是否存在,若否,则在该路径中新建名为“自动代码”的文件夹,然后进入步骤3,若是,则直接进入步骤3;
步骤3:在“自动代码”文件夹中创建名为“完整代码”的文本文件;
步骤4:在“完整代码”文件中写入包含头文件的C代码;
步骤5:在“完整代码”文件中写入滤波器设置C代码;
步骤6:在“完整代码”文件中写入结构体声明C代码;
步骤7:在“完整代码”文件中写入主函数C代码;
步骤8:在“完整代码”文件中写入CAN初始化子函数C代码;
步骤9:在“完整代码”文件中写入CAN发送子函数C代码;
步骤10:在“完整代码”文件中写入CAN接收子函数C代码;
步骤11:在“完整代码”文件中写入延时子函数C代码;
步骤12:判断前面板中接收中断枚举型输入控件的项是否选择“使能”,若是,则在“完整代码”文件中写入接收中断子函数C代码,然后进入步骤13,若否,则直接进入步骤13;
步骤13:判断前面板中CAN模块枚举型输入控件的项是否选择“CAN0”,若是,则进入步骤14,若否,则进入步骤23;
步骤14:将字符串“CAN”和CAN模块控件的值连接成字符串作为“替换字符串”;
步骤15:打开“自动代码”文件夹的各文本文件;
步骤16:读取各文件的内容;
步骤17:搜索各文本文件中的“CAN0”字符串;
步骤18:将所有的“CAN0”字符串替换为“替换字符串”;
步骤19:替换结果保存到相应的显示控件中;
步骤20:删除“自动代码”文件夹的各文本文件;
步骤21:在原路径重新创建各文本文件;
步骤22:将相应的显示控件值写入到各文本文件;
步骤23:判断前面板中的“退出”按钮是否被按下,若是,则进入步骤24,若否,则进入步骤1;
步骤24:输出提示“谢谢使用!”;
步骤25:退出软件。
2.子vi函数设计-滤波器设置
如图3所示为滤波器设置子vi函数的程序框图,如图1前面板所示的滤波器设置簇变量被输入到该子vi函数当中,经过函数的处理,以字符串的形式输出滤波器设置的C代码,该函数的步骤如下所示:
步骤1:将滤波器设置簇变量用“按名称解除捆绑”函数解除簇捆绑,读取簇变量中包含的验收码、屏蔽码和输入格式的内容;
步骤2:将读取到的输入格式的内容与一个项为“十进制”的枚举型常量进行“等于”比较,以判断用户的输入格式为是否为十进制,若是,则进入步骤3,若否,则直接进入步骤4;
步骤3:将验收码与屏蔽码这两个字符串输入控件的值分别输入到两个“十进制数字符串至数值转换”函数中,通过函数将它们转换为十六进制字符串;
步骤4:将验收码与屏蔽码这两个字符串输入控件的值或经步骤3转换后的值分别输入到验收码与屏蔽码这两个字符串显示控件中,以获取十六进制格式的验收码与屏蔽码。
步骤5:用一个“连接字符串”函数将C代码、验收码和屏蔽码按C语言的格式连接起来,连接的字符串保存到一个名为“滤波器代码”的字符串显示控件当中;
步骤6:通过“滤波器代码”字符串显示控件输出滤波器设置的C代码。
3.子vi函数设计-主函数
图4和图5分别是主函数子vi函数的层叠式顺序结构第0帧程序框图和第1帧程序框图,将如图1前面板所示的填写待发送报文内容簇变量和标识符类型枚举型输入控件的值输入到该函数中,通过函数的处理,以字符串的形式输出主函数的C代码,该函数还会将生成的C代码保存到指定路径的文本文件中。同时,该函数还可以自动检测用户填写的报文ID是否正确,如果填写错误,会向用户发送警告,提醒用户进行更改。
该函数的步骤如下所示:
步骤1:将填写待发送报文内容簇变量用“按名称解除捆绑”函数解除簇捆绑,读取簇变量中包含的报文ID、报文优先级、报文长度、报文内容、帧类型的内容;
步骤2:用“连接字符串函数”分别将读取到的报文ID、报文优先级和报文长度的内容与相应的C代码连接起来,形成如图4所示的4个字符串;
步骤3:将读取到的报文内容输入给一个名为“报文内容”的字符串显示控件;
步骤4:将读取到的帧类型与一个项为“数据帧”的枚举型常量作“等于”比较,以判断用户是否选择发送数据帧,若是,则进入步骤5,若否,则进入步骤6;
步骤5:将选择发送数据帧的C代码与步骤2中连接起来的4个字符串相连,形成的字符串保存到名为“填写报文”的字符串显示控件中,然后进入步骤7;
步骤6:将选择发送远程帧的C代码与步骤2中连接起来的4个字符串相连,形成的字符串保存到名为“填写报文”的字符串显示控件中,然后进入步骤7;
步骤7:将标识符类型枚举型输入控件与项为“标准标识符”的枚举型常量作“等于”比较,以判断用于是否选择使用标准标识符来发送CAN报文,若是,则进入步骤8,若否,则进入步骤9;
步骤8:将读取到的报文ID内容输入到一个“十六进制数字符串至数值转换”的“字符串”输入口中,将报文的ID转换为十进制数,并将该数值与2047进行比较,若比2047大,则输出“警告:标准帧ID超出范围!ID:0x0000~0x07ff。”,然后进入步骤10;
步骤9:将读取到的报文ID内容输入到一个“十六进制数字符串至数值转换”的“字符串”输入口中,将报文的ID转换为十进制数,并将该数值与536870911进行比较,若比536870911大,则输出“警告:扩展帧ID超出范围!ID:0x00000000~0x1fffffff。”,然后进入步骤10;
步骤10:如图5所示,将第0帧程序框图中生成的“报文内容”和“填写报文”字符串与C代码连接起来,最后生成主函数代码,保存到名为“主函数代码”的字符串显示控件当中;
步骤11:在“自动代码”文件夹中创建或覆盖名为“主函数”的文本文件,将步骤10中生成的“主函数代码”字符串显示控件输入到“写入文本文件”的“文本”输入口中,然后关闭文件;
4.子vi函数设计-波特率设置
波特率设置子vi函数将如图1前面板所示的CAN时钟源、晶振频率和波特率这几个枚举型输入控件的值输入到函数中,通过函数的处理,以字符串的形式输出波特率设置的C代码,供其它函数使用。同时,该函数还会自动检测用户对CAN时钟源、晶振频率和波特率的设置是否正确,如果设置错误,会向用户发送警告,提醒用户进行更改。
该函数的步骤如下:
步骤1:CAN时钟源和晶振频率枚举型输入控件的项如表1所示,将这两个枚举型输入控件分别跟相应的枚举型常量进行“等于”比较,以获取用户对CAN时钟源和晶振频率的选择,根据表2计算出CAN时钟频率;
表2
选择方案 | CAN时钟源 | 晶振频率/MHz | CAN时钟频率/MHz |
1 | 晶振时钟 | 8 | 8 |
2 | 总线时钟 | 16 | 8 |
3 | 晶振时钟 | 16 | 16 |
4 | 总线时钟 | 32 | 16 |
5 | 晶振时钟 | 32 | 32 |
步骤2:若CAN时钟频率为8MHz则进入步骤3,若CAN时钟频率为16MHz则进入步骤4,若CAN时钟频率为32MHz则进入步骤5;
步骤3:波特率枚举型输入控件的项如表1所示,将它与相应的枚举型常量进行“等于”比较,以获取用户对波特率的选择,根据用户对波特率的选择,计算出预分频数、时间段1和时间段2的值,进而获取MSCAN模块的CAN0BTR0_BRP和CAN0BTR1寄存器的值,如表3所示,如果用户选择的波特率不在表3的范围内,则输出提示“警告:CAN时钟频率低,不能达到该波特率设置要求!”,根据表3用C代码指令配置寄存器的值,并以字符串的形式输出给名为“波特率代码”的字符串显示控件,然后进入步骤6;
表3
波特率/kbps | 预分频数 | 时间段1 | 时间段2 | CAN0BTR0_BRP | CAN0BTR1 |
5 | 64 | 16 | 8 | 63 | 0x7f |
10 | 32 | 16 | 8 | 31 | 0x7f |
20 | 16 | 16 | 8 | 15 | 0x7f |
25 | 32 | 7 | 2 | 31 | 0x16 |
40 | 8 | 16 | 8 | 7 | 0x7f |
50 | 8 | 13 | 6 | 7 | 0x5c |
62.5 | 8 | 11 | 4 | 7 | 0x3a |
80 | 10 | 7 | 2 | 9 | 0x16 |
100 | 8 | 7 | 2 | 7 | 0x16 |
125 | 8 | 5 | 2 | 7 | 0x14 |
200 | 4 | 7 | 2 | 3 | 0x16 |
250 | 4 | 5 | 2 | 3 | 0x14 |
400 | 2 | 6 | 3 | 1 | 0x25 |
500 | 2 | 5 | 2 | 1 | 0x14 |
步骤4:波特率枚举型输入控件的项如表1所示,将它与相应的枚举型常量进行“等于”比较,以获取用户对波特率的选择,根据用户对波特率的选择,计算出预分频数、时间段1和时间段2的值,进而获取MSCAN模块的CAN0BTR0_BRP和CAN0BTR1寄存器的值,如表4所示,如果用户选择的波特率不在表4的范围内,则输出提示“警告:CAN时钟频率高,不能达到该波特率设置要求!”,根据表4用C代码指令配置寄存器的值,并以字符串的形式输出给名为“波特率代码”的字符串显示控件,然后进入步骤6;
表4
波特率/kbps | 预分频数 | 时间段1 | 时间段2 | CAN0BTR0_BRP | CAN0BTR1 |
10 | 64 | 16 | 8 | 63 | 0x7f |
20 | 32 | 16 | 8 | 31 | 0x7f |
25 | 64 | 7 | 2 | 63 | 0x16 |
40 | 16 | 16 | 8 | 15 | 0x7f |
50 | 16 | 13 | 6 | 15 | 0x5c |
62.5 | 16 | 11 | 4 | 15 | 0x3a |
80 | 20 | 7 | 2 | 19 | 0x16 |
100 | 16 | 7 | 2 | 15 | 0x16 |
125 | 16 | 5 | 2 | 15 | 0x14 |
200 | 8 | 7 | 2 | 7 | 0x16 |
250 | 8 | 5 | 2 | 7 | 0x14 |
400 | 4 | 6 | 3 | 3 | 0x25 |
500 | 4 | 5 | 2 | 3 | 0x14 |
800 | 2 | 7 | 2 | 1 | 0x16 |
1000 | 2 | 5 | 2 | 1 | 0x14 |
步骤5:波特率枚举型输入控件的项如表1所示,将它与相应的枚举型常量进行“等于”比较,以获取用户对波特率的选择,根据用户对波特率的选择,计算出预分频数、时间段1和时间段2的值,进而获取MSCAN模块的CAN0BTR0_BRP和CAN0BTR1寄存器的值,如表5所示,如果用户选择的波特率不在表5的范围内,则输出提示“警告:CAN时钟频率高,不能达到该波特率设置要求!”,根据表5用C代码指令配置寄存器的值,并以字符串的形式输出给名为“波特率代码”的字符串显示控件,然后进入步骤6;
表5
步骤6:将“波特率代码”字符串显示控件的值作为该函数的输出。
5.子vi函数设计-can初始化函数
如图6所示为can初始化子vi函数的层叠式顺序结构第0帧程序框图,将如图1前面板所示的晶振频率、同步跳转宽度、接收中断、CAN时钟源、波特率、采样数量和标识符类型这几个枚举型输入控件的值输入到该函数中,通过函数的处理,以字符串的形式输出CAN初始化函数的C代码,该函数还会将生成的C代码保存到指定路径的文本文件中。同时,该函数还会自动检测用户对CAN时钟源、晶振频率和波特率的设置是否正确,如果设置错误,会向用户发送警告,提醒用户进行更改。该函数的步骤如下所示:
步骤1:在“自动代码”文件夹中创建或覆盖名为“can初始化函数”的文本文件;
步骤2:在“can初始化函数”文件中写入MSCAN进入初始化模式的C代码指令;
步骤3:直接将同步跳转宽度枚举型输入控件的值输入到“数值至十进制数字符串转换”函数中,以获取字符型的同步跳转宽度设置值,并将该值与C代码连接,最后获取同步跳转宽度设置的指令代码字符串,将该字符串写入“can初始化函数”文件中;
步骤4:将晶振频率、CAN时钟源和波特率枚举型输入控件的值输入到波特率设置子vi函数中,波特率设置子vi函数的输出写入到“can初始化函数”文件中;
步骤5:直接将采样数量枚举型输入控件的值输入到“数值至十进制数字符串转换”函数中,以获取字符型的采样数量设置值,并将该值与C代码连接,最后获取采样数量设置的指令代码字符串,将该字符串写入“can初始化函数”文件中;
步骤6:将CAN时钟源枚举型输入控件与项为“晶振时钟”的枚举型常量作“等于”比较,以判断用户是否选择晶振时钟作为CAN时钟源,若是,则将选择晶振时钟作为CAN时钟源的C语言代码写入“can初始化函数”文件中,若否,则将选择总线时钟作为CAN时钟源的C语言代码写入“can初始化函数”文件中;
步骤7:将标识符类型枚举型输入控件与项为“扩展标识符”的枚举型常量作“等于”比较,以判断用户是否选择扩展标识符作为标识符类型,若是,则按MSCAN扩展标识符写入验收码和屏蔽码的要求将C代码写入“can初始化函数”文件中,若否,则按MSCAN标准标识符写入验收码和屏蔽码的要求将C代码写入“can初始化函数”文件中;
步骤8:在“can初始化函数”文件中写入MSCAN退出初始化模式、等待退出初始化模式完成和等待时钟同步的C代码指令;
步骤9:将接收中断枚举型输入控件与项为“使能”的枚举型常量作“等于”比较,以判断用户是否使能接收中断,若是,则将使能接收中断的C代码写入“can初始化函数”文件中,若否,则将禁止接收中断的C代码写入“can初始化函数”文件中;
步骤10:关闭文件;
步骤11:重新打开“can初始化函数”文件,并读取文件的内容,将文件的内容保存到一个名为“can初始化函数”的字符串显示控件中,并将该显示控件的值作为函数的输出。
6.子vi函数设计-can发送函数
如图7所示为can发送子vi函数的层叠式顺序结构第0帧程序框图,将如图1前面板所示的标识符类型枚举型输入控件的值输入到该函数中,通过函数的处理,以字符串的形式输出can发送函数的C代码,该函数还会将生成的C代码保存到指定路径的文本文件中。该函数的步骤如下所示:
步骤1:在“自动代码”文件夹中创建或覆盖名为“can发送函数”的文本文件;
步骤2:在“can发送函数”文件中写入MSCAN等待时钟同步和寻找可用缓冲器的C代码指令;
步骤3:将标识符类型枚举型输入控件的值与一个项为“扩展标识符”的枚举型常量进行“等于”比较,以判断用户是否选择扩展标识符作为标识符类型,若是,则进入步骤4,若否,则进入步骤5;
步骤4:按选择发送扩展标识符时,标识符发送寄存器写入报文ID的要求,将代码写入“can发送函数”文件中,同时,将发送帧类型代码、发送数据代码、发送数据长度代码、发送优先级代码和报文准备发送代码写入“can发送函数”文件中,然后进入步骤6;
步骤5:按选择发送标准标识符时,标识符发送寄存器写入报文ID的要求,将代码写入“can发送函数”文件中,同时,将发送帧类型代码、发送数据代码、发送数据长度代码、发送优先级代码和清除TXE标志的C代码写入“can发送函数”文件中,然后进入步骤6;
步骤6:关闭文件;
步骤7:重新打开“can发送函数”文件,并读取文件的内容,将文件的内容保存到一个名为“can发送函数”的字符串显示控件中,并将该显示控件的值作为函数的输出。
7.子vi函数设计-can接收函数
如图8所示为can接收子vi函数的程序框图,将如图1前面板所示的标识符类型枚举型输入控件的值输入到该函数中,通过函数的处理,以字符串的形式输出can接收函数的C代码,该函数还会将生成的C代码保存到指定路径的文本文件中。该函数的步骤如下所示:
步骤1:将标识符类型枚举型输入控件的值与一个项为“扩展标识符”的枚举型常量进行“等于”比较,以判断用户是否选择扩展标识符作为标识符类型,若是,则进入步骤2,若否,则进入步骤3;
步骤2:写入接收RTR位、接收数据长度、接收数据、接收扩展标识符和清除RXE标志的C代码,然后进入步骤4;
步骤3:写入接收RTR位、接收数据长度、接收数据、接收标准标识符和清除RXE标志的C代码,然后进入步骤4;
步骤4:将步骤3或步骤4的C代码保存到一个名为“can接收函数”的字符串显示控件中,并将该显示控件的值作为函数的输出;
步骤5:在“自动代码”文件夹中创建或覆盖名为“can接收函数”的文本文件,然后将步骤3或步骤4的C代码写入到该文件中;
步骤6:关闭文件。
8.子vi函数设计-延时函数
如图9所示为延时函数的程序框图,该函数以字符串的形式输出延时函数的C代码,该函数还会将生成的C代码保存到指定路径的文本文件中。该函数的步骤如下所示:
步骤1:在“自动代码”文件夹中创建或覆盖名为“延时函数”的文本文件;
步骤2:将延时函数的C代码保存到一个名为“延时函数”的字符串显示控件当中,并将该显示控件的值作为函数的输出;
步骤3:将延时函数的C代码写入到“延时函数”文件中;
步骤4:关闭文件。
9.子vi函数设计-can接收中断函数
如图10所示为can接收中断函数的程序框图,将如图1前面板所示的CAN模块枚举型输入控件的值输入到该函数中,通过函数的处理,以字符串的形式输出can接收中断函数的C代码,该函数还会将生成的C代码保存到指定路径的文本文件中。该函数的步骤如下所示:
步骤1:将CAN0接收中断函数的C代码保存到一个名为“can接收中断函数”的字符串显示控件中;
步骤2:将CAN模块枚举型输入控件的值与一个项为“CAN1”的枚举型常量进行“等于”比较,以判断用户是否需要生成CAN1模块的can接收中断函数,若是,则利用“搜索替换字符串”函数将步骤1保存的“can接收中断函数”控件中的字符串“38”替换为字符串“42”,字符串“CAN0”替换为“CAN1”,替换后的结果仍保存到步骤1的“can接收中断函数”控件中;
步骤3:将CAN模块枚举型输入控件的值与一个项为“CAN2”的枚举型常量进行“等于”比较,以判断用户是否需要生成CAN2模块的can接收中断函数,若是,则利用“搜索替换字符串”函数将步骤1保存的“can接收中断函数”控件中的字符串“38”替换为字符串“46”,字符串“CAN0”替换为“CAN2”,替换后的结果仍保存到步骤1的“can接收中断函数”控件中;
步骤4:将CAN模块枚举型输入控件的值与一个项为“CAN3”的枚举型常量进行“等于”比较,以判断用户是否需要生成CAN1模块的can接收中断函数,若是,则利用“搜索替换字符串”函数将步骤1保存的“can接收中断函数”控件中的字符串“38”替换为字符串“50”,字符串“CAN0”替换为“CAN3”,替换后的结果仍保存到步骤1的“can接收中断函数”控件中;
步骤5:将CAN模块枚举型输入控件的值与一个项为“CAN4”的枚举型常量进行“等于”比较,以判断用户是否需要生成CAN1模块的can接收中断函数,若是,则利用“搜索替换字符串”函数将步骤1保存的“can接收中断函数”控件中的字符串“38”替换为字符串“54”,字符串“CAN0”替换为“CAN4”,替换后的结果仍保存到步骤1的“can接收中断函数”控件中;
步骤6:在“自动代码”文件夹中创建或覆盖名为“can接收中断函数”的文本文件,将“can接收中断函数”控件的值写入“can接收中断函数”文件,并将控件的值作为函数的输出。
实例
为了使本领域的技术人员更好的理解本发明提供的方案,下面给出一个实例。
实例:用户打开软件后会进入到如图1所示的界面当中,然后用户可以依次选择需要生成MSCAN哪个模块的程序、微处理器外部晶振的频率、同步跳转宽度、接收中断使能、CAN时钟源、CAN通信的波特率、采样数量和标识符类型。选择完以上内容后,用户还需要填写发送报文的内容,然后填写CAN模块滤波器设置信息。
当用户设置或填写完成图1所示界面上的信息后,点击“生成代码”按钮,这时软件会快速生成代码,并提示用户是否有设置错误信息,然后提示用户到"E:\自动代码"查看代码文本。当用户点击“退出”按钮时,软件会提示“谢谢使用!”,然后退出软件。
在软件后台的程序框图中,当检测到用户点击“生成代码”按钮时,会先检测计算机E盘中的“自动代码”文件夹是否存在,若不存在,则创建一个“自动代码”文件夹,然后在主vi函数中按照图2所示的流程生成“完整代码”文本文件。软件在主vi函数中运行时,程序会进入到一些子vi函数当中,在这些子vi函数中,主函数子vi函数会生成“主函数”文本文件,can初始化函数子vi函数会生成“can初始化函数”文本文件,can发送函数子vi函数会生成“can发送函数”文本文件,can接收函数子vi函数会生成“can接收函数”文本文件,延时函数子vi函数会生成“延时函数”文本文件,can接收中断函数子vi函数会生成“can接收中断函数”文本文件。所有生成的文本均被保存到“自动代码文件夹”中。
该软件以生成CAN0模块C语言程序为主,在所有的子vi函数中,除了can接收中断函数子vi函数具有生成所有CANx(x为0、1、2、3或4)模块的程序能力外,其它的子vi函数均只针对CAN0模块生成相应的C语言程序。为了满足用户的多样化需求,在主vi函数中有替换文本文件的指定字符串的功能,该功能可以将CAN0模块的C语言程序修改成适合CANx(x为0、1、2、3或4)模块使用的C语言程序,用户只需要修改前面板中的CAN模块枚举型输入控件就可以生成CAN其它模块的程序。
上文所列出的一系列的详细说明仅仅是针对本发明的可行性实施方式的具体说明,它们并非用以限制本发明的保护范围,凡未脱离本发明技艺精神所作的等效实施方式或变更均应包含在本发明的保护范围之内。
Claims (8)
1.一种利用LabVIEW设计MSCAN通讯的方法,包括:设计前面板和程序框图;其特征在于,所述前面板用于与用户进行交流,以获取MSCAN基本设置信息和发送报文信息的界面;所述程序框图为后台运行部分,它从前面板获取MSCAN通讯的基本设置信息和发送报文信息,经过信息的处理和代码的拼接,生成可供配置了MSCAN模块的微处理器所使用的C语言程序。
2.根据权利要求1所述的一种利用LabVIEW设计MSCAN通讯的方法,其特征在于,所述前面板包括MSCAN初始化信息设置区、MSCAN滤波器信息设置区、CAN总线发送报文信息设置区、以及软件控制区。
3.根据权利要求2所述的一种利用LabVIEW设计MSCAN通讯的方法,其特征在于,所述MSCAN初始化信息设置采用枚举型输入控件,其包含的枚举型输入控件有:CAN模块、晶振频率、同步跳转宽度、接收中断、CAN时钟源、波特率、采样数量和标识符类型控件。
4.根据权利要求2所述的一种利用LabVIEW设计MSCAN通讯的方法,其特征在于,所述MSCAN滤波器信息设置区包括验收码字符串输入控件、屏蔽码字符串输入控件和输入格式单选按钮,并将它们一起捆绑成簇变量。
5.根据权利要求4所述的一种利用LabVIEW设计MSCAN通讯的方法,其特征在于,利用所述簇变量获取MSCAN滤波器的设置信息的步骤如下:
步骤1:将验收码与屏蔽码这两个字符串输入控件和1个输入格式单选按钮捆绑成簇变量;
步骤2:设计一个名为滤波器设置的子函数,将簇变量输入到该子函数中,在子函数中将输入的簇变量用“按名称解除捆绑”函数读取簇变量的内容;
步骤3:将读取到的输入格式与一个项为“十进制”的枚举型常量进行“等于”比较,以判断用户的输入格式为是否为十进制,若是则进入步骤4,若否则直接进入步骤5;
步骤4:将验收码与屏蔽码这两个字符串输入控件的值分别输入到两个“十进制数字符串至数值转换”函数中,通过函数将它们转换为十六进制字符串;
步骤5:将验收码与屏蔽码这两个字符串输入控件的值或经步骤4转换后的值分别输入到验收码与屏蔽码这两个字符串显示控件中,以获取十六进制格式的验收码与屏蔽码。
6.根据权利要求4所述的一种利用LabVIEW设计MSCAN通讯的方法,其特征在于,利用所述簇变量获取CAN总线发送报文信息的步骤如下:
步骤1:将报文ID、报文长度、报文优先级与报文内容这4个字符串输入控件和1个帧类型枚举型输入控件捆绑成簇变量;
步骤2:通过“按名称解除捆绑”函数读取簇变量的内容,将读取到的报文ID、报文长度、报文优先级与报文内容分别输入到对应的显示控件中以获取它们的值;
步骤3:将读取到的帧类型与一个项为“数据帧”的枚举型常量进行比较,以判断用户是否选择发送数据帧,若是,则选择发送数据帧,若否,则选择发送远程帧。
7.根据权利要求1所述的一种利用LabVIEW设计MSCAN通讯的方法,其特征在于,所述程序框图的设计包括设计主vi函数;
所述主vi函数的步骤如下:
步骤1:判断前面板中的“生成代码”按钮是否被按下,若是则进入步骤2;
步骤2:检测某路径下的“自动代码”文件夹是否存在,若否,则在该路径中新建名为“自动代码”的文件夹,然后进入步骤3,若是,则直接进入步骤3;
步骤3:在“自动代码”文件夹中创建名为“完整代码”的文本文件;
步骤4:在“完整代码”文件中写入包含头文件的C代码;
步骤5:在“完整代码”文件中写入滤波器设置C代码;
步骤6:在“完整代码”文件中写入结构体声明C代码;
步骤7:在“完整代码”文件中写入主函数C代码;
步骤8:在“完整代码”文件中写入CAN初始化子函数C代码;
步骤9:在“完整代码”文件中写入CAN发送子函数C代码;
步骤10:在“完整代码”文件中写入CAN接收子函数C代码;
步骤11:在“完整代码”文件中写入延时子函数C代码;
步骤12:判断前面板中接收中断枚举型输入控件的项是否选择“使能”,若是,则在“完整代码”文件中写入接收中断子函数C代码,然后进入步骤13,若否,则直接进入步骤13;
步骤13:判断前面板中CAN模块枚举型输入控件的项是否选择“CAN0”,若是,则进入步骤14,若否,则进入步骤23;
步骤14:将字符串“CAN”和CAN模块控件的值连接成字符串作为“替换字符串”;
步骤15:打开“自动代码”文件夹的各文本文件;
步骤16:读取各文件的内容;
步骤17:搜索各文本文件中的“CAN0”字符串;
步骤18:将所有的“CAN0”字符串替换为“替换字符串”;
步骤19:替换结果保存到相应的显示控件中;
步骤20:删除“自动代码”文件夹的各文本文件;
步骤21:在原路径重新创建各文本文件;
步骤22:将相应的显示控件值写入到各文本文件;
步骤23:判断前面板中的“退出”按钮是否被按下,若是,则进入步骤24,若否,则进入步骤1;
步骤24:输出提示例如“谢谢使用!”;
步骤25:退出软件。
8.根据权利要求1所述的一种利用LabVIEW设计MSCAN通讯的方法,其特征在于,所述程序框图的设计还包括设计若干子vi函数;
其中,滤波器设置的子vi函数设计方法如下:
步骤1:将滤波器设置簇变量用“按名称解除捆绑”函数解除簇捆绑,读取簇变量中包含的验收码、屏蔽码和输入格式的内容;
步骤2:将读取到的输入格式的内容与一个项为“十进制”的枚举型常量进行“等于”比较,以判断用户的输入格式为是否为十进制,若是,则进入步骤3,若否,则直接进入步骤4;
步骤3:将验收码与屏蔽码这两个字符串输入控件的值分别输入到两个“十进制数字符串至数值转换”函数中,通过函数将它们转换为十六进制字符串;
步骤4:将验收码与屏蔽码这两个字符串输入控件的值或经步骤3转换后的值分别输入到验收码与屏蔽码这两个字符串显示控件中,以获取十六进制格式的验收码与屏蔽码;
步骤5:用一个“连接字符串”函数将C代码、验收码和屏蔽码按C语言的格式连接起来,连接的字符串保存到一个名为“滤波器代码”的字符串显示控件当中;
步骤6:通过“滤波器代码”字符串显示控件输出滤波器设置的C代码;
波特率设置的子vi函数设计方法如下:
步骤1:CAN时钟源和晶振频率枚举型输入控件的项,将这两个枚举型输入控件分别跟相应的枚举型常量进行“等于”比较,以获取用户对CAN时钟源和晶振频率的选择;
步骤2:若CAN时钟频率为8MHz则进入步骤3,若CAN时钟频率为16MHz则进入步骤4,若CAN时钟频率为32MHz则进入步骤5;
步骤3:将波特率枚举型输入控件的项与相应的枚举型常量进行“等于”比较,以获取用户对波特率的选择,根据用户对波特率的选择,计算出预分频数、时间段1和时间段2的值,进而获取MSCAN模块的CAN0BTR0_BRP和CAN0BTR1寄存器的值,如果用户选择的波特率不在设定范围内,则输出提示“警告:CAN时钟频率低,不能达到该波特率设置要求!”,根据设定的范围用C代码指令配置寄存器的值,并以字符串的形式输出给名为“波特率代码”的字符串显示控件,然后进入步骤6;
步骤4:将波特率枚举型输入控件的项与相应的枚举型常量进行“等于”比较,以获取用户对波特率的选择,根据用户对波特率的选择,计算出预分频数、时间段1和时间段2的值,进而获取MSCAN模块的CAN0BTR0_BRP和CAN0BTR1寄存器的值,如果用户选择的波特率不在设定的范围内,则输出提示“警告:CAN时钟频率高,不能达到该波特率设置要求!”,根据设定范围用C代码指令配置寄存器的值,并以字符串的形式输出给名为“波特率代码”的字符串显示控件,然后进入步骤6;
步骤5:将波特率枚举型输入控件的项与相应的枚举型常量进行“等于”比较,以获取用户对波特率的选择,根据用户对波特率的选择,计算出预分频数、时间段1和时间段2的值,进而获取MSCAN模块的CAN0BTR0_BRP和CAN0BTR1寄存器的值,如果用户选择的波特率不在设定的范围内,则输出提示“警告:CAN时钟频率高,不能达到该波特率设置要求!”,根据设定的范围用C代码指令配置寄存器的值,并以字符串的形式输出给名为“波特率代码”的字符串显示控件,然后进入步骤6;
步骤6:将“波特率代码”字符串显示控件的值作为该函数的输出;
can初始化函数的子vi函数设计如下:
步骤1:在“自动代码”文件夹中创建或覆盖名为“can初始化函数”的文本文件;
步骤2:在“can初始化函数”文件中写入MSCAN进入初始化模式的C代码指令;
步骤3:直接将同步跳转宽度枚举型输入控件的值输入到“数值至十进制数字符串转换”函数中,以获取字符型的同步跳转宽度设置值,并将该值与C代码连接,最后获取同步跳转宽度设置的指令代码字符串,将该字符串写入“can初始化函数”文件中;
步骤4:将晶振频率、CAN时钟源和波特率枚举型输入控件的值输入到波特率设置子vi函数中,波特率设置子vi函数的输出写入到“can初始化函数”文件中;
步骤5:直接将采样数量枚举型输入控件的值输入到“数值至十进制数字符串转换”函数中,以获取字符型的采样数量设置值,并将该值与C代码连接,最后获取采样数量设置的指令代码字符串,将该字符串写入“can初始化函数”文件中;
步骤6:将CAN时钟源枚举型输入控件与项为“晶振时钟”的枚举型常量作“等于”比较,以判断用户是否选择晶振时钟作为CAN时钟源,若是,则将选择晶振时钟作为CAN时钟源的C语言代码写入“can初始化函数”文件中,若否,则将选择总线时钟作为CAN时钟源的C语言代码写入“can初始化函数”文件中;
步骤7:将标识符类型枚举型输入控件与项为“扩展标识符”的枚举型常量作“等于”比较,以判断用户是否选择扩展标识符作为标识符类型,若是,则按MSCAN扩展标识符写入验收码和屏蔽码的要求将C代码写入“can初始化函数”文件中,若否,则按MSCAN标准标识符写入验收码和屏蔽码的要求将C代码写入“can初始化函数”文件中;
步骤8:在“can初始化函数”文件中写入MSCAN退出初始化模式、等待退出初始化模式完成和等待时钟同步的C代码指令;
步骤9:将接收中断枚举型输入控件与项为“使能”的枚举型常量作“等于”比较,以判断用户是否使能接收中断,若是,则将使能接收中断的C代码写入“can初始化函数”文件中,若否,则将禁止接收中断的C代码写入“can初始化函数”文件中;
步骤10:关闭文件;
步骤11:重新打开“can初始化函数”文件,并读取文件的内容,将文件的内容保存到一个名为“can初始化函数”的字符串显示控件中,并将该显示控件的值作为函数的输出;
can发送函数的子vi函数设计如下:
步骤1:在“自动代码”文件夹中创建或覆盖名为“can发送函数”的文本文件;
步骤2:在“can发送函数”文件中写入MSCAN等待时钟同步和寻找可用缓冲器的C代码指令;
步骤3:将标识符类型枚举型输入控件的值与一个项为“扩展标识符”的枚举型常量进行“等于”比较,以判断用户是否选择扩展标识符作为标识符类型,若是,则进入步骤4,若否,则进入步骤5;
步骤4:按选择发送扩展标识符时,标识符发送寄存器写入报文ID的要求,将代码写入“can发送函数”文件中,同时,将发送帧类型代码、发送数据代码、发送数据长度代码、发送优先级代码和报文准备发送代码写入“can发送函数”文件中,然后进入步骤6;
步骤5:按选择发送标准标识符时,标识符发送寄存器写入报文ID的要求,将代码写入“can发送函数”文件中,同时,将发送帧类型代码、发送数据代码、发送数据长度代码、发送优先级代码和清除TXE标志的C代码写入“can发送函数”文件中,然后进入步骤6;
步骤6:关闭文件;
步骤7:重新打开“can发送函数”文件,并读取文件的内容,将文件的内容保存到一个名为“can发送函数”的字符串显示控件中,并将该显示控件的值作为函数的输出;
can接收函数子vi函数设计如下:
步骤1:将标识符类型枚举型输入控件的值与一个项为“扩展标识符”的枚举型常量进行“等于”比较,以判断用户是否选择扩展标识符作为标识符类型,若是,则进入步骤2,若否,则进入步骤3;
步骤2:写入接收RTR位、接收数据长度、接收数据、接收扩展标识符和清除RXE标志的C代码,然后进入步骤4;
步骤3:写入接收RTR位、接收数据长度、接收数据、接收标准标识符和清除RXE标志的C代码,然后进入步骤4;
步骤4:将步骤3或步骤4的C代码保存到一个名为“can接收函数”的字符串显示控件中,并将该显示控件的值作为函数的输出;
步骤5:在“自动代码”文件夹中创建或覆盖名为“can接收函数”的文本文件,然后将步骤3或步骤4的C代码写入到该文件中;
步骤6:关闭文件;
延时函数的子vi函数设计方法如下:
步骤1:在“自动代码”文件夹中创建或覆盖名为“延时函数”的文本文件;
步骤2:将延时函数的C代码保存到一个名为“延时函数”的字符串显示控件当中,并将该显示控件的值作为函数的输出;
步骤3:将延时函数的C代码写入到“延时函数”文件中;
步骤4:关闭文件;
can接收中断函数的子vi函数设计方法如下:
步骤1:将CAN0接收中断函数的C代码保存到一个名为“can接收中断函数”的字符串显示控件中;
步骤2:将CAN模块枚举型输入控件的值与一个项为“CAN1”的枚举型常量进行“等于”比较,以判断用户是否需要生成CAN1模块的can接收中断函数,若是,则利用“搜索替换字符串”函数将步骤1保存的“can接收中断函数”控件中的字符串“38”替换为字符串“42”,字符串“CAN0”替换为“CAN1”,替换后的结果仍保存到步骤1的“can接收中断函数”控件中;
步骤3:将CAN模块枚举型输入控件的值与一个项为“CAN2”的枚举型常量进行“等于”比较,以判断用户是否需要生成CAN2模块的can接收中断函数,若是,则利用“搜索替换字符串”函数将步骤1保存的“can接收中断函数”控件中的字符串“38”替换为字符串“46”,字符串“CAN0”替换为“CAN2”,替换后的结果仍保存到步骤1的“can接收中断函数”控件中;
步骤4:将CAN模块枚举型输入控件的值与一个项为“CAN3”的枚举型常量进行“等于”比较,以判断用户是否需要生成CAN1模块的can接收中断函数,若是,则利用“搜索替换字符串”函数将步骤1保存的“can接收中断函数”控件中的字符串“38”替换为字符串“50”,字符串“CAN0”替换为“CAN3”,替换后的结果仍保存到步骤1的“can接收中断函数”控件中;
步骤5:将CAN模块枚举型输入控件的值与一个项为“CAN4”的枚举型常量进行“等于”比较,以判断用户是否需要生成CAN1模块的can接收中断函数,若是,则利用“搜索替换字符串”函数将步骤1保存的“can接收中断函数”控件中的字符串“38”替换为字符串“54”,字符串“CAN0”替换为“CAN4”,替换后的结果仍保存到步骤1的“can接收中断函数”控件中;
步骤6:在“自动代码”文件夹中创建或覆盖名为“can接收中断函数”的文本文件,将“can接收中断函数”控件的值写入“can接收中断函数”文件,并将控件的值作为函数的输出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911344001.7A CN111158662B (zh) | 2019-12-24 | 2019-12-24 | 一种利用LabVIEW设计MSCAN通讯的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201911344001.7A CN111158662B (zh) | 2019-12-24 | 2019-12-24 | 一种利用LabVIEW设计MSCAN通讯的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111158662A true CN111158662A (zh) | 2020-05-15 |
CN111158662B CN111158662B (zh) | 2023-05-05 |
Family
ID=70557886
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201911344001.7A Active CN111158662B (zh) | 2019-12-24 | 2019-12-24 | 一种利用LabVIEW设计MSCAN通讯的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111158662B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112468388A (zh) * | 2020-11-30 | 2021-03-09 | 江苏极鼎网络科技有限公司 | 一种即时通讯系统 |
CN116165352A (zh) * | 2023-04-23 | 2023-05-26 | 河北华清环境科技集团股份有限公司 | 烟气在线监测仪质控系统 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7159183B1 (en) * | 1999-08-19 | 2007-01-02 | National Instruments Corporation | System and method for programmatically creating a graphical program |
CN102385509A (zh) * | 2010-08-31 | 2012-03-21 | 苏州大学 | 一种图形化嵌入式开发方法和平台 |
CN106528198A (zh) * | 2016-09-29 | 2017-03-22 | 陕西法士特齿轮有限责任公司 | 一种用于汽车电控单元的程序下载系统及方法 |
-
2019
- 2019-12-24 CN CN201911344001.7A patent/CN111158662B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7159183B1 (en) * | 1999-08-19 | 2007-01-02 | National Instruments Corporation | System and method for programmatically creating a graphical program |
CN102385509A (zh) * | 2010-08-31 | 2012-03-21 | 苏州大学 | 一种图形化嵌入式开发方法和平台 |
CN106528198A (zh) * | 2016-09-29 | 2017-03-22 | 陕西法士特齿轮有限责任公司 | 一种用于汽车电控单元的程序下载系统及方法 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112468388A (zh) * | 2020-11-30 | 2021-03-09 | 江苏极鼎网络科技有限公司 | 一种即时通讯系统 |
CN116165352A (zh) * | 2023-04-23 | 2023-05-26 | 河北华清环境科技集团股份有限公司 | 烟气在线监测仪质控系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111158662B (zh) | 2023-05-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101551747B (zh) | Arm系列微处理器的软件体系架构工具 | |
CN111158662B (zh) | 一种利用LabVIEW设计MSCAN通讯的方法 | |
CN104461503B (zh) | 动态组成软件界面的方法与系统 | |
CN104102510B (zh) | 一种用于iec61850网络处理器芯片的集成配置系统 | |
US20070157132A1 (en) | Process of automatically translating a high level programming language into a hardware description language | |
US10762265B1 (en) | Heterogeneous instantiation of high-level language callable library for hardware core | |
CN108153522B (zh) | 基于模型转换由midcore生成Spark和Hadoop程序代码的方法 | |
CN114460925B (zh) | 一种电动汽车控制器can接口hil自动化测试方法 | |
CN101373406A (zh) | 带扩展功能的输入方法及其系统 | |
CN112860256A (zh) | 一种Linux内核设备树的可视化配置系统和方法 | |
CN111267111B (zh) | 一种机器人控制方法、装置及系统 | |
CN103593188A (zh) | 一种用于仪器所见即所得菜单的管理系统及管理方法 | |
Bunker et al. | Formal hardware specification languages for protocol compliance verification | |
CN201548951U (zh) | 一种机顶盒界面的模拟装置 | |
CN108062223A (zh) | 一种Simulink模型之间建立连接关系的方法及装置 | |
CN113407214B (zh) | 一种基于can通信的可重构化多线程并行上位机系统 | |
CN112559264B (zh) | 基于uvm的验证平台实现fpga通用串口的仿真测试方法 | |
CN113687814A (zh) | 基于autosar架构的模型框架和接口文件的自动化实现方法 | |
CN112905450A (zh) | 基于模板变量替换的芯片寄存器自动开发系统 | |
Irfansyah | Design And Implementation of UART With FIFO Buffer Using VHDL On FPGA | |
CN109542698A (zh) | 一种基于变异测试的虚拟原型错误检测方法 | |
Mu et al. | Design and implementation of gui automated testing framework based on xml | |
CN103530122B (zh) | 一种基于图形界面的可编程仪器标准命令生成方法 | |
CN116820426A (zh) | 一种基于Simulink的接口生成方法、系统及汽车 | |
CN113064585B (zh) | 一种基于json模式的实时报文接口自动生成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |