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左右。无法解决。

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

相关文章推荐

串口调试助手VC2010源代码

  • 2017年11月12日 22:04
  • 886KB
  • 下载

vc2010串口通信(使用mscomm控件)

1.下载mscomm控件; (下载地址:http://download.csdn.net/detail/tianhen791/4023983) 2.安装注册控件:下载完成后解压->点击...

VC++ VS2010 MFC配合串口控件MSCOMM 的实际应用 - 打码机上位机软件 Demo 含例程

希望能够帮助到,正好需要根据项目定制一个自动输入设备的,简单的上位机软件的,非科班出身的工程师们,节约学习和调试的时间。...
  • jomoly
  • jomoly
  • 2017年02月14日 15:01
  • 619

VC2010基于MSComm32控件的串口通讯

最近有点时间,所以学习一下基于VC的串口通讯。 在VC下实现串口通讯有两种方法:        一种是直接使用 MSComm32 控件,这种方法比较简单,只需要之直接调用相应的控件类的接口就可以对...
  • xbmoxia
  • xbmoxia
  • 2014年03月25日 16:40
  • 1880

VC2010如何使用串口

http://blog.163.com/ymkigeg@yeah/blog/static/823953012012117113820923/

VC++2010 mscomm 串口通信

  • 2013年05月23日 09:25
  • 753KB
  • 下载

VC++ VS2010对比VC6 串口控件的方法变更

MSDN里面没有对VC++下面的CMSCOMM(或者新版本叫IMSCOMM)做出说明,这样有一份可用的相对正确的参考就很重要。...
  • jomoly
  • jomoly
  • 2017年02月14日 14:37
  • 335

VC2010写的简单的串口精灵

  • 2013年04月03日 15:24
  • 221KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC2010_串口调试记录
举报原因:
原因补充:

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