利用VC++实现串口通信的方法有多种,我们采取直接调用Window API中的一系列标准的串口通信函数,直接用这些标准函数来完成Windows下面的串口通信编程[11]。利用WindowsAPI函数控制利用API 函数实现对RS232串口通信的访问,在实现控制通信中,我们必定要调动3个函数来实现对串口的控制: CreatFile()函数实现串口初始化并打开串口;
ReadFile()函数接收串口传递过来的二进制流并返回数据到接收缓冲区中
WriteFile()把应用程序发出的指令送到发送缓冲区以供串口接收1. 打开串口
以下程序用于以同步方式打开串口COM1;
HANDLE hCom;
DWORD dwErrorHcomm=CreateFile(“COM1”,GENERIC_READ|GENERIC_WRITE
,0, NULL,OPEN_EXISTING, 0, NULL);
if (hComm==(HANDLE)0Xffff)
{
dwError=GetLastError();
MessageBox(dwError);
}
2. 配置串口
配置串口是通过改变设备控制块DCB(Device Control Block)的成员变量值来实现的,程序实现如下:
DCB dcb
dcb.BaudRate=9600;//波特率为9600bps
dcb.ByteSize=8;//数据位8位
dcb.Parity=EVENPARTTY;//有校验
dcb.StopBits=ONESTOPRTT; //一个停止位
SetCommState(hCom,&dcb);
3. 数据读写
对串口进行读写与对文件进行读写所用的函数相同,具体为可采用查询、同步、异步或事件驱动等方法对串口进行读写所用函数如下所示:
bReadStatus=ReadFile(hCom,buffer,length,&length &m_lpOverlapped);
if(!bReadStatus)
{
if(GetLastError()=ERROR_IO_PENDING)
{
WaitForSingleObject(m_lpOverlapped,hEvent,1000);
return((char)length);
}
return 0;
}
//写入函数程序为:
bWriteStatus=WriteFile(hCom,buffer,length,&length,&m_lpOverlapped)
if(!bWriteStatus)
{
if(GetLastError()=ERROR_IO_PENDING)
{
WaitForSingleObject(m_lpOverlapped, hEvent,1000);
return((char)length);
}
return 0;
}
4. 程序的编制
用VC++进行程序的编制首先要对串口进行初始化,设定端口,通信速率和校验方式,并在使用前打开串口,程序部分如下:
{
Cdialog::OnInitDialog();//TODO: Add extra initialization here
m_comm.SetCommPort(1);//选择串口1
if(! m_comm.GetPortOpen())
m_comm.SetPortOpen(TRUE);//打开串口1
m_comm.SetSettings(“9600,n,8,1”); //设置串口参数
m_comm.SetRThreshold(1);
m_comm.SetInputMode(1);//设置二进制模式
return TRUE;
}
除了串口的位置和基本串口参数(数据传输速率9600bps,1位开始位,8位数据位,1位停止位,一位奇偶校验)设置外,为了实现实时数据采集功能,接受数据的读写要尽可能的快速,则设置RTHreshold=1即接收缓冲区收到一个字节产生OnComm事件InputLen=1每次读取一个字节。如果 PC上位机在一定时间内不能将数据处理完,接收缓冲区会滞留数据,数据会产生丢失现象,我们必须对接受缓冲区进行适当的设置。我们利用API函数实现串口通信的方法,实现了罗经及发射机对上位机串行通信的功能。