打印

谁用VC++写过串口通信程序

[复制链接]
3000|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yangping1220|  楼主 | 2009-7-4 18:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用过串口调试精灵,但是真正用来接受有用的数据还是挺麻烦的,因为是十六进制的,数据排列不规则。我自己试着写了一个程序但是碰到了好多问题。如果有感兴趣的,或写过的,请帮帮小弟啊。谢谢了

相关帖子

沙发
李冬发| | 2009-7-4 19:40 | 只看该作者

从MSDN里找个例子吧

使用特权

评论回复
板凳
naren| | 2009-7-5 01:20 | 只看该作者

应该还行吧

写过一个串口工具,感觉麻烦一点的就是对按键处理上。

使用特权

评论回复
地板
cool_coder| | 2009-7-5 13:44 | 只看该作者

去code guru上找吧,N年前就有了

使用特权

评论回复
5
chunk| | 2009-7-5 23:28 | 只看该作者

这个RAR包中有示例

本帖最后由 chunk 于 2012-12-24 14:43 编辑

已删除

使用特权

评论回复
6
badbird1234| | 2009-7-9 07:20 | 只看该作者

也是正在研究

不过很简单
自己写个控件吧

使用特权

评论回复
7
winloop| | 2009-7-9 08:16 | 只看该作者

如果需要的话我给你发个我写的应用调试软件

我给起的名字是串口大师

使用特权

评论回复
8
machunshui| | 2009-7-9 08:25 | 只看该作者

一个串口类

// Serial.h: interface for the CSerial class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SERIAL_H__33AC291A_EF86_4555_A021_4EAF73986F60__INCLUDED_)
#define AFX_SERIAL_H__33AC291A_EF86_4555_A021_4EAF73986F60__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define FC_DTRDSR       0x01
#define FC_RTSCTS       0x02
#define FC_XONXOFF      0x04
#define ASCII_BEL       0x07
#define ASCII_BS        0x08
#define ASCII_LF        0x0A
#define ASCII_CR        0x0D
#define ASCII_XON       0x11
#define ASCII_XOFF      0x13
#define MAX_FRAMGAPE      10  // 祯间隔时间

class CSerial  
{

public:
    CSerial();
    virtual ~CSerial();
    BOOL Open( int nPort, int nBaud, int nDataBit, int nStopBit, int nParity );
    BOOL Close( void );
    
    int ReadData(unsigned char *, int );
    int SendData( BYTE *, int );
    int ReadDataInLen( void );
    
    BOOL IsOpened( void ){ return( m_bOpened ); }
    
protected:
    BOOL WriteCommByte( unsigned char );
    
    HANDLE m_hIDComDev;
    OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
    BOOL m_bOpened;

   DWORD dwErrorFlags;
    COMSTAT ComStat;
};

extern CSerial * pCom;
#endif // !defined(AFX_SERIAL_H__33AC291A_EF86_4555_A021_4EAF73986F60__INCLUDED_)













// Serial.cpp: implementation of the CSerial class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Serial.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

CSerial * pCom = NULL ;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSerial::CSerial()
{
    memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
     memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );
    m_hIDComDev = NULL;
    m_bOpened = FALSE;
}

CSerial::~CSerial()
{
    Close();
}

BOOL CSerial::Open( int ComId, int nBaud,int nDataBit,int nStopBit,int nParity )
{

    if( m_bOpened ) return( TRUE );

    char szPort[15];
    char szComParams[50];
    DCB dcb;
    
    wsprintf( szPort, "COM%d", ComId );
    m_hIDComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL| FILE_FLAG_OVERLAPPED, NULL );
    if( m_hIDComDev == NULL ) return( FALSE );

    memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
     memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

    COMMTIMEOUTS CommTimeOuts;
    CommTimeOuts.ReadIntervalTimeout = 1000;
    CommTimeOuts.ReadTotalTimeoutMultiplier = 500;
    CommTimeOuts.ReadTotalTimeoutConstant = 5000;
    CommTimeOuts.WriteTotalTimeoutMultiplier = 500;
    CommTimeOuts.WriteTotalTimeoutConstant = 5000;
    SetCommTimeouts( m_hIDComDev, &CommTimeOuts );

    wsprintf( szComParams, "COM%d:%d,%d,%d,%d", ComId, nBaud,nDataBit,nStopBit,nParity );
    TRACE(szComParams);
    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 = nBaud;
    dcb.ByteSize = nDataBit;
    dcb.StopBits=nStopBit;

    dcb.Parity=nParity;
    BOOL b1,b2;
    
    b1=SetCommState( m_hIDComDev, &dcb );
    DWORD dwError = GetLastError();
    b2=SetupComm( m_hIDComDev, 10000, 10000 );

    if(!b1 || ! b2||
        m_OverlappedRead.hEvent == NULL ||
        m_OverlappedWrite.hEvent == NULL )
    {
        dwError = GetLastError();
        if( m_OverlappedRead.hEvent != NULL ) 
            CloseHandle( m_OverlappedRead.hEvent );
        if( m_OverlappedWrite.hEvent != NULL )
            CloseHandle( m_OverlappedWrite.hEvent );
        CloseHandle( m_hIDComDev );
        return( FALSE );
    }

    m_bOpened = TRUE;

    return( m_bOpened );

}

BOOL CSerial::Close( void )
{

    if( !m_bOpened || m_hIDComDev == NULL ) return( TRUE );

    if( m_OverlappedRead.hEvent != NULL ) 
        CloseHandle( m_OverlappedRead.hEvent );
    if( m_OverlappedWrite.hEvent != NULL ) 
        CloseHandle( m_OverlappedWrite.hEvent );
    CloseHandle( m_hIDComDev );
    m_bOpened = FALSE;
    m_hIDComDev = NULL;

    return( TRUE );

}

BOOL CSerial::WriteCommByte( unsigned char ucByte )
{
    BOOL bWriteStat;
    DWORD dwBytesWritten;

    bWriteStat = WriteFile( m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite );
    if( !bWriteStat && ( GetLastError() == ERROR_IO_PENDING ) )
    {
        if( WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 ) ) dwBytesWritten = 0;
        else{
            GetOverlappedResult( m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE );
            m_OverlappedWrite.Offset += dwBytesWritten;
        }
    }

    return( TRUE );

}

int CSerial::SendData( BYTE *buffer, int size )
{

    if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

    DWORD dwBytesWritten = 0;
    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
    if( ComStat.cbOutQue> 0)
    {
     PurgeComm(m_hIDComDev,PURGE_TXABORT| PURGE_TXCLEAR);
     Sleep(100);
    }
    WriteFile( m_hIDComDev, (LPSTR) buffer, size, &dwBytesWritten, &m_OverlappedWrite );
   dwBytesWritten=size;
    return( (int) dwBytesWritten );
}

int CSerial::ReadDataInLen( void )
{

    if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );

    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );

    return( (int) ComStat.cbInQue );

}

int CSerial::ReadData(unsigned char *buffer, int limit )
{
    if( !m_bOpened || m_hIDComDev == NULL ) return( 0 );
    DWORD dwBytesRead=0, dwErrorFlags;
    ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
    if( !ComStat.cbInQue )
        return( 0 );
   limit=ComStat.cbInQue;//取得缓冲区的数据长度,以便读入
   ReadFile( m_hIDComDev, buffer,limit , &dwBytesRead, &m_OverlappedRead  );
    return( (int) dwBytesRead );
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

1

粉丝