博文
多线程串口编程工具CserialPort类(2006-09-24 13:50:00)
摘要:
简单而强大的多线程串口编程工具CserialPort类(附VC基于MFC单文档协议通讯源程序及详细编程步骤)
老有人觉得MSComm通讯控件很土,更有人大声疾呼:忘了它吧。确实当我们对串口编程有了一定的了解后,应该用API函数写一个属于自己的串口程序,由于编程者对程序了解,对程序修改自如。但我一直没有停止过用MSComm通讯控件,那么简单的东西,对付简单的任务完全可以,但当我们需要在程序中用多个串口,而且还要做很多复杂的处理,那么最好不用MSComm通讯控件,如果这时你还不愿意自己编写底层,就用这个类:CserialPort类。
这是Remon Spekreijse写的一个串口类, 地址在:
http://codeguru.earthweb.com/network/serialport.shtml
类作者Remon Spekreijse已作了一个基于对话框的同时检测4个串口示例的程序,在上面的网址和我主页的串口源码下载页也可以找到。我在这儿主要介绍如何将这个类应用到VC中基于文档的程序中。为了加深对串口数据处理的了解,我们利用这个类解决如下问题:
问题:
串口2(COM2)每隔1秒向串口1(COM1)发送的NEMA格式的报文:串头为$,串尾为*,中间为一个xxxx的整数( 比如2345,不足4位则前面以0代替代),最后是hh校验,规定hh为xxxx四个数的半BYTE校验和,最后加上回车<CR>与换行<LF>。整个数据包为$xxxx*hh<CR><LF>。
串口1收到上述报文后,校验正确后,将发来的数据显示在视窗中,并记下发来的正确帧数和错误帧数,若正确,还向串口2发送Y,串口2收到Y后将收到的Y的计数显示在视窗中。
测试方法:
将三线制串口线联接上同一台计算机的两个串口,编好程序后就可测试。如果没有两个串口的微机,自己改改程序。
好了,你可以先下载源程序: scporttest.zip(大小:49KB,VC6,WIN9X/2000,SerialPort.h SerialPort.cpp是两个类文件)
例程分析 多线程编程(2006-09-24 13:48:00)
摘要:
例程分析 多线程编程
·bull77··yesky
Windows系统平台经历了16位到32位的转变后,系统运行方式和任务管理方式有了很大的变化,在Windows 95和Windows NT中,每个Win32程序在独立的进程空间上运行,32位地址空间使我们从16位段式结构的64K段限制中摆脱出来,逻辑上达到了4G的线性地址空间,我们在设计程序时,不再需要考虑编译的段模式,同时还提高了大程序的运行效率。独立进程空间的另一个更大的优越性是大大提高了系统的稳定性,一个应用的异常错误不会影响其它的应用。与在MS-DOS和16位Windows操作系统中不同,32位Windows进程是没有活力的。这就是说,一个32位Windows进程并不执行什么指令,它只是占据着4GB的地址空间,此空间中有应用程序EXE文件的代码和数据。EXE需要的DLL也将它们的代码的数据装入到进程的地址空间。除了地址空间,进程还占有某些资源,比如文件、动态内存分配和线程。当进程终止时,在它生命期中创建的各种资源将被清除。
如上所述,进程是没有活力的,它只是一个静态的概念。为了让进程完成一些工作,进程必须至少占有一线程,所以线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码。实际上,单个进程可能包含几个线程,它们可以同时执行进程的地址空间中的代码。为了做到这一点,每个线程有自己的一组CPU寄存器和椎。每个进程至少有一个线址程在执行其地址空间中的代码,如果没有线程执行进程地空间中的代码,如果没有线程执行进程地址空间中的代码,进程也就没有继续存在的理由,系统将自动清除进程及其地址空间。为了运行所有这些线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮转方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。创建一个32位Windows进程时,它的第一个线程称为主线程,由系统自动生成,然后可由这个主线程生成额外的线程,这些线程又可生成更多的线程。
例如,在基于Internet网上的可视电话系统中,同时要进行语音采集、语音编译码、图像采集、图像编译码、语音和图像码流的传输,所有这些工作,都要并行处理。特别是语音信号,如果进行图像编解码时间过长,语音信号得......
多线程技术在VC++串口通信程序中的应用研究(2006-09-24 13:46:00)
摘要:
多线程技术在VC++串口通信程序中的应用研究
陆尔东 邓利平··yesky
1 概述
在现代的各种实时监控系统和通信系统中,在Windows 9X/NT下利用VC++对RS-232串口编程是常用的手段。Windows 9X/NT是抢先式的多任务操作系统,程序对CPU的占用时间由系统决定。多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程。进程是应用程序的运行实例,拥有自己的地址空间。每个进程拥有一个主线程, 同时还可以建立其他的线程。线程是操作系统分配CPU时间的基本实体,每个线程占用的CPU时间由系统分配,系统不停的在线程之间切换。进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,这就是多线程的基本概念。
2 VC++对多线程的支持
使用MFC开发是较普遍的VC++编程方法。在VC++6.0下,MFC应用程序的线程由CWinThread对象表示。VC++把线程分为两种:用户界面线程和工作者线程。用户界面线程能够提供界面和用户交互,通常用于处理用户输入并相应各种事件和消息;而工作者线程主要用来处理程序的后台任务。
程序一般不需要直接创建CWinThread对象,通过调用AfxBeginThread()函数就会自动创建一个CWinThread对象,从而开始一个进程。创建上述的两种线程都利用这个函数。
线程的终止取决于下列事件之一:线程函数返回;线程调用ExitThread()退出;异常情况下用线程的句柄调用TerminateThread()退出;线程所属的进程被终止。
3 多线程在串口通信中的应用
3.1 串口通信对线程同步的要求
因为同一进程的所有线程共享进程的虚拟地址空间,而在Windows 9X/NT系统下线程是汇编级中断,所以有可能多个线程同时访问同一个对象。这些对象可能是全局变量,MFC的对象,MFC的API等。串口通信的几个特点决定了必须采用措施来同步线程的执行。
串口通信中,对于每个串口对象,只有一个缓冲区,发送和接收都要用到,必须建立起同步机制,使得在一个时候只能进行一种操作,否则通信就会出......
Windows多线程多任务设计初步(2006-09-24 13:44:00)
摘要:
Windows多线程多任务设计初步
[前言:]当前流行的Windows操作系统,它能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力。用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义。现在的应用软件无一不是多线程多任务处理,单线城的软件是不可想象的。因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的。本文针对多线程技术在应用中经常遇到的问题,如线程间的通信、同步等,对它们分别进行探讨。
一、 理解线程
要讲解线程,不得不说一下进程,进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它系统资源组成。进程在运行时创建的资源随着进程的终止而死亡。线程的基本思想很简单,它是一个独立的执行流,是进程内部的一个独立的执行单元,相当于一个子程序,它对应Visual C++中的CwinThread类的对象。单独一个执行程序运行时,缺省的运行包含的一个主线程,主线程以函数地址的形式,如main或WinMain函数,提供程序的启动点,当主线程终止时,进程也随之终止,但根据需要,应用程序又可以分解成许多独立执行的线程,每个线程并行的运行在同一进程中。
一个进程中的所有线程都在该进程的虚拟地址空间中,使用该进程的全局变量和系统资源。操作系统给每个线程分配不同的CPU时间片,在某一个时刻,CPU只执行一个时间片内的线程,多个时间片中的相应线程在CPU内轮流执行,由于每个时间片时间很短,所以对用户来说,仿佛各个线程在计算机中是并行处理的。操作系统是根据线程的优先级来安排CPU的时间,优先级高的线程优先运行,优先级低的线程则继续等待。
线程被分为两种:用户界面线程和工作线程(又称为后台线程)。用户界面线程通常用来处理用户的输入并响应各种事件和消息,其实,应用程序的主执行线程CWinAPP对象就是一个用户界面线程,当应用程序启动时自动创建和启动,同样它的终止也意味着该程序的结束,进城终止。工作者线程用来执行程序的后台处理任务,比如计算、调度、对串口的读写操作等,它和用户界面线程的区别是它不用从Cwi......
VHDL语言100例 (2006-09-24 13:30:00)
摘要:VHDL语言100例
第1例 带控制端口的加法器
第2例 无控制端口的加法器
第3例 乘法器
第4例 比较器
第5例 二路选择器
第6例 寄存器
第7例 移位寄存器
第8例 综合单元库
第9例 七值逻辑与基本数据类型
第10例 函数
第11例 七值逻辑线或分辨函数
第12例 转换函数
第13例 左移函数
第14例 七值逻辑程序包
第15例 四输入多路器
第16例 目标选择器
第17例 奇偶校验器
第18例 映射单元库及其使用举
第19例 循环边界常数化测试
第20例 保护保留字
第21例 进程死锁
第22例 振荡与死锁
第23例 振荡电路
第24例 分辨信号与分辨函数
第25例 信号驱动源
第26例 属性TRANSACTION和分辨信号
第27例 块保护及属性EVENT,
第28例 形式参数属性的测试
第29例 进程和并发语句
第30例 信号发送与接收
第31例 中断处理优先机制建模
第32例 过程限定
第33例 整数比较器及其测试
第34例 数据总线的读写
第35例 基于总线的数据通道
第36例 基于多路器的数据通道
第37例 四值逻辑函数
第38例 四值逻辑向量按位或运算
第39例 生成语句描述规则结构
第40例 带类属的译码器描述
第41例 带类属的测试平台
第42例 行为与结构的混合描述
第43例 四位移位寄存器
第44例 寄存/计数器
第45例 顺序过程调用
第46例 VHDL中generic缺省值的使用
第47例&n......
如何在状态条中(CStatusbar Pane)加入Bitmap图(2006-09-24 12:55:00)
摘要:
如何在状态条中(CStatusbar Pane)加入Bitmap图
来自未知 作者佚名
以下的代码将演示如何在状态条的第一个方块中显示Bitmap图。Visual C++ 4.0
以后的MFC的CStatusBar使用状态窗口通用控制,所以代码与早期版本有所不同。
在一个AppWizard应用的状态条中加入一个新的方块,在Mainfrm.cpp中加入下列语句
//Mainfrm.cpp
static UINT indicators[] =
ID_SEPARATOR, // status line indicator
ID_INDICATOR_BITMAP, // BITMAP状态条
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
从CStatusBar派生一个新类(例如CBitmapStatusBar),并且用这个新类取代CMainFrame
中的CStatusBar(Mainfrm.h)
//Mainfrm.h
//CStatusBar m_wndStatusBar;
CBitmapStatusBar m_wndStatusBar;
在新类的.h和.cpp中加入下面两个函数的声明和定义
//BitmapStatusBar.h
class CMyStatusBar : public CStatusBar {...
#if _MFC_VER < 0x400
virtual void DoPaint(CDC* pDC);
#else
virtual void DrawItem(LPDRAWITEMSTRU......
VC制作初始画面(2006-09-24 12:54:00)
摘要:
VC制作初始画面
来自未知 作者宋端智 贾皓丽
在以前的“电脑工作室”中,我们曾介绍过用VB、VFP制作初始画面,那么,如何在VC中
绘制软件初始画面呢?本文将详细介绍其设计步骤。
1.创建一个SDI或MDI工程。
2.新建或导入一个ID号为IDB桽PLASH的位图。
3.从CWnd类派生一个名为CSplashWnd的子类,并添加两个保护成员变量:
CBitmap m_bitmap;//初始画面位图
static CSplashWnd m_SplashWnd;
//指向初始画面窗口的指针
m_SplashWnd为静态成员变量,应在类的实现文件(.cpp)开头说明:
CSplashWnd CSplashWnd::m_SplashWnd;
4.向CSplashWnd类中加入一个静态公有成员函数ShowSplashScreen,此函数
将被主框架窗口调用:
void CSplashWnd::ShowSplashScreen(CWnd pParentWnd)
{ //此函数传递的参数是主框架窗口
if(m_SplashWnd!=NULL) return;
m_SplashWnd=new CSplashWnd;
if(!m_SplashWnd->Create(pParentWnd))
//创建初始画面窗口
delete m_SplashWnd;
else
m_SplashWnd->UpdateWindow();
//显示初始画面窗口
}
5.编辑ShowSplashScreen函数中调用的Create函数(保护成员函数):
BOOL CSpla......
VC++5创建不规则形状窗口(2006-09-24 12:49:00)
摘要:
VC++5创建不规则形状窗口
来自软件世界 作者吴天
标准的Windows窗口是矩形的,但在有些时候我们需要非矩形的窗口,比如圆形的、甚至是不规则的。借助CWnd类的SetWindowRgn函数可以创建不规则形状窗口。
CWnd::SetWindowRgn的函数原型如下:
int SetWindowRgn( HRGN hRgn, // 窗口区域句柄
BOOL bRedraw ); // 是否重画窗口
CRgn类封装了关于区域的数据和操作。通过(HRGN)强制操作可以从CRgn类中取得
其HRGN值。
CRgn提供了CreateRectRgn、CreateEllipticRgn和CreatePolygonRgn成员函数,
分别用以创建矩形、(椭)圆形和多边形区域。
创建非矩形窗口的方法如下:
首先,在窗口类中定义区域类成员数据(如CRgn m_rgnWnd);
其次,在窗口的OnCreate函数或对话框的OnInitDialog函数中调用CRgn类的
CreateRectRgn、CreateEllipticRgn或CreatePolygonRgn函数创建所需的区域,
并调用SetWindowRgn函数。
下例将生成一个椭圆窗口。
1. 在Developer Studio中选取File菜单中的New命令,在出现的New对话框中选择
创建MFC AppWizard(exe)框架应用程序,并输入项目名为EllipseWnd。设定应
用程序类型为基于对话框(Dialog based),其它选项按缺省值创建项目源文件。
2. 使用资源编辑器从主对话框(ID为IDD_ELLIPSEWND_DIALOG)删除其中的所有控
制,并从其属性对话框(Dialog Properties)中设定......
在VC++下实现高彩色工具条 (2006-09-24 12:47:00)
摘要:
在VC++下关于工具条的设计
来自czvc 作者佚名
在VC++下实现高彩色工具条
引言
一些Windows系统自带程序如资源管理器、Internet Explorer等程序的工具条看上去和其他一些程序的工具条不太一样,在颜色上要漂亮许多。其实这些程序的工具条上的图标均为256色,而普通应用程序在工具栏上所显示图标的颜色通常只有16色,这就决定了后者在视觉上远没有前者美观。由于Windows随系统而带的程序也是由开发人员编写的应用程序,这就说明通过程序编码可以实现256色甚至更多色彩的图标在工具栏上的显示。为此笔者经过摸索,通过MFC编程在应用程序中实现了高彩色工具条。现将实现的主要方法介绍如下,以飨广大读者。
基本设计思路
在实现高彩色工具条之前,先研究一下普通16色的工具条的实现过程,并从中总结出改进方法。在VC的资源视图中工具条是一个资源名为IDR_MAINFRAME的Toolbar型资源,并可通过在编辑按钮上的图标来完成工具条上图标的绘制。虽然在资源视图中工具条上各按钮的图标是相互独立的,但在存储时并非像图标一样保存为ico格式文件而是以bmp位图格式保存在磁盘上的。该位图是一个由工具条上的按钮图标组成的长条型位图图像,中间没有任何缝隙,在程序运行和在资源视图对工具条进行编辑时该图像首先装载到一个图像列表中,然后工具栏根据索引依次从图像列表中将图像显示到工具条的各个按钮上。由于VC限制工具栏上的图标不能超出16色,因此不论是在资源视图直接编辑位图还是用复制粘贴等手段均无法获取超出256色的工具条(注:用复制粘贴的方法虽然在编辑视图中可以暂时显示出256色的图标,但在程序运行时仍会退化成16色)。
由于不能在资源视图中通过编辑Toolbar资源实现16色以上的图标,加之工具条在显示时有并不直接从Toolbar获取图标而是从图像列表中读取,因此可以通过其他一些图像处理软件做好类似于工具条的bmp图像(仅颜色比普通工具条bmp图像丰富,其余完全一样),并以位图的形式加入到程序资源。在使用时,先将其读取到图像列表,这......
设计漂亮实用的菜单 VC(2006-09-24 12:46:00)
摘要:
设计漂亮实用的菜单
来自czvc 作者佚名
谈在VC中动态改变菜单
bull77 yesky
大部分Windows应用程序都使用下拉式菜单实现自己特定的函数,它使编程更加方便,不需要在程序中增加多个按钮以完成这些操作。大多数情况下,我们的程序编译生成后,菜单就确定了,不能再修改。然而,在很多情况下,程序要根据用户的自己设置产生不同的菜单以适应不同用户的要求,这就需要我们动态的改变菜单。接下来我们就分析如何动态的生成不同的菜单。
第一步:
运行AppWizard生成一个工程mymenu,接受所有的默认设置,除了下面一步:在step 1中选Single Document ,点击Finish按钮,此时我们生成了一个工程。编译运行,我们可以发现程序默认生成的菜单,接下来我们要对这个菜单进行修改。
第二步:
添加一个菜单资源,按如下步骤:菜单中选择InsertàResouceàMenuàNew ,我们可以看到添加了一个ID号为IDR_MENU1的菜单资源,至于菜单中的各项你就随便添加了,为了我们下面的编程,请你添加几项,第一列要包含几个子菜单。
第三步:
添加一个对话框资源,按如下步骤:菜单中选择InsertàResouceàDialogàNew ,我们可以看到添加了一个ID号为IDD_DIALOG1的对话框资源,添加六个按钮,如下图:
ID号依次为ID_CLEAR, ID_GOONE ,ID_GOTWO, ID_ADD, ID_ADDITEM, ID_EDIT ,为对话框定义类名为CChangeMenu, 双击添加的六个按钮增加处理函数,用默认函数名。
第四步:
在IDR_MAINFRAME菜单中添加一项,ID号为ID_SET,名为"弹出设置对话框",为其添加处理函数,添加如下代码:
CChangeMenu dlg;
dlg.DoModal();
当然,......