博文

串口API通信函数编程 (2007-08-20 11:40:00)

摘要: 16位串口应用程序中,使用的16位的Windows API通信函数:
①OpenComm()打开串口资源,并指定输入、输出缓冲区的大小(以字节计)
CloseComm() 关闭串口;
例:int idComDev;
idComDev = OpenComm("COM1", 1024, 128);
CloseComm(idComDev);
②BuildCommDCB() 、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置; 例:DCB dcb;
BuildCommDCB("COM1:2400,n,8,1", &dcb);
SetCommState(&dcb);
③ ReadComm 、WriteComm()对串口进行读写操作,即数据的接收和发送.
例:char *m_pRecieve; int count;
ReadComm(idComDev,m_pRecieve,count);
Char wr[30]; int count2;
WriteComm(idComDev,wr,count2);
16位下的串口通信程序最大的特点就在于:串口等外部设备的操作有自己特有的API函数;而32位程序则把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作。

在MFC下的32位串口应用程序
32位下串口通信程序可以用两种方法实现:利用ActiveX控件;使用API 通信函数。
使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API 通信函数的优缺点则基本上相反。

使用ActiveX控件:
VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。使用非常方便,但可惜的是,很少有介绍MSComm控件的资料。
⑴.在当前的Workspace中插入MSComm控件。
Project菜单------>Add to Project---->Components and Controls----->Registered
ActiveX Controls--->选择......

阅读全文(4821) | 评论:2

对共享数据段技术的补充说明!(2007-08-17 16:34:00)

摘要:对共享数据段技术的补充说明! 2006-11-30 20:35 上面的那篇文章有几点没有解释清楚,所以我决定再补充两点!“细节决定成败”,也许有一个细节没弄清楚,你就不能掌握并熟练应用这个知识点和技术!! 第一点:什么是共享数据段?为什么要用共享数据段??它有什么用途??
         在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。当进程在载入DLL时,操作系统自动把DLL地址映射到该进程的私有空间,也就是进程的虚拟地址空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间。也就是说每个进程所拥有的相同的DLL的全局数据,它们的名称相同,但其值却并不一定是相同的,而且是互不干涉的。 因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。在访问同一个Dll的各进程之间共享存储器是通过存储器映射文件技术实现的。也可以把这些需要共享的数据分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享。必须给这些变量赋初值,否则编译器会把没有赋初始值的变量放在一个叫未被初始化的数据段中。   #pragma data_seg预处理指令用于设置共享数据段。例如: #pragma data_seg("SharedDataName") HHOOK hHook=NULL; //必须在定义的同时进行初始化!!!! #pragma data_seg() 在#pragma data_seg("SharedDataName")和#pragma data_seg()之间的所有变量将被访问该Dll的所有进程看到和共享。再加上一条指令#pragma comment(linker,"/section:.SharedDataName,rws"),[注意:数据节的名称is case sensitive]那么这个数据节中的数据可以在所有DLL的实例之间共享。所有对这些数据的操作都针对同一个实例的,而不是在每个进程的地址空间中都有一份。   当进程隐式或显式调用一个动态库里的函数时,系统......

阅读全文(3584) | 评论:0

VC++常用数据类型及其操作详解 (2007-08-17 14:23:00)

摘要:一.              VC常用数据类型列表 二.              常用数据类型转化 2.1数学类型变量与字符串相互转换 2.2 CString及string,char *与其他数据类型的转换和操作 ●CString,string,char*的综合比较 ●数学类型与CString相互转化 ●CString与char*相互转换举例 ●CString 与 BSTR 型转换 ●VARIANT 型转化成 CString 型 2.3 BSTR、_bstr_t与CComBSTR 2.4 VARIANT 、_variant_t 与 COleVariant 附录CString及字符串转及操作详解   参考书籍:CSDN,<<MFC深入浅出(Second Edit)>>                                  一.VC常用数据类型列表     Type Default Size Description         基 础 类 型   全 是 小 写   说明:这些基础数据类型对于MFC还是API都是被支持的 boolean unsigned 8 bit , 取值TRUE/FALSE byte unsigned 8 bit, 整数,输出按字符输出 char unsigned 8 bit, 字符 ......

阅读全文(2904) | 评论:0

VC++下用MSComm控件实现串口通讯(2007-08-10 12:06:00)

