Files
geomative/GeomativeStudio/cpp/logging/CDialogLoggingSelectComPortWnd.cpp
coco df489d5640 a
2026-07-03 16:05:30 +08:00

158 lines
4.3 KiB
C++

//logging\CDialogLoggingSelectComPortWnd.cpp : 实现文件
//
#include "stdafx.h"
#include "GeoMative.h"
#include "logging\CDialogLoggingSelectComPortWnd.h"
#include "afxdialogex.h"
extern int g_iUILanguage;
extern CDevLinkRecord* aDevLinkTable[256];
extern BOOL g_bScanFun;
extern CRITICAL_SECTION g_ScanTabSection;
extern BYTE BBCCalculate(const char *pData, int iSize, BYTE ucOrgRes);
// CDialogLoggingSelectComPortWnd 对话框
IMPLEMENT_DYNAMIC(CDialogLoggingSelectComPortWnd, CDialog)
CDialogLoggingSelectComPortWnd::CDialogLoggingSelectComPortWnd(CWnd* pParent /*=NULL*/)
: CDialog(CDialogLoggingSelectComPortWnd::IDD, pParent)
{
m_iSeriNo = 1;
}
CDialogLoggingSelectComPortWnd::~CDialogLoggingSelectComPortWnd()
{
}
void CDialogLoggingSelectComPortWnd::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO_AVAILABLE_SERIAL_PORT, m_comComNameList);
}
BEGIN_MESSAGE_MAP(CDialogLoggingSelectComPortWnd, CDialog)
ON_BN_CLICKED(IDOK, &CDialogLoggingSelectComPortWnd::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CDialogLoggingSelectComPortWnd::OnBnClickedCancel)
END_MESSAGE_MAP()
// CDialogLoggingSelectComPortWnd 消息处理程序
BOOL CDialogLoggingSelectComPortWnd::OnInitDialog()
{
CDialog::OnInitDialog();
if (LANG_ZHCN == g_iUILanguage)
{
SetWindowTextA(_T("选中通讯端口"));
GetDlgItem(IDC_STATIC_AVAILABLE_SERIAL_PORT)->SetWindowTextA(_T("可用串口"));
GetDlgItem(IDOK)->SetWindowTextA(_T("确定"));
GetDlgItem(IDCANCEL)->SetWindowTextA(_T("取消"));
}
CStringArray strComNameArray;
CSComPort::FindComName(&strComNameArray);
char szSend[2048] = { 0 };
char szRecv[2048] = { 0 };
BYTE ucBuf[4096] = { 0 };
STCtrlProtoHeader* pSend = NULL;
STCtrlProtoHeader* pRecv = NULL;
WORD wTotalLen = 0;
BOOL bRes = FALSE;
int iPollingTime = 0;
int iReceive = 0;
for (int i = 0; i < strComNameArray.GetSize(); i++)
{
//通过Login指令过滤掉,不可以的串口
EnterCriticalSection(&g_ScanTabSection);
m_SComPort.SetScanBreakSign(FALSE);
if (TRUE == m_SComPort.OpenComm(strComNameArray.GetAt(i)))
{
m_SComPort.ClearCommReceiveBuff();
m_SComPort.ClearCommSendBuff();
/*CString szOrder = _T("");
szOrder.Empty();
szOrder.Format(_T("\r\n"));
m_SComPort.SendDataDirectly(szOrder.GetBuffer(szOrder.GetLength()), szOrder.GetLength());
Sleep(500);
szOrder.ReleaseBuffer();
szOrder.Empty();*/
memset(szSend, 0, 2048);
memset(szRecv, 0, 2048);
memset(ucBuf, 0, 4096);
pSend = (STCtrlProtoHeader*)ucBuf;
pSend->wIDCode = htonl(CTRL_GD10_CODE);
pSend->ucSrcAddr = GEOMATIVE_ADDRESS;
pSend->ucSrcType = 2;
pSend->ucDstAddr = UNDER_MACHINE_ADDRESS;
pSend->ucDstType = 5;
pSend->ucCMD = EN_LOGGING_CHECK_PORT_LOGIN;
pSend->ucDataType = 1;
pSend->dwSeriNO = m_iSeriNo++;
pSend->Status_code = 0;
pSend->ucPacketNum = 1;
memset(pSend->ucReverse, 0, sizeof(pSend->ucReverse));
wTotalLen = sizeof(STCtrlProtoHeader) + 1;
pSend->wTotalLen = wTotalLen;
*((BYTE*)(ucBuf + wTotalLen - 1)) = BBCCalculate((const char*)(ucBuf), wTotalLen - 1, 0);
memcpy(szSend, ucBuf, wTotalLen);
bRes = m_SComPort.SendDataDirectly(szSend, wTotalLen);
iPollingTime = 0;
//发送数据后,接受数据
Sleep(200);
while (bRes && (iPollingTime < RECV_DATA_FAILED_ATTEMPTS_TIMES))
{
Sleep(3);
if (m_SComPort.ReceiveDataDirectly(szRecv, &iReceive) == TRUE)
{
pRecv = (STCtrlProtoHeader*)szRecv;
if (pRecv != NULL)
{
if (pRecv->ucCMD == EN_LOGGING_CHECK_PORT_LOGIN && pRecv->ucDataType == 2)
{
m_comComNameList.AddString(strComNameArray.GetAt(i));
break;
}
}
}
iPollingTime++;
}
m_SComPort.ClearCommSendBuff();
m_SComPort.ClearCommReceiveBuff();
}
m_SComPort.CloseComm();
LeaveCriticalSection(&g_ScanTabSection);
}
m_comComNameList.SetCurSel(0);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CDialogLoggingSelectComPortWnd::OnBnClickedOk()
{
int iIndex = m_comComNameList.GetCurSel();
m_comComNameList.GetLBText(iIndex, m_strComName);
CDialog::OnOK();
}
void CDialogLoggingSelectComPortWnd::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
CDialog::OnCancel();
}
CString CDialogLoggingSelectComPortWnd::GetSelectComm()
{
return m_strComName;
}