LabVIEW字符串正常显示与十六进制显示相互强制转换
[Labview经验] LabVIEW字符串正常显示与十六进制
显示相互强制转换
在串口通信中,由于实际上传输的是ASCII码,但是一般字符串控件显示出来的并不是其对应的ASCII码,关于字符串正常显示和十六进制显示,LabVIEW帮助文档里面是这么写的:
正常显示---------可打印字符以控件字体显示。
不可显示字符通常显示为一个小方框。
十六进制显示---每个字符显示为其十六进制的ASCII值,字符本身并不显示。
比方说对于01这个字符串,如果是正常显示情况下输入01,下位机接收的是其对应的ASCII 码而不是01本身;如果是十六进制显示情况下输入01,下位机接收的是十六进制的01。
上位机接收下位机发送的字符串同样是ASCII码,一般情况下如果不加转换,在正常显示情况下是乱码,在使用LabVIEW在编程处理直接处理这些字符串的时候,就会出现问题了。
于是很多时候需要对字符串正常显示和十六进制显示做一个强制转换,以方便处理。
正常显示至十六进制显示强制转换,一般用于VISA Write:
需要注意的是,在输入端Normal Display String输入的时候要确保字符是以两位的格式输入,比如需要输入1,格式要为01,否则会出错。
十六进制显示至正常显示强制转换,一般用于VISA Read:
经过这样的强制转换之后再进行处理就很方便了转载自:CSDN,作者kyletan。
LabVIEW串口发送数据_KC10121806_c01(精)
1
LabVIEW串口通信
2
目录
CONTENTS
1
串口通信概念
2
串口通信参数配置
3
虚拟串口软件
4
串口调试软件与MAX配置
5
串口数据类型转换
6
LabVIEW串口发送数据
7
LabVIEW串口接收数据
*
3
LabVIEW串口发送数据
4
LabVIEW串口通信
LabVIEW串口发送数据
• ASCII码发送数据 • 十六进制发送数据
5
VISA串口写入
“VISA写入” 函数
使写入缓冲区的数据写入VISA资源名称指定的设备或接口。
串口 发送
写入缓冲区的数据为字符串类型,有两种形式:ASCII码、字节。 ASCII码:若发送的字符串以正常形式显示,则发送字符串的ASCII码,串口通信为ASCII字符串方式; 字节:若发送的字符串以HEX方式显示的字节,则发送的字符串为字节,多用于直接传输十六进制数字。
8
ASCII码发送数据
写入十进ห้องสมุดไป่ตู้整型数据 2
ASCII 码
发送十进制整形数据(I32)时,使用“数值至十进制转换”函数,将其转换成字符 串(48),此时写入缓冲区数据ASCII码(52,56),对应显示字符串为“48”。
9
写入十六进制数据
十六进制发送数据
十六 进制
发送十六进制制整形数据时,使用“强制类型转换”函数,将其转换成字符串,写 入数据缓冲区。
6
ASCII码发送数据
写入字符串数据类型
ASCII 码
发送或接收字符串,则发送或接收字符串的ASCII码,以字符串形式显示。 7
LabVIEW编程经验若干则
最近在编写程序时遇到一个错误,检查了很久,终于发现了原因,为了下次不再犯同样的错误,将这个现象记录下来,大家可以引以为戒。
大家都知道,数据类型有整型和浮点型。
在串口或者是USB通信中,经常需要将数据强制转换成十六进制数据。
笔者在最初写程序时没有注意数据类型,将十进制数据设置成双精度实数,强制转换后一直得不到想要的结果,后来将其改为无符号16位整型,结果是正确的。
经过对比发现,双精度实数和无符号16位整型,即使十进制数值相等,强制转换成十六进制后结果相差很大,如图所示。
在labview中,事件结构是一个比较具有特色的一个结构,使用事件结构能够非常容易地实现其他程序运行结构不能实现的功能。
一些labview的参考书告诉学习的人一般事件结构外面要套一个while循环,可是有的时候会发生这样一种情况:在事件结构外面套上while循环后发现点击控制while循环的“退出”按钮没有用。
使用事件结构时,不要忽略事件结构左上角的连线端子。
这个是“超时接线端”,是指事件结构等待事件发生的时间,以毫秒为单位,默认值为–1。
如果while循环里的事件结构没有设置超时接线端,那么系统就默认为-1,事件结构一直等待事件的发生。
这个时候程序就停止在等待事件发生,另外的操作都没有用。
所以如果想要通过控制while循环的结束来停止程序,可行的做法是:设置超时时间,如10ms,然后增加一个“超时”的事件分支。
labview中,在字符串控件上单击鼠标右键,会发现有几种显示方式:正常显示、/代码显示、密码显示和十六进制显示。
正常显示和密码显示容易理解,在这里不作解释。
笔者就用labview通过串口和USB与下位机通信时得到的一点心得与大家分享。
用串口或USB和上位机进行通信时传输的都是二进制代码,因此上位机也要将二进制数发送给串口或者是USB。
在labview中,如果将输入控件表示成正常显示,将显示控件表示成十六进制显示,当输入A时,显示的是A对应的ASCII码:41。
LabVIEW串口通信解析
LabVIEW串口通信详解串口可以说是我们最容易见到,也最容易接触到的一种总线,台式机上一般都有二个,而现在很多下位机、仪器等很多都还是使用串口通信的。
论坛上很多朋友都经常会使用到串口,并遇到一些问题,这里有必要做一个详细的说明,以方便广大会员朋友,文章请勿转载到其它地方,谢谢。
论坛上早先发布过一个贴子,叫《串口WORD资料》,里面有一些中英文的串口的资料,这个文章是对那个资料的补充,如果是初接触串口的朋友建议先看一下上一个贴子先。
上一个贴子中提到过的内容这里不再进行补充。
首先补充一个比较重要的问题,就是在LabVIEW中使用串口的话一定要先安装VISA这个驱动,然后生成的EXE运行时也需要在目标机上安装VISA Runtime Engine,可以在打包时一起打包。
VISA的驱动可以在NI网站上下载到:/nidu/cds/view/p/id/1605/lang/zhs1,串口扩展的问题先说一下串口的扩展问题,一般的台式机或工控机上都至少有二个串口,一般都是够用的,但是现在市场上已经很难找到带串口的笔记本了,而有时候在外出调试时需要在笔记本中使用到串口的,这时一般是使用USB-RS232的转接线,价格从十几到一百多都有,很多朋友反应在使用价格低的转接线时会出现乱七八糟的问题,而贵一点的线就很少听说有其它问题的,所以大家在使用便宜的USB-RS232转接线时要特别注意线的质量,遇到一些奇怪的问题时先考虑换一根好一点的线。
PCI-RS232扩展卡也同理,便宜的卡也容易出问题,尽量买好一点的,以免因小失大。
PCI-RS232一般至少能扩展2个串口,有些BT一点的可以扩展到8-16个,一堆线和接头。
转接线和扩展卡一般是要装驱动的。
2,串口功能的确认在使用串口之前,最好先确认一下串口是否正常,特别是使用转换接或扩展卡的。
检查的方法很简单,就是将串口的2、3脚短接起来,脚是发送数据,2脚接收数据,就是这个串口自发自收。
labview中 我现在在做一个上位机对串口发送 ASCII码和十六
在LabVIEW中使用串口第一部分使用LabVIEW系统VI一、串口VI介绍LabVIEW的串口通讯VI位于Instrument I/O Platte的Serial中,包括:VI名称 VI功能VISA Configure SerialPort初始化VISA resource name指定的串口通讯参数 VISA Write 将输出缓冲区中的数据发送到VISA resource name指定的串口VISA Read 将VISA resource name指定的串口接收缓冲区中的数据读取指定字节数的数据到计算机内存中VISA Serial Break 向VISA resource name指定的串口发送一个暂停信号VISA Bytes at SerialPort查询VISA resource name指定的串口接收缓冲区中的数据字节数 VISA Close 结束与VISA resource name指定的串口资源之间的会话VISA Set I/O BufferSize设置VISA resource name指定的串口的输入输出缓冲区大小VISA Flush I/O Buffer 清空VISA resource name指定的串口的输入输出缓冲区二、使用说明在LabVIEW环境中使用串口与在其它开发环境中开发过程类似,基本的流程框图如下。
图1、串口操作数据流图首先需要调用VISA Configure Serial Port完成串口参数的设置,包括串口资源分配、波特率、数据位、停止位、校验位和流控等等。
图2、初始化串口如果初始化没有问题,就可以使用这个串口进行数据收发。
发送数据使用VISA Write,接收数据使用VISA Read。
在接收数据之前需要使用VISA Bytes at Serial Port查询当前串口接收缓冲区中的数据字节数,如果VISA Read要读取的字节数大于缓冲区中的数据字节数,VISA Read操作将一直等待,直至Timeout或者缓冲区中的数据字节数达到要求的字节数。
labview强制转换数组转数值原理
labview强制转换数组转数值原理引言在L ab VI EW编程中,经常需要对数组进行转换和操作。
其中,强制转换数组为数值是一项常见的操作。
本文将介绍La bV IE W中的强制转换数组为数值的原理及应用。
目录1.数组和数值之间的关系2.强制转换数组为数值的原理3.实际应用案例4.总结数组和数值之间的关系在L ab VI EW中,数组是一种数据结构,它可以存储多个相同类型的数据元素。
而数值则是单个数据元素。
数组和数值之间存在着密切的关系,通过对数组进行一系列操作,可以提取或转换为数值。
强制转换数组为数值的原理在L ab VI EW中,强制转换数组为数值的原理主要包括以下几个步骤:1.首先,定义一个数组,该数组中包含多个数值元素。
2.使用La bV IE W内置的数组操作函数,例如"I nd ex Ar ra y"或"A rr ay to Sp re ad she e tS tr in g"等,来提取数组中的数值元素。
3.将提取到的数值元素进行必要的数据类型转换,例如将字符串类型的数值转换为数值类型。
4.最后,将转换后的数值元素用于进一步的计算或显示。
实际应用案例假设有一个温度监测系统,该系统可以通过多个温度传感器获取温度值,并将这些温度值存储在一个数组中。
我们需要将这个温度数组中的数据转换为数值,并计算平均温度值。
以下是实现该功能的L ab VI EW程序示例://强制转换数组为数值1.创建一个包含多个温度值的数组。
2.使用“循环”结构遍历数组中的每个元素。
3.在循环内部,使用“In de xA rr ay”函数提取数组中的数值元素。
4.将提取到的数值元素转换为数值类型。
5.使用“累加器”功能计算累加温度值。
6.使用“计数器”功能统计温度值个数。
7.在循环结束后,使用“除法”运算符计算平均温度值。
8.将平均温度值显示在前面的面板上。
通过以上步骤,我们成功地实现了将数组中的温度值转换为数值,并计算出平均温度值的功能。
labview中我现在在做一个上位机对串口发送ASCII码和十六
labview中我现在在做一个上位机对串口发送ASCII码和十六在LabVIEW中使用串口第一部分使用LabVIEW系统VI一、串口VI介绍LabVIEW的串口通讯VI位于Instrument I/O Platte的Serial中,包括:VI名称 VI功能VISA Configure SerialPort初始化VISA resource name指定的串口通讯参数 VISA Write 将输出缓冲区中的数据发送到VISA resource name指定的串口VISA Read 将VISA resource name指定的串口接收缓冲区中的数据读取指定字节数的数据到计算机内存中VISA Serial Break 向VISA resource name指定的串口发送一个暂停信号VISA Bytes at SerialPort查询VISA resource name指定的串口接收缓冲区中的数据字节数 VISA Close 结束与VISA resource name指定的串口资源之间的会话VISA Set I/O BufferSize设置VISA resource name指定的串口的输入输出缓冲区大小VISA Flush I/O Buffer 清空VISA resource name指定的串口的输入输出缓冲区二、使用说明在LabVIEW环境中使用串口与在其它开发环境中开发过程类似,基本的流程框图如下。
图1、串口操作数据流图首先需要调用VISA Configure Serial Port完成串口参数的设置,包括串口资源分配、波特率、数据位、停止位、校验位和流控等等。
图2、初始化串口如果初始化没有问题,就可以使用这个串口进行数据收发。
发送数据使用VISA Write,接收数据使用VISA Read。
在接收数据之前需要使用VISA Bytes at Serial Port查询当前串口接收缓冲区中的数据字节数,如果VISA Read要读取的字节数大于缓冲区中的数据字节数,VISA Read操作将一直等待,直至Timeout或者缓冲区中的数据字节数达到要求的字节数。
labview 条件结构 条件字符串16进制
labview 条件结构条件字符串16进制
在 LabVIEW 中,你可以使用条件结构 (Case Structure) 来根据不同的条件执行不同的代码块。
然而,直接使用字符串来表示十六进制数值在LabVIEW 中可能并不直观。
如果你想在条件结构中根据一个十六进制字符串的值来执行不同的操作,你可能需要先将这个字符串转换成数值,然后再使用这个数值作为条件。
以下是一个简单的示例,展示了如何在 LabVIEW 中实现这个过程:
1. 将十六进制字符串转换为数值:你可以使用 `Parse` 函数将十六进制字符串转换为数值。
例如,你可以使用 `Parse to decimal` 函数将十六进制字符串转换为十进制数。
2. 使用条件结构:接下来,你可以使用条件结构来根据这个数值执行不同的操作。
以下是一个简单的 LabVIEW 代码示例:
```labview
// 假设 hexString 是你的十六进制字符串
// 使用 Parse to decimal 函数将十六进制字符串转换为十进制数decimalValue = Parse to decimal(hexString);
// 使用条件结构根据 decimalValue 的值执行不同的操作
case structure
decimalValue == 0: // 执行某些操作
decimalValue == 1: // 执行其他操作
...
end case structure
```
请注意,这只是一个基本的示例。
你可能需要根据你的具体需求来调整代码。
LabVIEW前面板控件介绍
前面板控件位于前面板控件选板上的输入控件和显示控件可用于创建前面板。
控件的种类有:数值控件(如滑动杆和旋钮)、图形、图表、布尔控件(如按钮和开关)、字符串、路径、数组、簇、列表框、树形控件、表格、下拉列表控件、枚举控件和容器控件等等。
控件样式前面板控件有新式、经典和系统三种样式。
选择文件»VI属性,从类别列表中选择编辑器选项改变控件的样式。
然后右键单击接线端,从快捷菜单中选择创建»输入控件或创建»显示控件,创建出的控件的样式就会产生相应的改变。
选择工具»选项,从类别列表中选择前面板,可改变控件样式。
此后,如通过右键单击接线端再从快捷菜单中选择创建»输入控件或创建»显示控件而创建控件时,新建控件的样式就会产生相应的改变。
注:不能自定义对话框旋转控件、滑动杆控件、进度条或滚动条的外观,因为这些控件使用的是平台专用的绘制函数,不支持自定义。
也不能使用属性节点和调用节点自定义这些控件的外观。
新式及经典控件许多前面板对象具有高彩外观。
为了获取对象的最佳外观,显示器最低应设置为16色位。
位于新式面板上的控件也有相应的低彩对象。
经典选板上的控件适于创建在256色和16色显示器上显示的VI。
系统控件位于系统选板上的系统控件可用在用户创建的对话框中。
系统控件专为在对话框中使用而特别设计,包括下拉列表和旋转控件、数值滑动杆、进度条、滚动条、列表框、表格、字符串和路径控件、选项卡控件、树形控件、按钮、复选框、单选按钮和自动匹配父对象背景色的不透明标签。
这些控件仅在外观上与前面板控件不同,颜色与系统设置的颜色一致。
系统控件的外观取决于VI运行的平台,因此在VI中创建的控件外观应与所有LabVIEW平台兼容。
在不同的平台上运行VI时,系统控件将改变其颜色和外观,与该平台的标准对话框控件相匹配。
在LabVIEW的不同选板中可找到相似的控件。
例如,系统选板上的取消按钮与布尔选板上的取消按钮相似。
字符串和16进制字符串的相互转化
我们在工作中,有时候会需要将字符串转化为16进制字符串给用户,因为ASCII中有些字符,当我们使用printf("%s",p_ch);输出时会杂乱无章,如果采用16进制,会好很多。
因此编写程序,代码如下:1.#include <stdio.h>2.#include <string.h>3.4.int strToHex(char *ch, char *hex);5.int hexToStr(char *hex, char *ch);6.int hexCharToValue(const char ch);7.char valueToHexCh(const int value);8.int main(int argc, char *argv[])9.{10. char ch[1024];11. char hex[1024];12. char result[1024];13. char *p_ch = ch;14. char *p_hex =hex;15. char *p_result = result;16. printf("please input the string:");17. scanf("%s",p_ch);18.19. strToHex(p_ch,p_hex);20. printf("the hex is:%s\n",p_hex);21. hexToStr(p_hex, p_result);22. printf("the string is:%s\n", p_result);23. return 0;24.}25.26.int strToHex(char *ch, char *hex)27.{28.int high,low;29.int tmp = 0;30.if(ch ==NULL||hex==NULL){31. return -1;32.}33.34.if(strlen(ch)== 0){35. return -2;36.}38.while(*ch){39. tmp =(int)*ch;40. high = tmp >> 4;41. low = tmp & 15;42.*hex++= valueToHexCh(high);//先写高字节43.*hex++= valueToHexCh(low);//其次写低字节44. ch++;45.}46.*hex='\0';47. return 0;48.}49.50.int hexToStr(char *hex, char *ch)51.{52.int high,low;53.int tmp = 0;54.if(hex==NULL|| ch ==NULL){55. return -1;56.}57.58.if(strlen(hex)%2 == 1){59. return -2;60.}61.62.while(*hex){63. high = hexCharToValue(*hex);64.if(high < 0){65.*ch ='\0';66. return -3;67.}68.hex++;//指针移动到下一个字符上69. low = hexCharToValue(*hex);70.if(low < 0){71.*ch ='\0';72. return -3;73.}74. tmp =(high << 4)+ low;75.*ch++=(char)tmp;76.hex++;77.}78.*ch ='\0';79. return 0;80.}82.int hexCharToValue(const char ch){83.int result = 0;84.//获取16进制的高字节位数据85.if(ch >='0'&& ch <='9'){86. result =(int)(ch -'0');87.}88.else if(ch >='a'&& ch <='z'){89. result =(int)(ch -'a')+ 10;90.}91.else if(ch >='A'&& ch <='Z'){92. result =(int)(ch -'A')+ 10;93.}94.else{95. result =-1;96.}97. return result;98.}99.100.char valueToHexCh(const int value)101.{102. char result ='\0';103.if(value >= 0 && value <= 9){104. result =(char)(value + 48);//48为ascii编码的‘0’字符编码值105.}106.else if(value >= 10 && value <= 15){107. result =(char)(value - 10 + 65);//减去10则找出其在16进制的偏移量,65为ascii的'A'的字符编码值108.}109.else{110.;111.}112.113. return result;。
Java中16进制与字符串之间的相互转换
Java中16进制与字符串之间的相互转换笔者前⼏⽇在开服过程中需要将字符串转化成为16进制的字符串,在⽹上找到了⼀些⽅法尝试之后,均发现存在⼀个问题-->字符串转为16进制后再转回来,英⽂正常,中⽂出现乱码经过考虑决定通过以下⽅式进⾏解决: 1)在将字符串转为16进制之前先进⾏⼀次转化,先将其转化成为Unicode编码(相当于把中⽂⽤英⽂字符代替),在转化成为16进制 2)相反的,在⼗六进制转换为字符串后的得到的是Unicode编码,此时再将Unicode编码解码即可获取原始字符串代码如下: *字符串转化为Unicode编码:/*** 字符串转换unicode*/public static String string2Unicode(String string) { StringBuffer unicode = new StringBuffer(); for (int i = 0; i < string.length(); i++) { // 取出每⼀个字符char c = string.charAt(i);// 转换为unicodeunicode.append("\\u" + Integer.toHexString(c)); } return unicode.toString();}*字符串转为16进制/*** 字符串转化成为16进制字符串* @param s* @return*/public static String strTo16(String s) {String str = "";for (int i = 0; i < s.length(); i++) {int ch = (int) s.charAt(i);String s4 = Integer.toHexString(ch);str = str + s4;}return str;}*16进制转为字符串/*** 16进制转换成为string类型字符串* @param s* @return*/public static String hexStringToString(String s) {if (s == null || s.equals("")) {return null;}s = s.replace(" ", "");byte[] baKeyword = new byte[s.length() / 2];for (int i = 0; i < baKeyword.length; i++) {try {baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));} catch (Exception e) {e.printStackTrace();}}try {s = new String(baKeyword, "UTF-8");new String();} catch (Exception e1) {e1.printStackTrace();}return s;}*Unicode转为字符串/*** unicode 转字符串*/public static String unicode2String(String unicode) {StringBuffer string = new StringBuffer();String[] hex = unicode.split("\\\\u");for (int i = 1; i < hex.length; i++) {// 转换出每⼀个代码点int data = Integer.parseInt(hex[i], 16);// 追加成stringstring.append((char) data);}return string.toString();}此⽅法虽然解决了转化过程中中⽂乱码的问题,但是过于复杂,笔者后来⼜发现⼀种新的转化⽅式,可直接转化,中⽂不乱码,代码如下: *字符串转16进制1/**2 * 字符串转换成为16进制(⽆需Unicode编码)3 * @param str4 * @return5*/6public static String str2HexStr(String str) {7char[] chars = "0123456789ABCDEF".toCharArray();8 StringBuilder sb = new StringBuilder("");9byte[] bs = str.getBytes();10int bit;11for (int i = 0; i < bs.length; i++) {12 bit = (bs[i] & 0x0f0) >> 4;13 sb.append(chars[bit]);14 bit = bs[i] & 0x0f;15 sb.append(chars[bit]);16// sb.append(' ');17 }18return sb.toString().trim();19 }*16进制转为字符串1/**2 * 16进制直接转换成为字符串(⽆需Unicode解码)3 * @param hexStr4 * @return5*/6public static String hexStr2Str(String hexStr) {7 String str = "0123456789ABCDEF";8char[] hexs = hexStr.toCharArray();9byte[] bytes = new byte[hexStr.length() / 2];10int n;11for (int i = 0; i < bytes.length; i++) {12 n = str.indexOf(hexs[2 * i]) * 16;13 n += str.indexOf(hexs[2 * i + 1]);14 bytes[i] = (byte) (n & 0xff);15 }16return new String(bytes);17 }。