摘要:   http://www.cndw.com/tech/program/2006051066221.asp VC++下用MSComm控件实现串口通讯 作者: 来源: 
阅读 1598 人次 , 2006-5-10 11:38:00 
首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对 Windows 通讯驱动程序的 API 函数的接口。 换句话说,只需要设置和监视MSComm控件的属性和事件。 打开所需串口后,需要考虑串口通信的时机。在接收或发送数据过程中,可能需要监视并响应一些事件和错误,所以事件驱动是处理串行端口交互作用的一种非常有效的方法。使用 OnComm 事件和 CommEvent 属性捕捉并检查通讯事件和错误的值。发生通讯事件或错误时,将触发 OnComm 事件,CommEvent 属性的值将被改变,应用程序检查 CommEvent 属性值并作出相应的反应 // 若是在SDI中使用该控件则要调用下两句,在对话框程序中该语句有MFC自己创建
// 所以不用人为添加
DWORD style=WS_VISIBLE;
m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1);
// 串口控件的初始化
DWORD style=WS_VISIBLE;
m_MSComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1);
if(m_MSComm.GetPortOpen()) //如果串口是打开的,则行关闭串口
{
 m_MSComm.SetPortOpen(FALSE);
}
m_MSComm.SetCommPort(1); //选择COM1
m_MSComm.SetInBuffe......

阅读全文(2360) | 评论:0

vc++消息映射学习笔记(1)消息种类 (2007-08-08 13:45:00)

摘要: vc++消息映射学习笔记(1)消息种类

(2005-04-05 16:32) 接口原理好难懂哦 ,只看到老师嘴动动的,哎,算了,看看VC吧,这个还算比较可爱点的呢:)。
 从学VC开始就我就一直看到消息这个词,谈到WINDOWS核心机制的时候也老是这么说,我对它的理解肤浅到知道点个按钮算一个消息,汗~。买这本盗版书花30两银子呢,血不能白流,我拼了这条了老命了。。。。
  在WINDOWS中应用程序有三种消息:窗口消息,命令消息,控件消息。靠,搞这么复杂$@FUCK@##.
 1。窗口消息一般与窗口内部运作有关,如创建窗口,绘制窗口,销毁窗口,通常,消息是从系统发到窗口,或从窗口发到系统。发送函数SendMessage()或者PostMessage()。包涵的三个变量解释如下:
 Message-------------WM_XXX
 wParam---------------定义的命令
 lParam----------------定义的命令
WM_XXX可以是许多窗口消息之一,如下列消息:
 WM_CREAT:告诉窗口初始化自己。
 WM_PAINT: 告诉窗口绘制自己。
 WM_MOUSEMOVE:告诉窗口鼠标移经它。
 当然还有好多,看MSDN吧~~~~

2 。命令消息
  命令消息通常与处理用户请求有关,当用户单击一个菜单或工具栏时,命令消息就产生了。并发送到能处理该消息的类或函数(如装载文本,保存选项等)。
  当用SendMessage(),PostMessage()发送命令消息时,变量Message,wParam,lParam的格式如下:
  Message--------------WM_COMMAND
  wParam----------------0或CommandID
  IParam-----------------0 ......

阅读全文(2828) | 评论:0

第四部分:消息映射 (2007-08-08 13:40:00)

摘要:http://www.vcfan.com/vc/article/article_other/20040913165014.htm   第四部分:消息映射  


  应用程序放在窗口中的任何用户界面对象都具有两种可控制的特性:1) 它的外观,2) 它响应事件的行为。在上一讲中,你已经学习了CStatic控制和如何使用样式属性来定制用户界面对象的外观。这些概念可用于MFC中的所有不同控制类。
  在本讲中,我们将介绍CButton控制,以理解消息映射和简单的事件处理。然后还要介绍使用CScrollBar控制的稍微复杂点的例子。
  理解消息映射
  在第二讲中,MFC程序不包括主要函数或时间循环。所有的事件处理都是作为CWinApp的一部分在后台处理的。因为它们是隐藏的,所以我们需要一种方法来告诉不可见的时间循环通告我们应用程序所感兴趣的事件。这需要一种叫做消息映射的机制。消息映射识别感兴趣的事件然后调用函数来响应这些事件。 
  例如,如果你要编写一个程序,当用户按下标有“退出”的按钮时要退出应用程序。在程序中,你编写代码来建立按钮:你指示按钮应如何动作。然后,为其父窗口建立用户单击按钮时的消息映射,它试图要传递消息给其父窗口。为了建立父窗口的消息,你要建立截取消息映射的机制,并且使用按钮的消息。当一指定的按钮事件发生时,消息映射会请求MFC调用一指定的函数。在这种情况下,单击退出按钮就是所感兴趣的事件。然后你把退出应用程序的代码放到指定的函数中。
  其它的工作就由MFC来做了。当程序执行时,用户单击“退出”按钮时,按钮就会自己加亮。然后MFC自动调用相应的函数,并且程序会终止。只使用很少的几行代码你就响应了用户事件。
  CButton类
  在上一讲中所讨论的CStatic控制是唯一不响应用户时间的控制。Windows中所有的其它控制都可响应用户事件。第一,当用户处理它们时,它们会自动更新其外观(例如,当用户单击按钮时,按钮会自己加亮以给用户一个反馈)。第二,每个不同的控制都要发送信息给你的代码以使程序能响应用户的需要。例如,当单击按钮时,按钮就会发送一个命令消息。如果你编写代码接收消息,则你的代......

