哪位大侠给我一个打开关闭串口的例程!!急急急! http://www.vchelp.net/source/submit/rs232_com_test.zip 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看这里,可能会有所帮助 BOOL CDataDlg::OnInitDialog() { CDialog::OnInitDialog(); m_Send=false; // TODO: Add extra initialization here if(m_ComCtrl.GetPortOpen()) m_ComCtrl.SetPortOpen(FALSE); m_ComCtrl.SetCommPort(1); //选择com1 if( !m_ComCtrl.GetPortOpen()) m_ComCtrl.SetPortOpen(TRUE);//打开串口 else AfxMessageBox("不能打开串口"); m_ComCtrl.SetSettings("2400,n,8,1"); //波特率2400,无校验,8个数据位,1个停止位 m_ComCtrl.SetInputMode(1); //以二进制方式检到数据 m_ComCtrl.SetRThreshold(20); //参数5表示每当串口接收缓冲区中有多于或等于5个字符时将引发一个接收数据的OnComm事件 m_ComCtrl.SetInputLen(40); //设置当前接收区数据长度为0 m_ComCtrl.GetInput();//先预读缓冲区以清除残留数据 m_length=0; return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDataDlg::OnComm() { static int ErrFlag1=0; static int ErrFlag2=0; VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; // BYTE rxdata[350]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; strtemp="fg"; if(m_Send==true) { m_Send=false; CByteArray Data; Data.SetSize(1); Data[0]=m_CtrlData; m_ComCtrl.SetOutput(COleVariant(Data)); } if(m_ComCtrl.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { variant_inp=m_ComCtrl.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 { for(k=0;k<len;k++) safearray_inp.GetElement(&k,m_rxdata+k);//转换为BYTE型数组 // AfxMessageBox((char*)rxdata,NULL,NULL); m_length=len; } int tmp1; int tmp2; k=0; ///以下为解码及滤波 while( !(m_rxdata[k]==0xF0 &&m_rxdata[k+1]==0xF1) &&k+5<m_length) k++; if(k+5>=m_length) return; tmp1=m_rxdata[k+2]*256+m_rxdata[k+3]; tmp2=m_rxdata[k+4]*256+m_rxdata[k+5]; m_ADData1=tmp1; if(fabs(m_ADData1Last-m_ADData1)>=100&&ErrFlag1==0) { ErrFlag1=1; m_ADData1=m_ADData1Last; } else { ErrFlag1=0; } m_ADData1Last=m_ADData1; m_ADData2=tmp2; if(fabs(m_ADData2Last-m_ADData2)>=100&&ErrFlag2==0) { ErrFlag2=1; m_ADData2=m_ADData2Last; } else { ErrFlag2=0; } m_ADData2Last=m_ADData2; m_Port=m_rxdata[k+6]; m_Port=m_Port&3; m_JDQStat=m_rxdata[k+7]; m_length=0; } } class CSerial {public: CSerial(); virtual ~CSerial(); BOOL Init(int nPort); BOOL SetSettings(int nBaudRate, BYTE byParity, BYTE byByteSize, BYTE byStopBits); BOOL Read(CString& str); BOOL Read(LPTSTR lpsz, int nMax); BOOL Write(LPCTSTR szBuf, int nBufLen);private: HANDLE m_hComm;};CSerial::CSerial(){ m_hComm = INVALID_HANDLE_VALUE;}CSerial::~CSerial(){ if (m_hComm != INVALID_HANDLE_VALUE) { CloseHandle(m_hComm); }}BOOL CSerial::Init(int nPort){ char szBuf[10]; sprintf(szBuf, "COM%d", nPort); m_hComm = CreateFile(szBuf, GENERIC_READ | GENERIC_WRITE, 0, // comm devices must be opened w/exclusive-access NULL, // no security attributes OPEN_EXISTING, // comm devices must use OPEN_EXISTING 0, // not overlapped I/O NULL // hTemplate must be NULL for comm devices ); if (m_hComm == INVALID_HANDLE_VALUE) { return FALSE; } COMMTIMEOUTS cto; // 设置超时 GetCommTimeouts(m_hComm, &cto); cto.ReadIntervalTimeout = 10; // 读间隔时间(毫秒) cto.WriteTotalTimeoutConstant = 0; cto.WriteTotalTimeoutMultiplier = 0; SetCommTimeouts(m_hComm, &cto); return TRUE;}BOOL CSerial::SetSettings(int nBaudRate, BYTE byParity, BYTE byByteSize, BYTE byStopBits){ DCB dcb; BOOL bSuccess; bSuccess = GetCommState(m_hComm, &dcb); if (!bSuccess) { return FALSE; } // Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit. dcb.BaudRate = nBaudRate; dcb.ByteSize = byByteSize; dcb.Parity = byParity; dcb.StopBits = byStopBits; bSuccess = SetCommState(m_hComm, &dcb); if (!bSuccess) { return FALSE; } return TRUE;}BOOL CSerial::Read(CString& str){ DWORD n; LPSTR p = str.GetBuffer(1024); BOOL bSuccess = ReadFile(m_hComm, p, 1024, &n, NULL); str.ReleaseBuffer(); return bSuccess;}BOOL CSerial::Read(LPTSTR lpsz, int nMax){ DWORD n; return ReadFile(m_hComm, lpsz, nMax, &n, NULL);}BOOL CSerial::Write(LPCTSTR szBuf, int nBufLen){ DWORD n; WriteFile(m_hComm, szBuf, (DWORD)nBufLen, &n, NULL); if (n != (DWORD)nBufLen) { return FALSE; } return TRUE;}CSerial serial;serial.Init(1);// com1serial.Settings(9600,8,ONESTOPBIT,NOPARITY);CString str;serial.Read(str);serial.Write("Test", 4);// 加长度是为了可以发送\0 编写的程序(win32或MFC)都无法在WinPE环境下运行? 奇怪!这两个文件的病毒怎么杀不掉? 问个简单的问题,两个代码段平行运行除了使用临界区这类的机制还有什么呢? XP注册表编程修改的问题 控件 函数返回值问题,高分求教 UDP的IOCP编程 各位大哥帮帮忙!关于编译Windows高级编程指南的范例的问题?????? james_razor(蹬三轮的),有一个问题要跟你商榷 。其他同志勿进来 很简单的问题。 关于INSTALLSHIELD的问题,急~~~!!! 大侠,帮忙看一下
BOOL CDataDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Send=false;
// TODO: Add extra initialization here
if(m_ComCtrl.GetPortOpen())
m_ComCtrl.SetPortOpen(FALSE);
m_ComCtrl.SetCommPort(1); //选择com1
if( !m_ComCtrl.GetPortOpen())
m_ComCtrl.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("不能打开串口");
m_ComCtrl.SetSettings("2400,n,8,1"); //波特率2400,无校验,8个数据位,1个停止位
m_ComCtrl.SetInputMode(1); //以二进制方式检到数据
m_ComCtrl.SetRThreshold(20);
//参数5表示每当串口接收缓冲区中有多于或等于5个字符时将引发一个接收数据的OnComm事件
m_ComCtrl.SetInputLen(40); //设置当前接收区数据长度为0
m_ComCtrl.GetInput();//先预读缓冲区以清除残留数据
m_length=0;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDataDlg::OnComm()
{
static int ErrFlag1=0;
static int ErrFlag2=0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
// BYTE rxdata[350]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
strtemp="fg";
if(m_Send==true)
{
m_Send=false;
CByteArray Data;
Data.SetSize(1);
Data[0]=m_CtrlData;
m_ComCtrl.SetOutput(COleVariant(Data));
}
if(m_ComCtrl.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ComCtrl.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
{
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,m_rxdata+k);//转换为BYTE型数组
// AfxMessageBox((char*)rxdata,NULL,NULL);
m_length=len;
}
int tmp1;
int tmp2;
k=0;
///以下为解码及滤波
while(
!(m_rxdata[k]==0xF0
&&m_rxdata[k+1]==0xF1)
&&k+5<m_length)
k++;
if(k+5>=m_length)
return;
tmp1=m_rxdata[k+2]*256+m_rxdata[k+3];
tmp2=m_rxdata[k+4]*256+m_rxdata[k+5];
m_ADData1=tmp1;
if(fabs(m_ADData1Last-m_ADData1)>=100&&ErrFlag1==0)
{
ErrFlag1=1;
m_ADData1=m_ADData1Last;
}
else
{
ErrFlag1=0;
}
m_ADData1Last=m_ADData1;
m_ADData2=tmp2;
if(fabs(m_ADData2Last-m_ADData2)>=100&&ErrFlag2==0)
{
ErrFlag2=1;
m_ADData2=m_ADData2Last;
}
else
{
ErrFlag2=0;
}
m_ADData2Last=m_ADData2;
m_Port=m_rxdata[k+6];
m_Port=m_Port&3;
m_JDQStat=m_rxdata[k+7];
m_length=0;
}
}
{
public:
CSerial();
virtual ~CSerial(); BOOL Init(int nPort);
BOOL SetSettings(int nBaudRate, BYTE byParity, BYTE byByteSize, BYTE byStopBits);
BOOL Read(CString& str);
BOOL Read(LPTSTR lpsz, int nMax);
BOOL Write(LPCTSTR szBuf, int nBufLen);private:
HANDLE m_hComm;
};CSerial::CSerial()
{
m_hComm = INVALID_HANDLE_VALUE;
}CSerial::~CSerial()
{
if (m_hComm != INVALID_HANDLE_VALUE)
{
CloseHandle(m_hComm);
}
}BOOL CSerial::Init(int nPort)
{
char szBuf[10];
sprintf(szBuf, "COM%d", nPort);
m_hComm = CreateFile(szBuf,
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);
if (m_hComm == INVALID_HANDLE_VALUE)
{
return FALSE;
}
COMMTIMEOUTS cto;
// 设置超时
GetCommTimeouts(m_hComm, &cto);
cto.ReadIntervalTimeout = 10; // 读间隔时间(毫秒)
cto.WriteTotalTimeoutConstant = 0;
cto.WriteTotalTimeoutMultiplier = 0;
SetCommTimeouts(m_hComm, &cto);
return TRUE;
}BOOL CSerial::SetSettings(int nBaudRate, BYTE byParity, BYTE byByteSize, BYTE byStopBits)
{
DCB dcb;
BOOL bSuccess; bSuccess = GetCommState(m_hComm, &dcb); if (!bSuccess)
{
return FALSE;
} // Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit.
dcb.BaudRate = nBaudRate;
dcb.ByteSize = byByteSize;
dcb.Parity = byParity;
dcb.StopBits = byStopBits; bSuccess = SetCommState(m_hComm, &dcb); if (!bSuccess)
{
return FALSE;
}
return TRUE;
}BOOL CSerial::Read(CString& str)
{
DWORD n;
LPSTR p = str.GetBuffer(1024);
BOOL bSuccess = ReadFile(m_hComm, p, 1024, &n, NULL);
str.ReleaseBuffer();
return bSuccess;
}BOOL CSerial::Read(LPTSTR lpsz, int nMax)
{
DWORD n;
return ReadFile(m_hComm, lpsz, nMax, &n, NULL);
}BOOL CSerial::Write(LPCTSTR szBuf, int nBufLen)
{
DWORD n;
WriteFile(m_hComm, szBuf, (DWORD)nBufLen, &n, NULL);
if (n != (DWORD)nBufLen)
{
return FALSE;
}
return TRUE;
}
CSerial serial;
serial.Init(1);// com1
serial.Settings(9600,8,ONESTOPBIT,NOPARITY);
CString str;
serial.Read(str);
serial.Write("Test", 4);// 加长度是为了可以发送\0