用VC++6.0实现PC机与单片机之间串行通信的方法

用VC++6.0实现PC机与单片机之间串行通信的方法,第1张

用VC++6.0实现PC机与单片机之间串行通信的方法,第2张

详细介绍了Windows环境下PC机与单片机串行通信的几种方法,并给出了用Visual VC+++6.0编写的PC机程序和用C51编写的单片机通信程序。实际应用表明,该系统运行稳定可靠。

关键词Visual C++类串行通信


工业控制领域(如DCS系统)经常涉及串行通信。为了实现微机与单片机之间的数据交换,人们使用了各种方法来实现串行通信,如在DOS下使用汇编语言或C语言,但在Windows环境下存在一些困难和缺点。在Windows操作系统已经占据主导地位的情况下(除此之外,有些系统根本不支持Windows2000等DOS),在Windows环境下开发串行通信技术显得越来越重要。

C++6.0是微软在1998年推出的开发环境。它以其强大的功能、友好的界面、32位面向对象编程和Active X的灵活性受到广大软件开发者的青睐,被广泛应用于各个领域。目前用VC++开发串口通信通常有以下几种方法:一是使用Windows API通信函数;其次是VC _inp、_inpw、_inpd、_outp、_outpw、_outpd等标准通信函数。用于直接操作串行端口。三是使用微软Visual C++的通信控件(MSComm);第四种是第三方写的通信类。上述方法中的第一种被广泛使用,但是由于其复杂性和高度的专业化而难以使用。第二个需要知道硬件电路结构原理;第三种方法看似简单,只需要对串口进行简单的配置,但是因为莫名其妙的VARIANT类,不太好用。第四种方法是使用一个CSerial类进行串行通信(这个类是第三方提供的),只要了解这个类的几个成员函数就可以轻松使用。利用CSerial类方便地实现了固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。下面将结合实例给出几种实现串行通信的方法。

1 Windows API通信函数方法

有26个与通信相关的Windows API函数,但主要的有:

Create()使用“comn”(n是序列号)作为打开串口的文件名。

ReadFile()读取串口。

WriteFile()写串口。

CloseHandle()关闭串口句柄。初始化时需要注意的是,CreateFile()函数中的串口共享模式要设置为0,串口为非共享设备,其他类似于一般的文件读写。API实现的源代码如下。

1.1发送程序

//声明全局变量

处理m _ hIDComDev

OVERLAPPED m_OverlappedRead,m _ Over lappedWrite

//初始化串行端口

void CSerialAPIView::OnInitialUpdate()

{

CView::OnInitialUpdate();

char szComParamsucSet =(unsigned char)((FC _ RTS cts & FC _ XONXOFF)!= 0);;

DCB dcb

Memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));

Memset(&m_OverlappedWrite,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("无法打开串口!");

goto endd

}

memset(&m_OverlappedRead,0,sizeof(OVERLAPPED));

memset(&m_OverlappedWrite,0,sizeof(OVERLAPPED));

comm time out comm time out;

通信超时。ReadIntervalTimeout = 0×FFFFFFFF;

通信超时。ReadTotalTimeoutMultiplier = 0;

通信超时。ReadTotalTimeoutConstant = 0;

通信超时。WriteTotalTimeoutMultiplier = 0;

通信超时。WriteTotalTimeoutConstant = 5000;

SetCommTimeouts(m_hIDComDev,& 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);

GetCommState(m_hIDComDev,& dcb);

dcb。波德拉特= 9600;

dcb。ByteSize = 8;

无符号字符ucSet

ucSet =(unsigned char)((FC _ RTS cts & FC _ DTR DSR)!= 0);

ucSet =(unsigned char)((FC _ RTS cts & FC _ RTS cts)!= 0);

[50]

如果(!SetCommState(m_hIDComDev,&dcb)

!SetupComm(m_hIDComDev,10000,10000)

m_OverlappedRead。hEvent ==NULL

m_OverlappedWrite。hEvent ==NULL)

{

DWORD dwError = GetLastError();

if(m _ overlappedred。hEvent!= NULL)close handle(m _ overlappedred。he vent);

if (m_OverlappedWrite。hEvent!= NULL)close handle(m _ overlapped write。he vent);

close handle(m _ hIDComDev);

}

endd:

}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 用VC++6.0实现PC机与单片机之间串行通信的方法

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情