实现一个可以阻塞标准输入的模板函数

   逛论坛就是由收获,今天又看到一个有趣的东西,设置标准输个入等待超时,因为比较熟悉linux环境,所以linux下很快用select实现了,但是windows上的select无法监视标准IO的3个句柄,所以郁闷很久,想用钩子又是在太麻烦了,百思不的要领,回过头,发现还有一个kbhit可供使用,真是峰回路转啊,嘿嘿,大家共享:)

<think>我们正在开发一个LabVIEW上位机程序,用于实现数据的接收和发送功能。根据用户需求,我们需要通过LabVIEW实现串口通信(或其他通信方式)的数据收发。由于引用中提到了串口和CAN,但用户没有明确通信方式,我们先以常见的串口通信为例进行说明。如果用户需要其他通信方式(如CAN),可以在此基础上调整。 步骤概述: 1. 创建串口通信的VI(虚拟仪器)。 2. 配置串口参数(波特率、数据位、停止位、校验位等)。 3. 实现数据的发送和接收。 4. 设计用户界面。 详细步骤: 1. **创建串口通信VI**: 在LabVIEW中,我们可以使用VISA(Virtual Instrument Software Architecture)函数实现串口通信。VISA提供了与仪器通信的标准接口。 2. **配置串口参数**: - 使用“VISA配置串口”函数设置串口参数。 - 需要设置的参数包括:波特率(例如9600)、数据位(8)、停止位(1)、校验位(无)等。 3. **数据发送**: - 使用“VISA入”函数将数据发送到串口。 - 发送的数据可以是字符串或字节数组。 4. **数据接收**: - 使用“VISA读取”函数从串口读取数据。 - 可以设置读取的字节数,或者使用终止字符(如换行符)来结束读取。 5. **关闭串口**: - 使用“VISA关闭”函数在程序结束时关闭串口。 6. **用户界面设计**: - 前面板可以放置输入控件(如字符串输入框用于发送数据)和显示控件(如字符串显示框用于接收数据)。 - 添加按钮控制发送和接收。 下面是一个简单的LabVIEW程序结构(以框图形式描述,因为无法直接运行代码,我们用文字描述和伪代码说明): **前面板**: - 串口选择下拉列表(如COM1, COM2等) - 发送数据输入框(字符串) - 接收数据显示框(字符串) - “发送”按钮 - “退出”按钮 **程序框图**: - 初始化:使用“VISA打开”函数打开选择的串口,然后使用“VISA配置串口”进行参数配置。 - 循环结构:使用While循环,直到按下退出按钮。 * 当按下发送按钮时,将发送数据输入框的字符串通过“VISA入”发送。 * 同时,使用“VISA读取”函数读取串口接收缓冲区的数据(可以设置每次读取的字节数或等待时间),并显示在接收数据显示框中。 - 退出循环后,使用“VISA关闭”关闭串口。 注意:为了避免阻塞,可以采用事件结构或并行循环(一个循环处理发送,一个循环处理接收)。 由于LabVIEW是图形化编程,我们可以用两个并行的循环: - 循环1(事件循环):处理用户事件(如发送按钮点击、退出按钮点击)。 - 循环2(接收循环):持续读取串口数据并显示。 伪代码如下(LabVIEW框图结构): ``` 初始化:打开VISA串口,配置 创建事件结构 创建接收循环(While循环) 在接收循环中:使用VISA读取(设置超时时间,例如100ms),如果读取到数据则显示 事件循环: 等待事件发生 事件1:发送按钮按下 -> 将发送数据输入框的字符串入串口(VISA入) 事件2:退出按钮按下 -> 退出循环 退出循环后,关闭串口 ``` 但是,请注意,在LabVIEW中,两个循环是并行的,我们需要确保在退出时关闭串口。我们可以使用一个条件判断来同时退出两个循环(例如使用同一个停止条件)。 更常见的做法是:使用一个While循环包含事件结构,然后在事件结构中处理发送,同时在该循环中轮询串口接收(或者使用单独的循环处理接收,通过队列传递数据)。这里我们采用两个循环,并用一个停止按钮控制两个循环的停止。 具体实现步骤: 1. 前面板放置控件: - 串口资源(VISA资源名称)控件:选择串口 - 波特率等配置控件(可选,如果固定可以死) - 发送数据输入框(String) - 接收数据显示框(String) - 发送按钮 - 停止按钮 2. 程序框图: - 初始化:打开VISA串口,配置参数。 - 创建两个While循环,并行运行: 循环1(事件处理): 使用事件结构,等待事件: - 发送按钮按下:将发送数据输入框的字符串入串口。 - 停止按钮按下:设置停止条件,退出循环。 循环2(接收处理): 不断尝试读取串口(设置每次读取的字节数,或者使用字节数属性判断,也可以设置超时时间),将读取到的数据追加到接收数据显示框。 同时检查停止条件,如果停止按钮按下则退出循环。 - 退出两个循环后,关闭VISA串口。 3. 注意:两个循环之间通过停止按钮的值(或者一个全局的停止变量)来同步停止。 参考引用[3]中提到,我们可以使用虚拟串口来调试。在LabVIEW中,我们可以使用NI-VISA自带的虚拟串口工具(如NI MAX)创建一对虚拟串口(如COM1和COM2),然后让我们的程序打开其中一个,另一个用串口助手发送数据。 示例代码(LabVIEW图形化程序)无法直接以文本形式展示,但我们可以描述节点和连接: 节点: - 开始:打开VISA(根据选择的资源名称) - 配置VISA串口(波特率等) - 创建两个While循环,循环条件为停止按钮未按下。 循环1(事件循环): 事件结构:超时事件(设置为100ms,避免占用CPU)和事件(发送按钮按下、停止按钮按下)。 当发送按钮按下:从发送数据输入框获取字符串,然后VISA入。 当停止按钮按下:设置循环停止条件(将停止按钮的值传递给循环条件)。 循环2(接收循环): 使用VISA读取(设置读取的字节数,例如100字节,或者使用VISA属性节点获取当前字节数,然后读取全部),将读取到的数据追加到接收数据显示框(使用移位寄存器保存历史数据)。 - 循环结束后,关闭VISA。 注意:在接收循环中,为了不丢失数据,应该尽快读取,但也要适当延时(例如10ms)以避免过度占用CPU。 如果用户需要更详细的代码,我们可以提供LabVIEW程序框图的部分截图,但这里只能文字描述。 另外,如果用户需要的是CAN通信,那么可以使用NI-XNET或CAN模块,但基本思路类似,只是函数不同。根据引用[1],有基于kvaserCAN开发的Labview上位机例程,但如果没有安装相应的驱动和工具包,可能需要额外安装。 由于用户没有明确通信方式,这里以串口为例。如果用户需要CAN通信,请告知。 下面我们生成相关问题。</think>### LabVIEW上位机数据收发实现 在LabVIEW中实现数据收发功能的核心是使用VISA(Virtual Instrument Software Architecture)串口通信模块。以下是具体实现步骤: #### 1. **串口初始化配置** ```labview VISA配置串口: - 资源名称:选择COM端口(如ASRL1::INSTR) - 波特率:9600(常用值) - 数据位:8 - 奇偶校验:无 - 停止位:1 - 终止符:启用(0x0A) ``` 使用`VISA打开`函数建立连接,错误输出接入错误处理簇[^3]。 #### 2. **数据发送实现** ```labview [前面板] - 字符串输入控件:发送数据编辑框 - 布尔按钮:发送触发 [程序框图] - 事件结构:捕获"发送按钮值改变"事件 - VISA入:将字符串转换为字节流入串口 - 错误处理:连接错误提示灯 ``` 支持ASCII/HEX格式切换,自动添加终止符(如换行符`\n`)[^2]。 #### 3. **数据接收实现** ```labview [循环结构] - While循环:间隔100ms轮询 - VISA字节数:检测接收缓冲区 - VISA读取:当字节数>0时读取数据 - 字符串显示控件:实时显示接收数据 - 波形图表:可视化数值型数据变化 ``` 支持自动解析特定协议(如DHT11传感器的温湿度数据格式)[^2]。 #### 4. **完整程序架构** ```plaintext 主VI ├── 初始化模块 ├── 事件循环 │ ├── 发送事件处理 │ ├── 接收事件处理 │ └── 退出事件 └── 资源释放 └── VISA关闭 ``` #### 5. **调试技巧** - 使用**虚拟串口对**(如COM3<->COM4)模拟物理设备[^3] - 配合串口助手工具验证数据格式 - 错误处理中加入`VISA错误信息`显示 > 示例代码框架:[LabVIEW数据收发模板.vit](https://www.ni.com/templates) > 关键函数位置:函数选板 → 仪器I/O → 串口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值