回 帖 发 新 帖 刷新版面

主题:串口通信数据丢失的问题

我用API写串口通信的程序,发送的数据0x11收不到,自己看了半天,是因为 XoffChar的问题。后来加上
dcb.XoffChar =FALSE;
dcb.XonChar =FALSE;之后,能收到0x11了。可是0x00却收不到了!!!下面是我认为于此有关的程序:


#if !defined(_COMM_ACCESS_FUNCTIONS_AND_DATA)
#define _COMM_ACCESS_FUNCTIONS_AND_DATA

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define EVENTCHAR               0x0d
#define MAXBLOCKLENGTH          59//130


// Flow control flags

#define FC_DTRDSR       0x01
#define FC_RTSCTS       0x02
#define FC_XONXOFF      0x04


// ascii definitions

#define ASCII_XON       0x11//先前的错在这里
#define ASCII_XOFF      0x13

class CComStatus
{
public:
    HANDLE m_hCom;
    BYTE m_bComId;

    BYTE m_bByteSize;
    BYTE m_bStopBits;
    BYTE m_bParity;
    DWORD m_dwBaudRate;
    char m_bEvtChar;
    DWORD m_fBinary;

    BOOL m_bConnected;
    BOOL m_fXonXoff;
    BOOL m_bFlowCtrl;

    OVERLAPPED    m_rdos;
    OVERLAPPED  m_wtos;

    CComStatus();
    void Set(BYTE bComId=1,BYTE bByteSize=8,BYTE bStopBits=ONESTOPBIT,BYTE bParity=NOPARITY,DWORD dwBaudRate=9600,char bEvtChar=EVENTCHAR,DWORD fBinary=1);
    BOOL OpenConnection();
    BOOL CloseConnection();
    BOOL SetupConnection();
    BOOL IsConnected();//以上是函数声明
那么0x00对应的什么功能位呢??我自己是没找到啊!!小弟是新手,还请各位大侠多多指教!在此谢过!!

回复列表 (共2个回复)

沙发


没人回啊!恳请高手帮帮我啊!急死了~~

板凳


这是我的.cpp程序,大家看看

#include "stdafx.h"
#include "MyCom.h"



CComStatus::CComStatus()
{
    m_hCom = NULL;//串口句柄
    m_bComId = (char)1;//COM1

    m_bByteSize=8;//8位数据位
    m_bStopBits=ONESTOPBIT;//1位停止位
    m_bParity=NOPARITY;//无校验位
    m_dwBaudRate=9600;//波特率9600

    m_bEvtChar=EVENTCHAR;//事件字符
    m_fBinary=1;//允许2进制

    m_bConnected = FALSE;//断开连接菜单项无效
    m_bFlowCtrl = FC_XONXOFF ;//流控制
    m_fXonXoff = FALSE;//
}

void CComStatus::Set(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity,
        DWORD dwBaudRate,char bEvtChar,DWORD fBinary)
{
    m_hCom = NULL;//
    m_bComId = bComId;//

    m_bByteSize=bByteSize;//
    m_bStopBits=bStopBits;//
    m_bParity=bParity;//
    m_dwBaudRate=dwBaudRate;//

    m_bEvtChar=bEvtChar;//
    m_fBinary=fBinary;//

    m_bConnected = FALSE;
    m_bFlowCtrl = FC_XONXOFF;
    m_fXonXoff = FALSE;

}
BOOL CComStatus::OpenConnection()
{    char csCom[10];
    COMMTIMEOUTS  CommTimeOuts ;

    if((m_bComId < 0) || (m_bComId > 4))
        return FALSE;//从COM1到COM4
    if(m_hCom)//if already open
        return FALSE;
    //OVERLAPPED包含异步I/O信息
    m_rdos.Offset = 0;
    m_rdos.OffsetHigh = 0;
    m_rdos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
    if(m_rdos.hEvent == NULL)
        return FALSE;
    m_wtos.Offset = 0;
    m_wtos.OffsetHigh = 0;
    m_wtos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
    if(m_wtos.hEvent == NULL)
    {
        CloseHandle(m_rdos.hEvent);
        return FALSE;
    }
    

    wsprintf(csCom,"COM%d",m_bComId);
    m_hCom = CreateFile(csCom,GENERIC_READ | GENERIC_WRITE,
    0,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
    NULL
    );

    if(m_hCom == INVALID_HANDLE_VALUE) {
        //dwError = GetLastError();
        // handle error 
        return FALSE;
    }
    else
    {
      // get any early notifications

      SetCommMask( m_hCom, EV_RXCHAR ) ;

      // setup device buffers

      SetupComm( m_hCom, 4096, 4096 ) ;

      // purge any information in the buffer

      PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |
                                      PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

      // set up for overlapped I/O
      DWORD dwTemp = 1000 / (this->m_dwBaudRate / 8);
      CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
      CommTimeOuts.ReadTotalTimeoutMultiplier = 0;//((dwTemp > 0) ? dwTemp : 1);
      CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
      // CBR_9600 is approximately 1byte/ms. For our purposes, allow
      // double the expected time per character for a fudge factor.
      
      CommTimeOuts.WriteTotalTimeoutMultiplier = 2*CBR_9600/this->m_dwBaudRate;//( npTTYInfo ) ;
      CommTimeOuts.WriteTotalTimeoutConstant = 0;//1000 ;
      SetCommTimeouts( m_hCom, &CommTimeOuts ) ;
    }
    if(!SetupConnection())
    {
        CloseConnection();
        return FALSE;
    }
    EscapeCommFunction( m_hCom, SETDTR );
    m_bConnected = TRUE;
    return TRUE;
}
BOOL CComStatus::CloseConnection()
{
   if (NULL == m_hCom)
      return ( TRUE ) ;

   // set connected flag to FALSE

    m_bConnected = FALSE;
   // disable event notification and wait for thread
   // to halt

   SetCommMask( m_hCom, 0 ) ;

   // block until thread has been halted

   //while(THREADID(npTTYInfo) != 0);

   // kill the focus

   //KillTTYFocus( hWnd ) ;

   // drop DTR

   EscapeCommFunction( m_hCom, CLRDTR ) ;

   // purge any outstanding reads/writes and close device handle

   PurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |
                                   PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
   CloseHandle( m_hCom ) ;
    m_hCom = NULL;

    CloseHandle(m_rdos.hEvent);
    CloseHandle(m_wtos.hEvent);

   return ( TRUE ) ;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册