CVI 串口调试助手
基于Labwindows CVI 2017编写的一个简单的串口调试助手,附带接收一个00–99的两位数并进行波形绘制的功能,编写过程可见:https://blog.csdn.net/Stark_/article/details/129003839
#include <ansi_c.h>
#include <rs232.h>
#include <cvirte.h>
#include <userint.h>
#include "SerialDebug.h"
#define MAX_BUF_NUM 512
static int panelHandle; //主界面句柄
int comSelect = 0; //串口号
int status;
int ComState = 0; //串口开关状态
char info[MAX_BUF_NUM+1]; //串口数据缓冲区
//设置页面控件状态,stat = 0表示关闭,1表示打开
//SetCtrlAttribute(,,ATTR_DIMMED,)将对应控件属性变暗和变亮,以禁用和使用对应控件
int CVIFUNC DimObject(int stat)
{
SetCtrlAttribute(panelHandle,PANEL_COMSELECT,ATTR_DIMMED,stat); //串口号选择
SetCtrlAttribute(panelHandle,PANEL_BAUDSELECT,ATTR_DIMMED,stat); //波特率
SetCtrlAttribute(panelHandle,PANEL_CHECKSELECT,ATTR_DIMMED,stat);//校验位
SetCtrlAttribute(panelHandle,PANEL_LONGSELECT,ATTR_DIMMED,stat); //数据位
SetCtrlAttribute(panelHandle,PANEL_STOPSELECT,ATTR_DIMMED,stat);//停止位
SetCtrlAttribute(panelHandle,PANEL_OPEN_COM,ATTR_DIMMED,stat); //打开串口
SetCtrlVal(panelHandle,PANEL_LED,stat); //LED
SetCtrlAttribute(panelHandle,PANEL_CLOSE_COM,ATTR_DIMMED,!stat); //关闭串口
SetCtrlAttribute(panelHandle,PANEL_SEND,ATTR_DIMMED,!stat);//发送
return 0;
}
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1; /* out of memory */
if ((panelHandle = LoadPanel (0, "SerialDebug.uir", PANEL)) < 0)
return -1;
DimObject(0);
DisplayPanel (panelHandle);
RunUserInterface ();
DiscardPanel (panelHandle);
return 0;
}
int CVICALLBACK PanelMain (int panel, int event, void *callbackData,
int eventData1, int eventData2)
{
switch (event)
{
case EVENT_GOT_FOCUS:
break;
case EVENT_LOST_FOCUS:
break;
case EVENT_CLOSE:
QuitUserInterface (0);//关闭面板0(主面板)
break;
}
return 0;
}
int CVICALLBACK ComOpen (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int comValue,baudValue,checkValue,longValue,stopValue;
switch (event)
{
case EVENT_COMMIT:
GetCtrlVal(panelHandle,PANEL_COMSELECT,&comValue); //获取串口号
GetCtrlVal(panelHandle,PANEL_BAUDSELECT,&baudValue); //获取波特率
GetCtrlVal(panelHandle,PANEL_CHECKSELECT,&checkValue);//获取校验位
GetCtrlVal(panelHandle,PANEL_LONGSELECT,&longValue);//获取数据位
GetCtrlVal(panelHandle,PANEL_STOPSELECT,&stopValue);//获取停止位
//设置和打开串口
status = OpenComConfig(comValue,"",baudValue,checkValue,longValue,stopValue,MAX_BUF_NUM,MAX_BUF_NUM);
if(status!=0)
{
MessagePopup("Error","config failed!"); //弹窗提示
ComState = 0;
return 0;
}
SetCTSMode(comValue,LWRS_HWHANDSHAKE_OFF); /* 禁止硬件握手,即不用RTS/CTS和DTR/DSR */
FlushInQ(comValue); //清空输入队列的缓存数据
FlushOutQ(comValue); //清空输出队列的缓存数据
comSelect = comValue;
DimObject(1);
ComState = 1; //串口开启状态
break;
}
return 0;
}
int CVICALLBACK ClearTextBox (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
if(control == PANEL_CLEARRECEIVE)//清除接收控件
ResetTextBox(panelHandle,PANEL_RECEIVETEXT,"\0");//清除接收框
else
ResetTextBox(panelHandle,PANEL_SENDTEXT,"\0");//清除发送框
break;
}
return 0;
}
int CVICALLBACK Send (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
if(!comSelect) return -1; //发送出错
GetCtrlVal(panelHandle,PANEL_SENDTEXT,info);//获取要发送的文本
status = ComWrt(comSelect,info,strlen(info));//发送
if(status != strlen(info))
MessagePopup("Error","Send data failed!"); //弹窗提示
break;
}
return 0;
}
int CVICALLBACK Timer (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
int i = 0;
int len = 0;
double point = 0;
switch (event)
{
case EVENT_TIMER_TICK:
if(ComState)
{
if(!comSelect) return -1;
SetComTime(comSelect,1); //设置一帧数据的接收超时时间为1s
len = GetInQLen(comSelect);
status = ComRd(comSelect,info,len);//接收,GetInQLen用于得到Com口的输入队列数据缓存的大小
if(status<=0)
{
//MessagePopup("Error","Read data failed!"); //弹窗提醒没有读取到信息
break;
}
//将信息写入接收框
info[status] = '\0';
SetCtrlVal(panelHandle,PANEL_RECEIVETEXT,info); //设置接收文本框显示info的内容
SetActiveCtrl(panelHandle,PANEL_RECEIVETEXT);
if((len == 2)||(info[2] == 0x0D)) //收到两个字符,或者第三个字符是回车
{
point = (info[0]-48)*10 + (info[1]-48); //接收一个两位数,比如 01、09、10、90、AB
if((point>=0)&&(point<=99))//判定这个两位数属于00-99之间
{
PlotStripChartPoint(panelHandle,PANEL_WAVE_DISPLAY,point); //对于在范围内的数据进行绘制点
}
}
for(0;i<len;i++)
{
info[i]=0;
i++;
}
}
break;
}
return 0;
}
int CVICALLBACK ComClose (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
CloseCom(comSelect); //关闭串口
comSelect = 0;
DimObject(0);
ComState = 0;
break;
case EVENT_TIMER_TICK:
break;
}
return 0;
}
相关文章:
CVI 串口调试助手
基于Labwindows CVI 2017编写的一个简单的串口调试助手,附带接收一个00–99的两位数并进行波形绘制的功能,编写过程可见:https://blog.csdn.net/Stark_/article/details/129003839 #include <ansi_c.h> #include <rs232.h> #incl…...
【蓝桥杯选拔赛真题48】python最小矩阵 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析
目录 python最小矩阵 一、题目要求 1、编程实现 2、输入输出 二、算法分析...
如何在家庭网络中开启 IPv6内网穿透
随着互联网的不断发展,IPv4地址资源逐渐枯竭,而IPv6作为它的继任者,为网络连接提供了更多的IP地址。启用IPv6对于家庭网络来说变得越来越重要,因为它可以提供更稳定、更安全、更快速的互联网连接。本文将指导如何在家庭网络中启用…...
CodeWhisperer 的安装及体验
CodeWhisperer 是亚马逊出品的一款基于机器学习的通用代码生成器,可实时提供代码建议。类似 Cursor 和 Github Copilot 编码工具。 官网:aws.amazon.com/cn/codewhis… 在编写代码时,它会自动根据您现有的代码和注释生成建议。从单行代码建…...
【C/C++】虚析构和纯虚析构
纯虚析构的问题 多态使用时,如果子类中有属性开辟到堆区,那么父类指针在释放时无法调用到子类的析构代码。 解决方式:将父类中的析构函数改为虚析构或者纯虚析构 虚析构和纯虚析构共性: 可以解决父类指针释放子类对象都需要有…...
第四章 应用SysML基本特性集的汽车示例 P1|系统建模语言SysML实用指南学习
仅供个人学习记录 汽车模型 主要就是应用练习建模了 Automobile Domain包 用于组织模型的包图 将模型组织入包的包图 需求图捕获汽车规范 汽车规范中包含系统需求的需求图 块定义图定义车辆及其外部环境 汽车域块定义图 用例图表示操作车辆 描述车辆主要功能的用…...
C语言 写一个简易音乐播放器
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <math.h>#define SAMPLE_RATE 44100 // 采样率 #define AMPLITUDE 32767 // 振幅 #define NO_SAMPLES 44100 // 样本数// 声明一个结构体用于表示音符 typedef struct {double …...
面试题:有一个 List 对象集合,如何优雅地返回给前端?
文章目录 1.业务背景每个对象里面都带上了重复的一个sessionId数据,我想提出来该怎么办? 2.实体类3.自定义Mapper和xml文件4.Service层5.Controller层 1.业务背景 业务场景中,一个会话中存在多个场景,即一个session_id对应多个sc…...
DAY43 完全背包理论基础 + 518.零钱兑换II
完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…...
unity 从UI上拖出3D物体,(2D转3D)
效果展示: 2D转3D视频 UI结构 UI组件挂载 UI结构 这个脚本挂载到 3D物体身上 using DG.Tweening; using System.Collections; using System.Collections.Generic; using UnityEngine;public class DragGame : MonoBehaviour {[HideInInspector]public bool isDrag…...
win10pycharm和anaconda安装和环境配置教程
windows10 64位操作系统下系统运行环境安装配置说明 下载和安装Anaconda,链接https://www.anaconda.com/download 下载完后,双击exe文件 将anaconda自动弹出的窗口全部关掉即可,然后配置高级系统变量 根据自己的路径,配置…...
[C++ 中]:6.类和对象下(static成员 + explicit +友元函数 + 内部类 + 编译器优化)
(static成员 explicit 友元函数 内部类 编译器优化) 一.static 成员:1.概念引入:1-1:定义全局变量记录个数? 2.如果有多个类需要分开去记录类对象的个数?2-1:可不可以声明成员变量解决&#…...
ONES Design UI 组件库环境搭建
这个 ONES Design UI 组件库 是基于 Ant Design 的 React UI 组件库,主要用于企业级研发管理工具的研发。 首先用 React 的脚手架搭建一个项目: npx create-react-app my-app cd my-app目前 ONES Design UI 组件库 托管在 ONES 私有的 npm 仓库上, 因此…...
支付宝AI布局: 新产品助力小程序智能化,未来持续投入加速创新
支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA收款等生活服务应用。 支付宝不仅是一个支付工具,也是一个数字生活平台,通过…...
taro全局配置页面路由和tabBar页面跳转
有能力可以看官方文档:Taro 文档 页面路由配置,配置在app.config.ts里面的pages里: window用于设置小程序的状态栏、导航条、标题、窗口背景色,其配置项如下: tabBar配置:如果小程序是一个多 tab 应用&…...
【k8s】pod进阶
一、资源限制 1、资源限制的概念 当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。 当为 Pod 中的容器指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上…...
【设计模式】第18节:行为型模式之“迭代器模式”
一、简介 迭代器模式(Iterator Design Pattern),也叫作游标模式(Cursor Design Pattern)。 在通过迭代器来遍历集合元素的同时,增加或者删除集合中的元素,有可能会导致某个元素被重复遍历或遍…...
【数据结构】单链表OJ题
前言: 本节博客将讲解单链表的反转,合并有序链表,寻找中间节点及约瑟夫问题 文章目录 一、反转链表二、合并有序链表三、链表的中间结点四、环形链表的约瑟夫问题 一、反转链表 要反转链表,我们需要遍历链表并改变每个节点的 next 指针&#…...
智能工厂架构
引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <...
阿里云多款ECS产品全面升级 性能最多提升40%
“阿里云始终围绕‘稳定、安全、性能、成本、弹性’的目标不断创新,为客户创造业务价值。”10月31日,杭州云栖大会上,阿里云弹性计算计算产品线负责人张献涛表示,通过持续的产品和技术创新,阿里云发布了HPC优化实例等多…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
