用labview做的一个简单的串口接收程序

LabVIEW简单串口接收程序介绍
本文介绍了如何使用LabVIEW创建一个简单的串口接收程序,包括配置虚拟串口、使用XCOM串口调试助手和VISA串口驱动。程序能显示接收到的数据并以波形图展示,详细解析了串口配置、读取和关闭的关键步骤。
部署运行你感兴趣的模型镜像

因为要用labview做一个数据采集,因此才刚刚接触这一方面,就分享出来最基础的用labview接收串口信息。希望能帮助到有需要的人。

已上传一个简单的串口程序(仅实现接收与显示),关注我可免费下载。需要进阶版的(实时数据存储,数据解码显示等)可以联系我。

首先说明一下要使用的工具

1、Configure Virtual Serial Port Driver
这是一个用来虚拟串口的软件,网上非常好找,随便百度一下就可以下载到。使用方便,界面如下
在这里插入图片描述
用来增加两个互联的虚拟串口,使用完记得点底部的delete all来关闭串口。
左边是我已经添加上的两个串口,之后需要用串口助手和自己写的VI程序连上这两个串口来进行调试。

2、XCOM
经常玩嵌入式板子的应该很熟悉这个软件,正点原子提供的串口调试助手。可以实现发送和接收串口的数据。
在这里插入图片描述

3、VISA串口驱动程序
要使用labview里的串口模块必须要下载官方的visa驱动。可以去NI官网去搜索NI-visa下载,但是labview官网下载要点右下角的一个下载离线补丁。下载之前记得看一下自述文件,是不是兼容你labview的版本。如果懒得去官网下也可以戳这里下载离线补丁。如果没有安装visa驱动的话是无法实现串口通讯功能的。

labview程序

如下图
在这里插入图片描述

这就是一个非常基础的简单的用来接收串口的小程序,可以将串口发来的数据展示出来并以波形显示。下面大概介绍一下各个函数及原理。

1、串口配置函数
在这里插入图片描述
这个函数在 仪器IO 》》串口中,要打开一个串口首先就要进行配置,如波特率等。因为这里就做一个简单的接收程序,因此都省略掉了(省略掉不连自动使用默认值)。visa资源名称就是指你的串口号,这个是必须要连接的
2、串口读取函数
在这里插入图片描述
注意黑体字为必须连的端。这个类似于C语言中的read函数。visa资源名称即串口号,有点类似C中的文件句柄,而字节总数为一次接收的字节数。读取缓冲区即存放读取字节的地方,并可以展示。
3、串口关闭函数
在这里插入图片描述
即使用完之后关闭串口,如果使用完不关闭的话,将一直占用该串口,别的程序无法使用该串口, Virtual Serial Port也无法关闭串口。

因为波形图标要无符号数输入,因此做了一个强制类型转换之后把接收到的数据送到波形图表中显示。

在这里插入图片描述
上图这一块的目的是不让新数据将旧的数据覆盖。因为缓冲区每次接收都会清除上一次的数据。因此用上一次的缓冲区的数据和这一次读到的数据用一个连接字符串函数连接。然后在显示出来。