阅读全文(2645) | 评论:0

6.6 自定义消息(2007-08-07 14:08:00)

摘要:http://book.csdn.net/bookfiles/100/1001002870.shtml   6.6 自定义消息  http://book.csdn.net/ 2006-8-24 15:10:00 图书导读 当前章节:6.6 自定义消息 ·6.3 消息处理 ·6.4 归纳整理 ·6.5 重定向消息 ·6.7 小结 ·21.1 实现目标与数据库设计 ·21.2 工程创建 用户可以为了特定的目的而定义自己的消息,这些消息也称为自定义消息。进行自定义消息的方法很简单,一般有两种:一种是利用ON_MESSAGE宏,另外一种就是创建自己的消息映射宏,这一种方法可以定制消息的参数类型,而不像前者只能使用固定的消息参数类型。但是一般情况下不需要定制消息的参数类型,因此这里对此不予介绍。本节主要介绍第一种比较常用的方法。 预定义常量值WM_USER(0x0400)是系统专门用来为实现处理用户自定义的消息而提供的接口,需要自定义消息时,只需要以如下形式定义即可:   WM_USER+X   其中X是一个非负整数值。另外,需要注意的是,用户自定义消息的值范围是有规定的,如6.1.3小节所述,其值介于WM_USER和0x7FFF之间,所以,为X取值时应该注意这个问题。下面结合具体的实例来详细介绍自定义消息的实现方法。 1.自定义消息WM_CUSTOMIZE 首先,在CCDlg类的头文件中加入如下代码:   #define WM_CUSTOMIZE  WM_USER+1   其中WM_CUSTOMIZE即是所要定义的消息。然后,仍在头文件中加入Customize的声明:       // Generated message map functions     //{{AFX_MSG(CCDlg)     afx_msg void OnCmd();     //}}AFX_MSG     afx_msg void Customize(WPARAM wPara......

阅读全文(1858) | 评论:0

VC中Combo Box控件使用大全(2007-08-06 18:01:00)

摘要:http://www.dayjs.com/html/C/kjcz/20070726/7623.html   一、如何添加/删除Combo Box内容
1,在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。换行用ctrl+回车。
2,在程序初始化时动态添加
如: //控件内容初始化
 CString strTemp;
 ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除现有所有内容
 for(int i=1;i<=100;i++)
 {
  strTemp.Format("%d",i);
  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
 }
3,下拉的时候添加
如: CString strTemp;
 int iCount=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCount();//取得目前已经有的行数
 if(iCount<1)//防止重复多次添加
 {
  ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();
  for(int i=1;i<=100;i++)
  {
   strTemp.Format("%d",i);
   ((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);
  }
 }
4,删除
DeleteString( UINT nIndex )//删除指定行,
5,插入
InsertString( ......

阅读全文(7383) | 评论:1

VC++ Combo Box/Combo Box Ex控件(2007-08-06 17:26:00)

摘要:http://www.d9soft.com/article/259/Article6985_1.htm     组合窗口是由一个输入框和一个列表框组成。创建一个组合窗口可以使用成员函数:
BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对列表控件指明专门的风格。
CBS_DROPDOWN 下拉式组合框
CBS_DROPDOWNLIST 下拉式组合框,但是输入框内不能进行输入
CBS_SIMPLE 输入框和列表框同时被显示
LBS_SORT 所有的行按照字母顺序进行排序

由于组合框内包含了列表框,所以列表框的功能都能够使用,如可以利用:
int AddString( LPCTSTR lpszItem )添加行,
int DeleteString( UINT nIndex )删除指定行,
int InsertString( int nIndex, LPCTSTR lpszItem )将行插入到指定位置。
void ResetContent( )可以删除列表框中所有行。
通过调用int GetCount( )得到当前列表框中行的数量。

如果需要得到/设置当前被选中的行的位置,可以调用int GetCurSel( )/int SetCurSel(int iIndex)。通过调用int GetLBText( int nIndex, LPTSTR lpszText )得到列表框内指定行的字符串。

此外通过调用int FindString( int nStartAfter, LPCTSTR lpszItem )可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
int SelectString( int nStartAfter, LPCTSTR lpszItem )可以选中包含指定字符......

阅读全文(1763) | 评论:0

VC++ List Ctrl控件(2007-08-06 17:25:00)

摘要:列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。MFC中使用CListCtrl类来封装列表控件的各种操作。通过调用BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格:
LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示
LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。
LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点
LVS_SINGLESEL 同时只能选中列表中一项
首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:

CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);
如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);

通过调用int InsertItem( int nItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。除LVS_REPORT风格外其他三种风格都只需要直接调用InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。

通过调用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol为列的位置,从零开始,lpszColumnHeading为显示的列名,nFormat为显示对齐方式,nWidth为显示宽度,......

阅读全文(7312) | 评论:0