【编程开发】AspAsp.NetCGIPHPJspXMLPERLC++C#VCVBDelphiPowerBuilderJAVA汇编数据库编程移动开发其它语言

您现在的位置:首页 > 网络学院 > 编程开发 > VC > Windows平台下基于串口的数据采集系统

Windows平台下基于串口的数据采集系统

来源: 作者: 日期:2006-12-27

【聚杰网VC】Windows平台下基于串口的数据采集系统

 4、程序关键代码

  基于以上介绍的方法,作者开发了一套Windows环境下基于串口的数据采集系统,经过长时间的测试,运行良好。
程序接收到用户的开始测试命令后,打开并设置串口。采用非重叠I/O模式,并设置超时值使得ReadFile函数在没有串口数据情况下立即返回。程序使用定时器来定时读取串口数据。实践证明,这种方式编程容易,结构清晰,并且占用系统资源较少。下面给出程序关键代码。

  4.1 打开并设置串口

//READBUFFER和WRITEBUFFER是
//用户自己定义的两个宏
BOOL InitCOM(LPCTSTR strPort,
DWORD BaudRate, //波特率
BYTE ByteSize, //字节长度
BYTE Parity, //校验位
BYTE StopBits, //停止位
DWORD dwInQueue = READBUFFER, //读缓冲区大小
DWORD dwOutQueue = WRITEBUFFER //写缓冲区大小
)
{
 DCB dCB;
 COMMTIMEOUTS ct;

 //打开串口,并得到串口句柄
 m_hCOM = CreateFile( strPort,
 GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,0, NULL);
 if(m_hCOM==INVALID_HANDLE_VALUE)
  return FALSE;

 //初始化串口,设置读写缓冲区大小
 if( !SetupComm(m_hCOM, dwInQueue, dwOutQueue) ||
!PurgeComm(m_hCOM, PURGE_TXCLEAR|PURGE_RXCLEAR) )
 {
  CloseHandle(m_hCOM);
  m_hCOM=INVALID_HANDLE_VALUE;
  return FALSE;
 }
 
 //设置DCB结构
 if(!GetCommState(m_hCOM, &dCB))
 {
  CloseHandle(m_hCOM);
  m_hCOM=INVALID_HANDLE_VALUE;
  return FALSE;
 }
 dCB.BaudRate = BaudRate;
 dCB.ByteSize = ByteSize;
 dCB.Parity = Parity;
 dCB.StopBits = StopBits;
 if(!SetCommState(m_hCOM, &dCB))
 {
  CloseHandle(m_hCOM);
  m_hCOM= INVALID_HANDLE_VALUE;
  return FALSE;
 }

 //设置超时值,使得当串口没有数据时,
 //ReadFile函数立即返回
 ct.ReadIntervalTimeout= MAXDWORD;
 ct.ReadTotalTimeoutConstant= 0;
 ct.ReadTotalTimeoutMultiplier= 0;
 ct.WriteTotalTimeoutConstant= 0;
 ct.WriteTotalTimeoutMultiplier=0;
 if(!SetCommTimeouts(m_hCOM, &ct))
 {
  CloseHandle(m_hCOM);
  m_hCOM= INVALID_HANDLE_VALUE;
  return FALSE;
 }
 return TRUE;
}

  代开串口并设置成功后,返回TRUE,否则返回FALSE。

  4.2 设置定时器,并定时读串口

//设置定时读串口
SetTimer(hwnd,NULL, uElapse,Reading)
//uElapse是定时器间隔时间(以毫秒为单位),
//视底层串口数据发送电路而定,
//一般使用50毫秒~5000秒
//Reading是读串口函数
VOID CALLBACK Reading( HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
 unsigned char buffer[READBUFFER];
 if ( ReadFile(m_hCOM, buffer, pchBuffer, READBUFFER, &dwReadNum, NULL) && dwReadNum)
 {
  //有dwReadNum个字节读入
  //处理读入的数据
  //...
 }
}

上一页 1 2

评论   点击查看全部评论
您的评论参与,将为聚杰带来更大的动力!请不要吝啬!
快速回复
请使用文明语言让我们维护健康绿色网络环境!

匿名发表   验证码: