原创 花里挑花—最终挑中了CVI

2013-10-22 02:37 3206 29 3 分类: 软件与OS 文集: CVI

所谓的花里挑花,也即一直选型的——上位机软件开发,从VB到VC++,在到C++Builder,在到QT,再到LabView等等,最后选中了CVI(LabWindows/CVI),感觉良好,所以大家都懂得。因为是刚开始,所以好多知识点可能还做的不到位,望各位高手别拍砖,而是多多指教,先谢。

由于自己爱好和出书的缘故,必须的搞定上位机的开发,所以先来个2小时的成果,望能和大家共勉。

                                           说明:界面有点丑,没夜月狼丑,望包涵哈!

截图03.jpg

先介绍一下,所谓下位机是MGMC-V1.0实验板,核心器件:单片机+LM75A温度传感器,实时采集当前温度,并通过串口打印到PC机上,最后结合自己编写的上位机软件,演示效果如上,说明此时温度也不高(18.125)啊。其实自己也想睡在被窝里,可是既然选择了这条路,没有退路,所以必须得搞起,呵呵。。。

最后来上整个上位机的源码,该源码自己当然能理解,也会写,但是还没真正吃透,因为才学了2个小时嘛,所以望理解,不过相信自己很快就能搞定,之后再给大家详细的注释和说明,若喜欢请等待,若不喜欢,请轻轻的走开,不要带走一点点“孤独”,也不要留下一丝丝“恶意”。

/* =============================================================== */

 

#include <rs232.h>
#include <ansi_c.h>
#include "sample5.h"
 
static int panelHandle;
int ComSelect=0;
int status;
char info[513]; // 字符型数组,用于存放发送、接收的字符串
 
int CVIFUNC DimObject(int stat) //设置页面控件状态,stat=0表示串口关闭,1串口打开
{
    SetCtrlAttribute(panelHandle,PANEL_COMSELECT,ATTR_DIMMED ,stat);
    SetCtrlAttribute(panelHandle,PANEL_BTLSELECT,ATTR_DIMMED ,stat);
    SetCtrlAttribute(panelHandle,PANEL_JYSELECT,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); 
    SetCtrlAttribute(panelHandle,PANEL_CLOSE_COM,ATTR_DIMMED ,!stat); 
    SetCtrlAttribute(panelHandle,PANEL_SEND,ATTR_DIMMED ,!stat); 
    SetCtrlAttribute(panelHandle,PANEL_CLEARSEND,ATTR_DIMMED ,!stat); 
    SetCtrlAttribute(panelHandle,PANEL_RECIEVE,ATTR_DIMMED ,!stat); 
    SetCtrlAttribute(panelHandle,PANEL_CLEARRECIVE,ATTR_DIMMED ,!stat); 
    return 0;
}
 
int main (int argc, char *argv[])
{
    if (InitCVIRTE (0, argv, 0) == 0)
        return -1;  
    if ((panelHandle = LoadPanel (0, "sample5.uir", PANEL)) < 0)
        return -1;
    DimObject(0);
    DisplayPanel (panelHandle);
    RunUserInterface ();
    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(PANEL,PANEL_SENDTEXT,info);   // 从发送文本框中获取发送信息文本,并存于info数组中
            status=ComWrt(ComSelect,info,strlen(info)); // 向串口ComSelect发送数组info中的字符串,并返回字节数!
            if(status != strlen(info))
                MessagePopup("错误","Send data failed!");   // 如果发送的与发送框中的字符不相等,则弹出错误对话框
        break;
    }
    return 0;
}
 
int CVICALLBACK Recieve (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    switch (event)
    {
        case EVENT_COMMIT:
            if(!ComSelect) return -1;
            SetComTime(ComSelect,1.0);
            status=ComRd (ComSelect,info,GetInQLen(ComSelect));  //接收
            if(status<=0)
            {
                MessagePopup("错误","Read data failed!");
                break;
            }
            //将接收信息写入文本框
            info[status]='\0';
            SetCtrlVal(PANEL,PANEL_RECIVETEXT,info);
            //SetActiveCtrl(PANEL,PANEL_RECIVETEXT); // 考虑中!
        break;
    }
    return 0;
}
 
int CVICALLBACK Quit (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    switch (event)
    {
        case EVENT_COMMIT:
            if(ComSelect)
            {
                CloseCom(ComSelect);
                ComSelect=0;
                DimObject(0);
            }
            QuitUserInterface (0);
        break;
    }
    return 0;
}
 
