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

文章作者 100test 发表时间 2007:12:01 14:27:58
来源 100Test.Com百考试题网


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

关键词 Visual C 类 串行通信


工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。

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

1 Windows API通信函数方法

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

CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。

ReadFile() 读串口。

WriteFile() 写串口。

CloseHandle() 关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。

1.1 发送的例程

//声明全局变量

HANDLE m_hIDComDev;

OVERLAPPED m_OverlappedRead, m_Over lappedWrite.

//初始化串口

void CSerialAPIView::OnInitialUpdate()

{

CView::OnInitialUpdate().

Char szComParams[50].

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(“Can not open serial port!”).

goto endd.

}

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

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

COMMTIMEOUTS CommTimeOuts.

CommTimeOuts. ReadIntervalTimeout=0×FFFFFFFF.

CommTimeOuts. ReadTotalTimeoutMultiplier = 0.

CommTimeOuts. ReadTotalTimeoutConstant = 0.

CommTimeOuts. WriteTotalTimeoutMultiplier = 0.

CommTimeOuts. 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. BaudRate = 9600.

dcb. ByteSize= 8.

unsigned char ucSet.

ucSet = (unsigned char) ((FC_RTSCTS&.FC_DTRDSR) != 0).

ucSet = (unsigned char) ((FC_RTSCTS&.FC_RTSCTS) ! = 0).

ucSet = (unsigned char) ((FC_RTSCTS&.FC_XONXOFF) ! = 0).

if (!SetCommState(m_hIDComDev, &.dcb)‖

!SetupComm(m_hIDComDev,10000,10000)‖

m_OverlappedRead. hEvent ==NULL‖

m_OverlappedWrite. hEvent ==NULL)

{

DWORD dwError = GetLastError().

if (m_OverlappedRead. hEvent != NULL) CloseHandle(m_OverlappedRead. hEvent).

if (m_OverlappedWrite. hEvent != NULL) CloseHandle(m_OverlappedWrite. hEvent).

CloseHandle(m_hIDComDev).

}

endd:

.

}

相关文章


系统安装初步之如何将A:磁碟与B:磁碟互调
制作风格独特的按钮—用VC6扩展CButton类
如何以指定的颜色深度启动xwindow
如何在Windows应用程序中实现电子注册功能
用VC 6.0实现PC机与单片机之间串行通信的方法
如何在VC 程序中获得其他程序的图标
如何在指定矩形中旋转显示文字
Vista不支持LinuxSamba服务的解决办法
Windows下用sftp巧妙打造安全传输
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