最后打开XCOM然后连接COM2,运用程序连接COM1。从XCOM中发送数据即可从labview中看到收到的数据与波形显示。
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>我们正在处理用户的问题:使用LabVIEW通过串口接收图像。由于串口通信(如RS232)通常用于传输文本或二进制数据,而图像数据量较大,因此我们需要考虑如何将图像数据分块传输,并在接收端重新组合。实现步骤概述:1.发送端(例如单片机、另一个LabVIEW程序)将图像转换为字节数组(可能需要考虑图像格式,如JPEG、PNG或原始像素数据)。2.将字节数组分成适合串口传输的小包(例如每包几十到几百字节,具体取决于串口波特率和硬件缓冲区大小)。3.每个数据包需要添加包头、包序号、校验和(如CRC)等信息,以便接收端能够检测和重组。4.接收端(LabVIEW)循环读取串口缓冲区,根据协议解析数据包,然后重组图像数据。5.将接收到的图像数据转换为LabVIEW可以显示的格式(例如图片控件支持的格式)。由于用户没有指定具体的硬件和图像格式,我们将以灰度图像(单通道)为例,假设发送端发送的是图像的原始像素数据(每个像素一个字节),并且图像大小为固定(例如128x128)。具体LabVIEW实现方法:1.**串口配置**:使用VISA串口函数配置串口(波特率、数据位、停止位、校验位等)。2.**数据包设计**:假设每个数据包包含以下部分:-包头:2字节,例如0xAA55。-包序号:1字节(0~255),表示包的顺序。-数据长度:1字节,表示实际数据长度(因为每包数据长度可能不同,最后一包可能不满)。-数据:最多256字节(但实际中可能更小,比如64字节)。-校验和:1字节(例如所有数据的和取低8位)。3.**接收逻辑**:-状态机:因为接收是连续的,所以需要一个状态机来解析数据包。状态包括:等待包头、接收包头、接收包序号、接收数据长度、接收数据、接收校验和、验证包。-当收到完整的包并验证通过后,将数据放入缓冲区,并准备接收下一包。-直到收到所有包,然后根据包序号重组图像(注意:包序号从0开始,按顺序接收,但需要处理乱序或丢失,此处为了简单,假设按顺序到达且无丢失)。4.**重组图像**:由于图像大小已知(例如128x128=16384字节),我们可以按接收到的数据顺序填充到数组,然后转换为图像。5.**显示图像**:使用“绘制平面像素图”函数或类似的图像显示控件。代码结构(LabVIEW程序框图):-初始化串口。-创建循环,不断读取串口。-状态机解析。-当接收到完整图像后,退出循环或继续接收下一张。注意事项:-串口通信速度较慢,高分辨率图像传输会很慢,建议使用较低的图像分辨率或压缩图像。-建议加入超时处理,防止死等。-加入错误处理(如校验失败、包序号错误等)。由于在文本中无法展示LabVIEW程序框图,我们将用伪代码描述:伪代码:```OpenVISAserialportwithCOMx,baudrate,etc.Initialize:state=WAIT_FOR_HEADER,receivedData=empty,imageBuffer=arrayofzeros(size=imagewidth*height)while(notreceivedcompleteimage)bytesToRead=VISABytesatPortifbytesToRead>0:data=VISARead(bytesToRead)foreachbyteindata:switchstate:caseWAIT_FOR_HEADER:ifwereceivedthefirstheaderbyte(0xAA)thennextstateisHEADER_BYTE1_RECEIVEDandstoreit.elsereset.caseHEADER_BYTE1_RECEIVED:ifbyte==0x55thenstate=HEADER_RECEIVED;elsereset.caseHEADER_RECEIVED:下一个字节是包序号->读取包序号,状态变为等待数据长度caseWAIT_FOR_LENGTH:下一个字节是数据长度->读取,然后状态变为等待数据,并初始化数据计数器caseWAIT_FOR_DATA:读取数据直到达到数据长度(注意:需要一字节一字节读取,同时计数)当计数达到数据长度时,状态变为等待校验和caseWAIT_FOR_CHECKSUM:读取校验和,然后进行校验如果校验通过,将收到的数据片段放入imageBuffer的对应位置(根据包序号计算偏移量)然后状态重置为等待包头如果校验失败,丢弃,并重置状态endifendwhileConvertimageBuffertoimageanddisplay.CloseVISA```然而,实际中,我们通常会一次读取多个字节,然后逐个处理。但是要注意状态转移和部分包的情况。另外,为了确保性能,建议使用事件结构,但简单情况下用循环也可以。我们还可以使用LabVIEW提供的范例:在LabVIEW中,选择“帮助”->“查找范例”,然后搜索“serial”可以找到串口通信的例子,例如“BasicSerialWriteandRead.vi”。现在,我们将提供一段简单的代码框架(文本描述):1.前面板:放置一个图片显示控件(PictureControl),用于显示图像;一个字符串显示控件(用于显示接收到的数据或状态)。2.程序框图:-初始化串口(VISAConfigureSerialPort),设置波特率等参数。-使用While循环,内部使用VISABytesatPort检查是否有数据。-如果有数据,使用VISARead读取(建议一次读取所有可用字节,或者读取到特定结束符,但我们的协议需要手动解析,所以读取所有可用字节)。-将读取到的字节数组送入一个自定义解析子VI,该子VI实现上述状态机,并返回解析出的数据包(包括包序号和数据)。-将数据包的数据部分存储到图像缓冲区(数组)的对应位置。-检查是否接收完整个图像(比如已经收到128*128/64=256个包?每包64字节,但最后一包可能不足)。-当整个图像接收完成,将数组转换为图像并显示。关于图像数组到图像的转换:-假设是8位灰度图像,那么图像数组就是一个二维数组(行×列)。在LabVIEW中,我们可以使用“数组大小”函数得到行数和列数,然后使用“重排数组维数”将一维数组转换为二维数组(行×列)。-然后使用“创建图像”函数(在“编程”->“图形与声音”->“图片函数”中)来创建灰度图像,然后传递给显示控件。详细步骤:1.创建一个一维数组(初始化为0,长度为图像总像素数)作为图像缓冲区。2.每收到一个有效包,将包中的数据(长度为L)按包序号(设为n)计算偏移量:偏移量=n*每包最大数据长度(比如64)。注意最后一包可能小于这个长度。3.将数据段放入缓冲区[偏移量,偏移量+L-1]。4.当缓冲区满(或收到结束包)时,将一维数组转换为二维(行×列)数组。-二维数组的大小为[行数,列数]。假设图像尺寸为widthxheight,则行数=height,列数=width。-使用“重排数组维数”函数,输入一维数组和二维数组大小(即[height,width]),输出二维数组。5.将这个二维数组(8位无符号整数)通过“创建图像”函数(选择“灰度”)生成图像,然后通过图片控件显示。注意:LabVIEW中创建灰度图像的“创建图像”函数需要的数据是一个二维数组(行×列),每个元素代表一个像素的灰度值(0-255)。示例代码可能的结构(简化):```VISA配置串口(端口号、波特率、数据位8、停止位1、无校验)图像缓冲区:初始化一维数组(长度为128*128,初始值0)包计数器=0totalPackets=ceil((128*128)/packetSize)//packetSize为每包数据最大长度(例如64)循环直到接收完成(包计数器>=totalPackets)bytesToRead=VISA串口字节数如果bytesToRead>0:dataReceived=VISA读取(bytesToRead)//返回U8数组将dataReceived传入解析子VI(状态机解析),输出:包序号(seq),数据(dataSegment)如果解析成功:计算偏移量:offset=seq*packetSize将dataSegment写入图像缓冲区的[
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值