int CVICALLBACK ComOpen (int panel, int control, int event,
        void *callbackData, int eventData1, int eventData2)
{
    int comValue,btlValue,jhValue,longValue,stopValue;
    switch (event)
    {
        case EVENT_COMMIT:
            GetCtrlVal(PANEL,PANEL_COMSELECT,&comValue);     //选择串口
            GetCtrlVal(PANEL,PANEL_BTLSELECT,&btlValue);          //选择波特率
            GetCtrlVal(PANEL,PANEL_JYSELECT,&jhValue);              //选择奇偶校验
            GetCtrlVal(PANEL,PANEL_LONGSELECT,&longValue);  //选择数据位
            GetCtrlVal(PANEL,PANEL_STOPSELECT,&stopValue);   //选择停止位
            //设置和打开串口
            status=OpenComConfig(comValue,"",btlValue,jhValue,
                longValue,stopValue,512,512);
            if(status!=0)
            {
                MessagePopup("Error","config failed!");
                return 0;
            }
            SetCTSMode(comValue,LWRS_HWHANDSHAKE_OFF);
            FlushInQ(comValue);             //清空输入和输出缓冲区
            FlushOutQ(comValue);
            ComSelect=comValue;
            DimObject(1);
            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);
            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_CLEARRECIVE)
                ResetTextBox(PANEL,PANEL_RECIVETEXT,"\0");//清空接收文本框 
            else
                ResetTextBox(PANEL,PANEL_SENDTEXT,"\0");//清空发送文本框      
            break;
    }
    return 0;
}
演示完毕,一点“滚蛋”和一把实验板电源开关,上位机软件、实验板、自己统统睡觉,因为时间不早了啊(午夜2:40),大家都累了,晚安、好梦。。。
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

zhangjingxun12_543950655 2013-12-21 08:44

也想搞好上位机客户端的编写,学习了

sunyzz 2013-1-8 14:34

您理解的很深啊,我比较菜,只能在水面上看看。。

用户377235 2013-1-8 12:07

个人认为51的强大之处,就是它的衍生产品特别多,比如说各种射频模块,对它们的使用,都是51兼容的,只要学会了51,就能很快上手很多应用。而MSP430,个人认为,它的价值所在就在于其集成的性能不错的运放、模拟比较器、模数转换器以及其低功耗,这些特点使得它特别适合在一些仪表中使用。照这种感觉来说,到此,发现两者根本没有可比性:51根本不会考虑性能、功耗问题,它的优势是兼容,几乎深入各个领域,而MSP430则注重混合信号处理,甚至给人一种专攻仪表的感觉。 个人之见。

sunyzz 2013-1-8 11:49

谢谢指导,我只是看到了表面的东西,其实它们压根就没比较的必要。。。

用户1025107 2013-1-8 10:52

楼主还是理解的稍微浅了些。这两个没法放到一起比的,一个8位,一个16位。 而且楼主知道MSP是啥意思吗?mixed signal processor 的缩写,支持16位乘除法指令,DMA操作,可以进行一些对运算速度要求不高的数字信号处理运算。另外430的低功耗也是8051核没法PK的。

sunyzz 2013-1-6 11:40

我对这两个的认识还是很肤浅的。。。

gaon2_614908070 2013-1-6 11:19

市场定位不同,51应该是通用性比较强,430有侧重.所以肯定精致许多.
相关推荐阅读
残弈悟恩 2018-11-29 18:36
【博客大赛】国产SWM32单片机学习连载(一)
让更多人知道“中国芯”第1章 SWM320控制器简介单片微型计算机简称单片机,是典型的嵌入式微控制器(Microcontroller Unit),常用缩写MCU表示。单片机由运算器、控制...
残弈悟恩 2018-11-22 21:47
签到
2年没来了,既然来了,就签个到...
残弈悟恩 2016-03-25 18:38
评论:@以芯筑未来 博客中提到的“[转]29岁了,继续做个精致的电子工程师”
今天没时间看,先转了,等有时间了,好好拜读一下。...
残弈悟恩 2016-01-11 14:55
【博客大赛】各位网友,你想对EDN网站说点什么?
自荣获2015年EDN最佳博主奖以后,可能太过于自满,就再也没怎么写过博客自己!! 说心里话,肯定不是自满,实在是太忙了,所以只是常来看看,看大家写了什么,有什么最新的科技动态,反正是不想写。...
残弈悟恩 2015-10-23 14:28
评论:@wshr_king's Blog 博客中提到的“CODE RW RO ZI”
积累一下,谢谢楼主。...
EE直播间
更多
我要评论
1
29
关闭 站长推荐上一条 /1 下一条