主题:串口通信数据丢失的问题
51航海
[专家分:0] 发布于 2009-01-12 11:03:00
我用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对应的什么功能位呢??我自己是没找到啊!!小弟是新手,还请各位大侠多多指教!在此谢过!!
最后更新于:2009-01-12 11:07:00
回复列表 (共2个回复)
沙发
51航海 [专家分:0] 发布于 2009-01-13 16:31:00
没人回啊!恳请高手帮帮我啊!急死了~~
板凳
51航海 [专家分:0] 发布于 2009-01-14 15:46:00
这是我的.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 ) ;
}
我来回复