📄 tranrev.cpp
字号:
///////////Head Files///////////////
#include "stdafx.h"
#include "Macro.h"
#include "Global.h"
#include "Functions.h"
#include "Uart.h"
#include "UartDlg.h"
///////////////////////////////////
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
char string[RX_BUF_SIZE*3+1];
void CUartDlg::ReceiveData()
{
int i,j=0;
long RevByteLen;
VARIANT variant_inp = m_mscomm.GetInput();
COleSafeArray safearray_inp = variant_inp;
RevByteLen = (long)safearray_inp.GetOneDimSize();
if(!RevByteLen) return; // 若接收数据为空则退出
for(i=0; i<RevByteLen; i++)
{
safearray_inp.GetElement( (long*)(&i), m_RxBuf+i );
} // 将数据移存到接收缓冲区
m_iCountRxByte += RevByteLen;
if(m_bErrDetect) // 监测到错误
{
BYTE differ;
bool PacketErrFlag = false;
for (i=0; i<RevByteLen; i++)
{
if( m_RxBuf[i]!=m_cErrCycleIndex )
{
differ = m_RxBuf[i]^m_cErrCycleIndex;
m_iErrBitNum += differ%2+((differ>>1)%2)+((differ>>2)%2)+((differ>>3)%2)+((differ>>4)%2)+((differ>>5)%2)+((differ>>6)%2)+((differ>>7)%2);
PacketErrFlag = true;
}
if( (m_iRxBitNum/8+i)%5 == 5-1 )
{
if( PacketErrFlag == true ) m_iErrPacketNum += 1;
m_iRxPacketNum += 1;
PacketErrFlag = false;
}
m_cErrCycleIndex++;
if (m_cErrCycleIndex == m_iErrCycleNum) m_cErrCycleIndex = 0;
}
m_iRxBitNum += RevByteLen*8;
m_fErrBitRate = (float)m_iErrBitNum / m_iRxBitNum;
m_fErrPacketRate = (float)m_iErrPacketNum / m_iRxPacketNum;
}
if(!m_bRxShowPause)
{
if(m_bRxHex)
{
HexByte2String(m_RxBuf, string, RevByteLen);
m_strRxEdit = string;
}
else
{
CString str;
str = (char *)m_RxBuf;
m_strRxEdit += str;
}
}//if(!m_bRxShowPause)
if( !m_strFileName.IsEmpty() )
{
if(m_bRxShowPause || !m_bRxHex)
HexByte2String(m_RxBuf, string, RevByteLen);
if(!m_file.Open(m_strFileName, CFile::modeReadWrite|CFile::modeCreate|CFile::modeNoTruncate, &m_file_exception))
{
m_file_exception.ReportError();
return;
}
m_file.SeekToEnd();
CArchive ar(&m_file, CArchive::store);
for(i=0; i<RevByteLen*3; i++)
ar<<string[i];
ar.Flush();
ar.Close();
m_file.Close();
}
}
void CUartDlg::ReceivePic()
{
int i,j=0;
long RevByteLen;
VARIANT variant_inp = m_mscomm.GetInput();
COleSafeArray safearray_inp = variant_inp;
RevByteLen = (long)safearray_inp.GetOneDimSize();
if(!RevByteLen) return;
for(i=0; i<RevByteLen; i++)
{
safearray_inp.GetElement( (long*)(&i), m_RxBuf+i );
m_strRecPic += m_RxBuf[i]; //========
}
m_iCountRxByte += RevByteLen;
if(m_bErrDetect) // 监测错误
{
BYTE differ;
bool PacketErrFlag = false;
for (i=0; i<RevByteLen; i++)
{
if( m_RxBuf[i]!=m_TxPicBuf[m_iPicIndex] ) ///////======
{
differ = m_RxBuf[i]^m_TxPicBuf[m_iPicIndex];
m_iErrBitNum += differ%2+((differ>>1)%2)+((differ>>2)%2)+((differ>>3)%2)+((differ>>4)%2)+((differ>>5)%2)+((differ>>6)%2)+((differ>>7)%2);
PacketErrFlag = true;
}
if( (m_iRxBitNum/8+i)%5 == 5-1 )
{
if( PacketErrFlag == true ) m_iErrPacketNum += 1;
m_iRxPacketNum += 1;
PacketErrFlag = false;
}
m_iPicIndex++;
if (m_iPicIndex == m_iPicLength) m_iPicIndex = 0; ////=========
}
m_iRxBitNum += RevByteLen*8;
m_fErrBitRate = (float)m_iErrBitNum / m_iRxBitNum;
m_fErrPacketRate = (float)m_iErrPacketNum / m_iRxPacketNum;
}
if(!m_bRxShowPause)
{
if(m_bRxHex)
{
HexByte2String(m_RxBuf, string, RevByteLen);
m_strRxEdit = string;
}
else
{
CString str;
str = (char *)m_RxBuf;
m_strRxEdit += str;
}
}//if(!m_bRxShowPause)
}
bool CUartDlg::GetTxSourceData(BYTE outBuf[], int *pdatalen)
{//get data
BYTE i;
if(m_bTxCycle)
{
*pdatalen = m_iTxCycleNum;
for(i=0;i<m_iTxCycleNum;i++)
outBuf[i] = i; // 手动发送时数据为0到179的循环序列
}
else
{
if(m_bTxHex) // 十六进制发送数据
{
if(!String2HexByte(m_strTxEdit, outBuf, pdatalen))
return false;
}
else
{
*pdatalen = m_strTxEdit.GetLength(); //从编辑窗口获取数据
strcpy((char *)outBuf, (LPCTSTR)m_strTxEdit);
}
}
return true;
}
void CUartDlg::TransmitData(BYTE inBuf[], int num)
{
int i;
CByteArray bytearray;
bytearray.SetSize(num);
for(i=0; i<num; i++)
{
bytearray.SetAt(i,inBuf[i]);
}
m_mscomm.SetOutput(COleVariant(bytearray));
m_iCountTxByte += num;
}
void CUartDlg::TxBeginFunc(tx_begin_mode TxBeginMode)
{
switch(TxBeginMode)
{
case TimerAuto:
((CEdit *)GetDlgItem(IDC_OPEN_PORT))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_AUTO_CTS))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(false);
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("自动间隔发送中..."));
GetDlgItem(IDC_STATIC_BIT_RATE_SHOW)->SetWindowText("实际速率:0.00bit/s");
break;
case DetectCts:
((CEdit *)GetDlgItem(IDC_OPEN_PORT))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_AUTO_SPAN_SEL))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(false);
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("自动检测CTS发送中..."));
GetDlgItem(IDC_STATIC_BIT_RATE_SHOW)->SetWindowText("实际速率:0.00bit/s");
break;
case Manual:
((CEdit *)GetDlgItem(IDC_OPEN_PORT))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_AUTO_SPAN_SEL))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_AUTO_CTS))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(false);
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("手动发送中..."));
break;
};
/*
((CEdit *)GetDlgItem(IDC_INI_PORT_NUM))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_INI_BAUD_RATE))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_INI_DATA_BIT))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_INI_CHECK_BIT))->EnableWindow(false);
((CEdit *)GetDlgItem(IDC_INI_STOP_BIT))->EnableWindow(false);*/
}
void CUartDlg::TxStopFunc(tx_begin_mode TxBeginMode, tx_stop_mode TxStopMode)
{
switch(TxBeginMode)
{
case TimerAuto:
case DetectCts:
ShowTxActualRate();
if( TxStopMode == StopAuto )
{
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("自动停止发送!"));
}
if( TxStopMode == StopManual )
{
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("手动停止发送!"));
}
break;
case Manual:
GetDlgItem(IDC_STATIC_RUN)->SetWindowText(_T("手动发送完毕!"));
break;
}
m_iTxByteCounterConv = 0;
m_bTxAutoSpan = false;
((CEdit *)GetDlgItem(IDC_TX_AUTO_SPAN_SEL))->EnableWindow(true);
((CEdit *)GetDlgItem(IDC_TX_AUTO_CTS))->EnableWindow(true);
m_bTxAutoCts = false;
((CEdit *)GetDlgItem(IDC_TX_MANUAL))->EnableWindow(true);
((CEdit *)GetDlgItem(IDC_OPEN_PORT))->EnableWindow(true);
// m_bTxPicAutoCts = false; //888888888 还原标志
UpdateData(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -