zouzhichao 发表于 2013-5-21 14:14:59

发一个自己写的上位机软件(含VC6.0工程文件)

本帖最后由 zouzhichao 于 2013-5-21 14:40 编辑

自己写的,如果你想学VC6.0 MFC软件设计的话,这篇文章是一个不错的入门级解析,本人功力有限,这个软件上不了厅堂,还请高手勿拍砖
对于电工来说,MFC写上位机主要是控件的学习,别的更深入的东西不是一时半会能搞明白的
这个软件包括了一个普通的Edit类控件,串口控件,NTGraph绘图控件,这里主要讲串口控件和NTGraph绘图控件,以及设计这个软件的一个整体思路





wangjiawu187 发表于 2013-5-21 14:25:49

看不懂         

lee345 发表于 2013-5-21 14:48:31

要注册控件才能用

zouzhichao 发表于 2013-5-21 14:48:58

串口初始化代码:
//如果串口是打开的,先关闭串口
if(m_Mscomm.GetPortOpen())
        m_Mscomm.SetPortOpen(false);
else
{
//设置接收,发送缓存区大小
        m_Mscomm.SetInBufferSize(1024);
        m_Mscomm.SetOutBufferSize(1024);
//选择ASCII或者BIN模式
        m_Mscomm.SetInputMode(1);
//4800/9600/19200/38400,无校验,8位数据位,1个停止位
        LPCTSTR Buffer = {"4800,n,8,1", "9600,n,8,1", "19200,n,8,1", "38400,n,8,1"};
        m_Mscomm.SetSettings(Buffer);
//每接受到一个字节就响应,类似中断
        m_Mscomm.SetRThreshold(1);
        m_Mscomm.SetInputLen(0);
//打开串口
        m_Mscomm.SetPortOpen(true);
//判断是否已开
        if(m_Mscomm.GetPortOpen())
                AfxMessageBox("打开串口");
}

zouzhichao 发表于 2013-5-21 14:50:37

关闭串口代码:
if(m_Mscomm.GetPortOpen())
       m_Mscomm.SetPortOpen(false);

上面漏了一句,选择串口号
m_Mscomm.SetCommPort(CommNum);

lans0625 发表于 2013-5-21 14:54:40

谢谢楼主分享。

zouzhichao 发表于 2013-5-21 14:55:43

串口响应函数:
void CMyDlg::OnOnCommMscomm()
{
        // TODO: Add your control notification handler code here
        static char Buffer = {NULL};
        static char* Point = (char*)Buffer;
//接收字符的Event号是2,如果不是2,直接返回
        if(2 != m_Mscomm.GetCommEvent())
                return;
//读取接收缓存区
        VARIANT Temp1 = m_Mscomm.GetInput();
        COleSafeArray Temp = Temp1;
        long StrLen = Temp.GetOneDimSize();
        for (long i = 0; i < StrLen; i++, Point++)
                Temp.GetElement(&i, Point);
//我一般习惯采用'\n'代表一条消息的结束,所以会有下面这句
        if ('\n' == *(Point - 1))
        {
                //
                Point = (char*)Buffer;
                memset(Point, NULL, 1024);
        }
}

// TODO: Add your control notification handler code here这个表示MFC自动生成的模板框架,自己写的代码写到这句的下面

zouzhichao 发表于 2013-5-21 14:57:28

串口发送函数:
int CMyDlg::CommOutStr(const char* Str)
{
//如果串口没有打开,直接返回-1
        if(!m_Mscomm.GetPortOpen())
                return -1;
//得到字符串长度
        unsigned int StrLen = strlen(Str);
//转换格式
        CByteArray m_Array;
        m_Array.RemoveAll();
        m_Array.SetSize(StrLen);
        for (unsigned int i = 0; i < StrLen; i++, Str++)
                m_Array.SetAt(i, *((unsigned char*)Str));
//发送
        m_Mscomm.SetOutput(COleVariant(m_Array));
        return 0;
}

zouzhichao 发表于 2013-5-21 14:58:14

有了这三个函数,再加几个EDIT控件,基本就可以写一个很简陋的串口助手了

zouzhichao 发表于 2013-5-21 15:03:59

一般我习惯把串口号的选择,波特率的选择,校验位的选择,停止位的选择,用组合框控件
最后根据选择生成字符串,如“9600,n,8,1)
第一个参数:波特率
第二个参数:校验位,n = none, o = odd,e = even
第三个参数:数据位长度
第四个参数:停止位(1或2)

zouzhichao 发表于 2013-5-21 15:07:12

组合框的样式选择下拉列表形式,假设组合框的关联变量是m_CommNum,那么可以通过m_CommNum.GetCurSel(),m_CommNum.SetCurSel()来获取和设置当前的组合框选择

loveye21 发表于 2013-5-21 15:07:42

不错,比我当年第一个串口软件强多了{:shy:}

zouzhichao 发表于 2013-5-21 15:10:16

loveye21 发表于 2013-5-21 15:07 static/image/common/back.gif
不错,比我当年第一个串口软件强多了

我写的第一个串口软件不是MFC做的,老复杂了,最开始只能发,不能收,后来加了一个线程才解决收数据的问题

zouzhichao 发表于 2013-5-21 15:12:29

loveye21 发表于 2013-5-21 15:07 static/image/common/back.gif
不错,比我当年第一个串口软件强多了

第一个串口软件的绘图也是一个一个点地画,实现一条动态曲线麻烦死了,写得都吐了,现在基本都用控件来做了,省事,开发快

hqgboy 发表于 2013-5-21 15:14:20

龚建伟。
                  
API的串口。

zouzhichao 发表于 2013-5-21 15:16:06

lee345 发表于 2013-5-21 14:48 static/image/common/back.gif
要注册控件才能用

用了一个NTGraph控件,这个要注册,但我的VC6.0它安装的时候就注册了,所以。。。。。这个程序编译出来拿到别的电脑上去,确实是不能运行的,当然他如果也装了VC的话,貌似那个控件都是注册了的,我试过自己单独注册,没有成功
串口控件一般都不需要注册了

lr120363092 发表于 2013-5-21 16:08:08

为何还学VC6??VS不是更好吗

zouzhichao 发表于 2013-5-21 16:16:44

lr120363092 发表于 2013-5-21 16:08 static/image/common/back.gif
为何还学VC6??VS不是更好吗

跟不上时代了,有点老了,学不动新东西了,有精力会去整个VS08或者VS12吧

zouzhichao 发表于 2013-5-21 16:18:13

lr120363092 发表于 2013-5-21 16:08 static/image/common/back.gif
为何还学VC6??VS不是更好吗

现在电脑配置太低,目前跑不动VS2008,VS2012更没法整了(150块买的奔腾台式机){:lol:}

wye11083 发表于 2013-5-21 19:49:46

更习惯于把C++功能封装起来用C#调用,后者调试要方便百倍以上。

517456 发表于 2013-5-21 19:54:11

还是VC6好,VS2010以上虽然方便,但是老电脑使用的时候还需要安装库!

zouzhichao 发表于 2013-5-21 20:09:23

wye11083 发表于 2013-5-21 19:49 static/image/common/back.gif
更习惯于把C++功能封装起来用C#调用,后者调试要方便百倍以上。

我习惯把C封装成DLL,给PowerBuilder调用(这个做数据库很方便,不好的地方就是软件需要打包才能到别的机器运行),现在不是很喜欢写上位机软件了

wye11083 发表于 2013-5-21 20:55:42

zouzhichao 发表于 2013-5-21 20:09 static/image/common/back.gif
我习惯把C封装成DLL,给PowerBuilder调用(这个做数据库很方便,不好的地方就是软件需要打包才能到别的机 ...

的确,C++也要编译成DLL才能被C#调用。写上位机的确很烦,不过是比下位机方便。

zouzhichao 发表于 2013-5-21 22:36:52

wye11083 发表于 2013-5-21 20:55 static/image/common/back.gif
的确,C++也要编译成DLL才能被C#调用。写上位机的确很烦,不过是比下位机方便。 ...

下位机只习惯AVR老八位,水平有限,做不了啥高科技玩意,看来您是上下全搞的高手,估计硬件你也能来几手

wye11083 发表于 2013-5-21 22:54:56

zouzhichao 发表于 2013-5-21 22:36 static/image/common/back.gif
下位机只习惯AVR老八位,水平有限,做不了啥高科技玩意,看来您是上下全搞的高手,估计硬件你也能来几手 ...

毛的高手,也就会用68013+FPGA写个小接口,算法都没写过。上位机就发发数据,读个68013的端口,==。用C#是因为调试方便,不用跟C++一样头疼了。

zouzhichao 发表于 2013-5-21 23:11:24

wye11083 发表于 2013-5-21 22:54 static/image/common/back.gif
毛的高手,也就会用68013+FPGA写个小接口,算法都没写过。上位机就发发数据,读个68013的端口,==。用C# ...

对我来说,很厉害了。大学就快过完了,什么东西都学得个半吊子样,读研没啥戏,也没啥兴致,找工作的时候也苦逼死了。做软件工程师人家开口闭口java会不会,网页会不会,数据库会不会,全他妈傻眼。找嵌入式的,人家一开口就是FPGA,DSP,ARM,摸都没摸过

wye11083 发表于 2013-5-21 23:16:43

zouzhichao 发表于 2013-5-21 23:11 static/image/common/back.gif
对我来说,很厉害了。大学就快过完了,什么东西都学得个半吊子样,读研没啥戏,也没啥兴致,找工作的时候 ...

学不学,学多少,在你自己,而不在你学校和你老师,当然好出身能给你增不少金。我也快毕业,不过是读研,51核的68013搞了一个月才会玩,FPGA学了半年才入了门,入门之后倒非常简单了。目前JAVA在平台应用上最广泛,而嵌入式ARM最多。如果你不打算搞最底层的硬件,就不用去搞FPGA,ARM足矣。当然DSP最好是熟悉一点。

闲鱼翻身 发表于 2013-5-22 00:00:45

感谢分享!

zouzhichao 发表于 2013-5-22 00:50:02

wye11083 发表于 2013-5-21 23:16 static/image/common/back.gif
学不学,学多少,在你自己,而不在你学校和你老师,当然好出身能给你增不少金。我也快毕业,不过是读研, ...

多谢指导,有时间学学ARM
页: [1]
查看完整版本: 发一个自己写的上位机软件(含VC6.0工程文件)