资源描述:
《VC串口通信(3) - zw0558的专栏 - CSDN博客》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、VC串口通信(3)-zw0558的专栏-CSDN博客.txt你妈生你的时候是不是把人给扔了把胎盘养大?别把虾米不当海鲜。别把虾米不当海鲜。VC串口通信(3)收藏工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows环境下串行通信技术就显得日益重要。VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界
2、面,32位面向对象的程序设计及ActiveX的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用WindowsAPI通信函数;二是利用VC的标准通信函数inp、inpw、inpd、outp、outpw、outpd等直接对串口进行操作;三是使用MicrosoftVisualC++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT类,使用也
3、不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。以下将结合实例,给出实现串行通信的几种方法。1WindowsAPI通信函数方法 与通信有关的WindowsAPI函数共有26个,但主要有关的有:CreateFile()用“comn”(n为串口号)作为文件名就可以打开串口。ReadFile()读串口。WriteFile()写串口。CloseHandle()关闭串口句柄。 初始化时应注意CreateFi
4、le()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。1.1发送的例程//声明全局变量HANDLEm_hIDComDev;OVERLAPPEDm_OverlappedRead,m_OverlappedWrite;//初始化串口voidCSerialAPIView::OnInitialUpdate(){CView::OnInitialUpdate();CharszComParams[50];DCBdcb;Memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));Memset(&m_OverlappedW
5、rite,0,sizeof(OVERLAPPED));m_hIDComDev=NULL;m_hIDComDev=CreateFile(“COM2”,GENERIC_READ│GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL│FILE_FLAG_OVERLAPPED,NULL);if(m_hIDComDev==NULL){AfxMessageBox(“Cannotopenserialport!”);gotoendd;}memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));memset(&m
6、_OverlappedWrite,0,sizeof(OVERLAPPED));COMMTIMEOUTSCommTimeOuts;CommTimeOuts.ReadIntervalTimeout=0×FFFFFFFF;CommTimeOuts.ReadTotalTimeoutMultiplier=0;CommTimeOuts.ReadTotalTimeoutConstant=0;CommTimeOuts.WriteTotalTimeoutMultiplier=0;CommTimeOuts.WriteTotalTimeoutConstant=5000;SetCommTimeouts(m_hID
7、ComDev,&CommTimeOuts);Wsprintf(szComparams,“COM2:9600,n,8,1”);m_OverlappedRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);m_OverlappedWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);dcb.DCBlength=sizeof(DCB);GetComm