VC2010_串口调试记录

原创 2015年07月07日 13:27:33

根据上位机项目需求,需实现定时500ms发送数据帧的功能。目前使用定时器函数(SetTimer、KillTimer及Windows消息OnTimer)定时500ms,分别用同步、异步及MSComm控件三种方式实现发送及接收功能。

关键函数整理如下:

一、异步方式

a、串口初始化

DWORD dwError;
hCom=CreateFile( "COM4",  
GENERIC_READ | GENERIC_WRITE, 
0, 
0, 
OPEN_EXISTING,
//FILE_ATTRIBUTE_NORMAL,//同步方式
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式
0);
if (hCom == INVALID_HANDLE_VALUE)
{
MessageBox(_T("ERROR1"));
dwError=GetLastError();
   return FALSE;
}
dcb.DCBlength=sizeof(DCB);
GetCommState(hCom,&dcb); 
dcb.BaudRate=38400; //波特率为9600 
dcb.ByteSize=8; //每个字节有8位 
dcb.Parity=NOPARITY; //无奇偶校验位 
dcb.StopBits=ONESTOPBIT; //两个停止位 
if(!SetCommState(hCom,&dcb))
{
MessageBox(_T("ERROR2"));
dwError=GetLastError();
   return FALSE;
}
SetupComm(hCom,2048,2048); //输入缓冲区和输出缓冲区的大小都是1024 
//设置超时 
GetCommTimeouts(hCom,&TimeOuts);
//设定读超时 
TimeOuts.ReadIntervalTimeout=100; 
TimeOuts.ReadTotalTimeoutMultiplier=1; 
TimeOuts.ReadTotalTimeoutConstant=100; 
//设定写超时 
TimeOuts.WriteTotalTimeoutMultiplier=1; 
TimeOuts.WriteTotalTimeoutConstant=200; 
if(!SetCommTimeouts(hCom,&TimeOuts)) 
{
MessageBox(_T("ERROR3"));
dwError=GetLastError();
   return FALSE;
}

b、发送函数

bool SIMULATION::UartWrite(unsigned char buffer[], DWORD dwBytesWritten)
{
    DWORD dwErrorFlags;
    COMSTAT ComStat;
OVERLAPPED m_osWrite;
    BOOL bWriteStat;
memset(&m_osWrite,0,sizeof(OVERLAPPED));
m_osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,buffer,dwBytesWritten,&dwBytesWritten,&m_osWrite);
    if(!bWriteStat)
      {
             if(GetLastError()==ERROR_IO_PENDING)
             {
                   WaitForSingleObject(m_osWrite.hEvent,200);
  PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
  return TRUE;
             }
return FALSE;
      }
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return FALSE;
}

c、接收函数

bool SIMULATION::UartRead(unsigned char buffer[], DWORD dwBytesRead)
{
//异步读串口的示例代码:
COMSTAT ComStat; 
DWORD dwErrorFlags; 
BOOL bWriteStat; 
DWORD dwError;
memset(&m_osRead,0,sizeof(OVERLAPPED));
m_osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ClearCommError(hCom,&dwErrorFlags,&ComStat);
BOOL bReadStatus=ReadFile(hCom,buffer,dwBytesRead,&dwBytesRead,&m_osRead);
if(!bReadStatus)
{
if(GetLastError()==ERROR_IO_PENDING)
{
//WaitForSingleObject(m_osRead.hEvent,100);
GetOverlappedResult(hCom,&m_osRead,&dwBytesRead,TRUE);
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
if(dwBytesRead>0)
return TRUE;
}
}
PurgeComm(hCom, PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
return FALSE;

}

硬件实测定时器时间间隔为513ms左右。无法解决。

版权声明:本文为博主原创文章,未经博主允许不得转载。

基于VS2010 MFC 编写的串口调试助手

  • 2016年05月24日 20:34
  • 25.91MB
  • 下载

串口调试助手--VC++ 2010 开发

该串口调试助手使用 VC++ 2010 开发,源代码附带详细注释; 可实现的功能: 1.串口设置:串口号,波特率,校验位,数据位,停止位 1.字符格式发送和接收 2.十六进制格式发送和...
  • yinshunjun123
  • yinshunjun123
  • 2015年09月12日 21:11
  • 468

VC++ 实现一个简单串口调试助手(功能少,但封装合理)

最近很多复习练手,所以很赶工,代码写的也不够精品吧,直接上效果图和源码下载地址吧 这个例子是使用纯API实现的,而且可以不仅仅用在MFC中,但是代码质量还需进一步打磨(还需要加一些回调),先贴一份可以...
  • lightspear
  • lightspear
  • 2017年02月12日 22:37
  • 1216

基于SerialPort的串口调试助手代码-VS2010(MFC).zip

  • 2014年09月13日 10:57
  • 2.19MB
  • 下载

VC2010_串口调试记录(二)

由于无法解决串口发送使得定时器时间与设定不同的问题,今天使用MSCOMM控件发送不同数据量,测试对于定时器影响。 void Ctest_20150708_mscommDlg::OnBnClicked...
  • sunedi561
  • sunedi561
  • 2015年07月08日 16:31
  • 152

VC2010_串口调试记录(三)

连续两天调试MSComm控件 无法接收: 现象:safearray_inp=variant_inp;//变量转换 这句话报错 方法:设置控件为二进制模式,而非文本模式 void ...
  • sunedi561
  • sunedi561
  • 2015年07月10日 15:20
  • 151

linux串口调试记录

(1)问题1:不知到 请求命令:07 12 41 01 52 f8 03的数据格式 解决:unsigned  char  通常定义#define uchar unsigned char (2)打印...
  • yumishou
  • yumishou
  • 2014年04月11日 18:41
  • 463

S 串口编程 详解6 串口调试助手整个程序代码

S  串口编程 详解6 串口调试助手整个程序代码 CSerialPort类的代码见   串口编程 详解2   CSerialPort类   (SerialPort.h头文件和SerialPort.c...
  • gdliweibing
  • gdliweibing
  • 2013年10月31日 16:39
  • 3279

Qt从零开始制作串口调试助手-(第一章、工程文件建立)-Creator_Ly

第一章、工程文件建立 1、在E盘下创建文件夹,E:\Qt_Workspace\UartAssistant。 2、打开Qt Creator,点击 文件->新建文件或项目。   3、选择应用程序,Qt...
  • Creator_Ly
  • Creator_Ly
  • 2015年11月08日 21:30
  • 3007

C#3串口调试助手

这个是刚刚看了
  • Blue___Ocean
  • Blue___Ocean
  • 2014年07月31日 15:49
  • 3279
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC2010_串口调试记录
举报原因:
原因补充:

(最多只允许输入30个字)