20240130 增加IMP显示和控制界面和串口通信

main
Yuhui 1 year ago
parent d09470095e
commit 006dfa62b8

Binary file not shown.

Binary file not shown.

@ -60,6 +60,7 @@ BOOL CCH91PayloadSoftwareApp::InitInstance()
Md5Encode m_Md5Encoder; Md5Encode m_Md5Encoder;
str1 = m_Md5Encoder.Encode(str1); str1 = m_Md5Encoder.Encode(str1);
//str1 = "A1335FA36BDA99F1E5D53DD08FDF7898";
string str2 = "FEIPENGZHIKONG2021.";//密钥 string str2 = "FEIPENGZHIKONG2021.";//密钥
str1 = m_desUtils.H(str1);//十六进制转换为二进制 str1 = m_desUtils.H(str1);//十六进制转换为二进制

@ -49,15 +49,15 @@
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
<OutDir>..\..\Bin\</OutDir> <OutDir>..\..\Bin\</OutDir>
<IntDir>$(Configuration)\</IntDir> <IntDir>$(Configuration)\</IntDir>
<IncludePath>C:\ProgramFiles\boost_1_56;$(IncludePath)</IncludePath> <IncludePath>E:\FH-98机载相机监控软件2023\ProgramFiles\boost_1_56;E:\FH-98机载相机监控软件2023\ProgramFiles\opencv245\include;E:\FH-98机载相机监控软件2023\ProgramFiles\gdal\include;$(IncludePath)</IncludePath>
<LibraryPath>C:\ProgramFiles\boost_1_56\stage\lib;$(LibraryPath)</LibraryPath> <LibraryPath>C:\ProgramFiles\boost_1_56\stage\lib;E:\FH-98机载相机监控软件2023\ProgramFiles\boost_1_56\stage\lib;E:\FH-98机载相机监控软件2023\ProgramFiles\gdal\lib;E:\FH-98机载相机监控软件2023\ProgramFiles\opencv245\lib\x86;$(LibraryPath)</LibraryPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<OutDir>..\..\Bin\</OutDir> <OutDir>..\..\Bin\</OutDir>
<IntDir>..\..\Bin\</IntDir> <IntDir>..\..\Bin\</IntDir>
<IncludePath>C:\ProgramFiles\boost_1_56;$(IncludePath)</IncludePath> <IncludePath>C:\ProgramFiles\boost_1_56;E:\FH-98机载相机监控软件2023\ProgramFiles\boost_1_56;E:\FH-98机载相机监控软件2023\ProgramFiles\opencv245\include\opencv;E:\FH-98机载相机监控软件2023\ProgramFiles\opencv245\include\opencv2;E:\FH-98机载相机监控软件2023\ProgramFiles\opencv245\include;E:\FH-98机载相机监控软件2023\ProgramFiles\gdal\include;$(IncludePath)</IncludePath>
<LibraryPath>C:\ProgramFiles\boost_1_56\stage\lib;$(LibraryPath)</LibraryPath> <LibraryPath>C:\ProgramFiles\boost_1_56\stage\lib;E:\FH-98机载相机监控软件2023\ProgramFiles\boost_1_56\stage\lib;E:\FH-98机载相机监控软件2023\ProgramFiles\gdal\lib;E:\FH-98机载相机监控软件2023\ProgramFiles\opencv245\lib\x86;$(LibraryPath)</LibraryPath>
<TargetName>FH98PayloadOnBoard</TargetName> <TargetName>FH98PayloadOnBoard</TargetName>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@ -176,13 +176,17 @@
<ClInclude Include="CH91PayloadSoftwareDlg.h" /> <ClInclude Include="CH91PayloadSoftwareDlg.h" />
<ClInclude Include="cMD5Encode.h" /> <ClInclude Include="cMD5Encode.h" />
<ClInclude Include="CMDBtn.h" /> <ClInclude Include="CMDBtn.h" />
<ClInclude Include="ComControlFunction.h" />
<ClInclude Include="ControlDlgFH96Page1.h" /> <ClInclude Include="ControlDlgFH96Page1.h" />
<ClInclude Include="cPhysicsInfoUtils.h" /> <ClInclude Include="cPhysicsInfoUtils.h" />
<ClInclude Include="CTCPSocket.h" /> <ClInclude Include="CTCPSocket.h" />
<ClInclude Include="DecoderFactory.h" /> <ClInclude Include="DecoderFactory.h" />
<ClInclude Include="DlgCameraCtrl.h" /> <ClInclude Include="DlgCameraCtrl.h" />
<ClInclude Include="DlgIMP.h" />
<ClInclude Include="FrameFKU_Camera.h" /> <ClInclude Include="FrameFKU_Camera.h" />
<ClInclude Include="FrameIMP_DOWN.h" />
<ClInclude Include="FrameRecieve.h" /> <ClInclude Include="FrameRecieve.h" />
<ClInclude Include="IMPConect.h" />
<ClInclude Include="JoyKeybordControl.h" /> <ClInclude Include="JoyKeybordControl.h" />
<ClInclude Include="JoyStickControlDlg.h" /> <ClInclude Include="JoyStickControlDlg.h" />
<ClInclude Include="JoyStickListener.h" /> <ClInclude Include="JoyStickListener.h" />
@ -225,10 +229,14 @@
<ClCompile Include="CH91PayloadSoftwareDlg.cpp" /> <ClCompile Include="CH91PayloadSoftwareDlg.cpp" />
<ClCompile Include="cMD5Encode.cpp" /> <ClCompile Include="cMD5Encode.cpp" />
<ClCompile Include="CMDBtn.cpp" /> <ClCompile Include="CMDBtn.cpp" />
<ClCompile Include="ComControlFunction.cpp" />
<ClCompile Include="ControlDlgFH96Page1.cpp" /> <ClCompile Include="ControlDlgFH96Page1.cpp" />
<ClCompile Include="cPhysicsInfoUtils.cpp" /> <ClCompile Include="cPhysicsInfoUtils.cpp" />
<ClCompile Include="CTCPSocket.cpp" /> <ClCompile Include="CTCPSocket.cpp" />
<ClCompile Include="DlgCameraCtrl.cpp" /> <ClCompile Include="DlgCameraCtrl.cpp" />
<ClCompile Include="DlgIMP.cpp" />
<ClCompile Include="FrameIMP_DOWN.cpp" />
<ClCompile Include="IMPConect.cpp" />
<ClCompile Include="JoyKeybordControl.cpp" /> <ClCompile Include="JoyKeybordControl.cpp" />
<ClCompile Include="JoyStickControlDlg.cpp" /> <ClCompile Include="JoyStickControlDlg.cpp" />
<ClCompile Include="JoyStickListener.cpp" /> <ClCompile Include="JoyStickListener.cpp" />

@ -79,6 +79,21 @@
<Filter Include="加解密"> <Filter Include="加解密">
<UniqueIdentifier>{ab6ee3f8-60f1-43e8-9f15-bbb160de9c67}</UniqueIdentifier> <UniqueIdentifier>{ab6ee3f8-60f1-43e8-9f15-bbb160de9c67}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="IMP">
<UniqueIdentifier>{f06cd1e0-85bf-45a0-867a-ee5a88d8e499}</UniqueIdentifier>
</Filter>
<Filter Include="通信相关\串口类\串口控制相关">
<UniqueIdentifier>{ac0ffa33-f9fc-4e75-9781-73b28c12be43}</UniqueIdentifier>
</Filter>
<Filter Include="IMP\对话框">
<UniqueIdentifier>{14c6a6db-8887-4abf-aeee-f39bfcb37fc6}</UniqueIdentifier>
</Filter>
<Filter Include="IMP\通信">
<UniqueIdentifier>{04315dca-4ce2-425a-bcc9-d26fe11219c5}</UniqueIdentifier>
</Filter>
<Filter Include="IMP\协议">
<UniqueIdentifier>{8eb1f68d-8c2d-485d-b3bd-9859d81467d5}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="ReadMe.txt" /> <None Include="ReadMe.txt" />
@ -357,6 +372,18 @@
<ClInclude Include="cDESUtils.h"> <ClInclude Include="cDESUtils.h">
<Filter>加解密</Filter> <Filter>加解密</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="ComControlFunction.h">
<Filter>通信相关\串口类\串口控制相关</Filter>
</ClInclude>
<ClInclude Include="IMPConect.h">
<Filter>IMP\通信</Filter>
</ClInclude>
<ClInclude Include="DlgIMP.h">
<Filter>IMP\对话框</Filter>
</ClInclude>
<ClInclude Include="FrameIMP_DOWN.h">
<Filter>IMP\协议</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="CH91PayloadSoftware.cpp"> <ClCompile Include="CH91PayloadSoftware.cpp">
@ -470,6 +497,18 @@
<ClCompile Include="cDESUtils.cpp"> <ClCompile Include="cDESUtils.cpp">
<Filter>加解密</Filter> <Filter>加解密</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="ComControlFunction.cpp">
<Filter>通信相关\串口类\串口控制相关</Filter>
</ClCompile>
<ClCompile Include="IMPConect.cpp">
<Filter>IMP\通信</Filter>
</ClCompile>
<ClCompile Include="DlgIMP.cpp">
<Filter>IMP\对话框</Filter>
</ClCompile>
<ClCompile Include="FrameIMP_DOWN.cpp">
<Filter>IMP\协议</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="CH91PayloadSoftware.rc"> <ResourceCompile Include="CH91PayloadSoftware.rc">

@ -81,6 +81,8 @@ CCH91PayloadSoftwareDlg::CCH91PayloadSoftwareDlg(CWnd* pParent /*=NULL*/)
g_bMapDirectGuide = FALSE; // 是否是地图直接导引标志 g_bMapDirectGuide = FALSE; // 是否是地图直接导引标志
p_DlgCameraCtrl = NULL; p_DlgCameraCtrl = NULL;
g_DlgIMP = NULL;//IMP对话框初始化指针
} }
void CCH91PayloadSoftwareDlg::DoDataExchange(CDataExchange* pDX) void CCH91PayloadSoftwareDlg::DoDataExchange(CDataExchange* pDX)
@ -121,6 +123,9 @@ BEGIN_MESSAGE_MAP(CCH91PayloadSoftwareDlg, CDialogEx)
ON_WM_MBUTTONDOWN() ON_WM_MBUTTONDOWN()
ON_WM_MOUSEMOVE() ON_WM_MOUSEMOVE()
ON_WM_MBUTTONUP() ON_WM_MBUTTONUP()
//ON_MESSAGE(WM_UPDATE_IMPDOWN_CHECKED, OnUpdateIMPDownDataChecked) //更新IMP下行遥测数据
END_MESSAGE_MAP() END_MESSAGE_MAP()
@ -347,6 +352,7 @@ BOOL CCH91PayloadSoftwareDlg::OnInitDialog()
assert(LocalPort1 != 0 && RemotePort1 != 0); assert(LocalPort1 != 0 && RemotePort1 != 0);
g_bCreatSend2Mobile = g_UdpSend2Mobile.StartListening(LocalIp1, LocalPort1, RemoteIp1, RemotePort1); g_bCreatSend2Mobile = g_UdpSend2Mobile.StartListening(LocalIp1, LocalPort1, RemoteIp1, RemotePort1);
*/ */
return TRUE; return TRUE;
} }
@ -378,6 +384,29 @@ void CCH91PayloadSoftwareDlg::OnInitControlDlg()
} }
p_DlgCameraCtrl->MoveWindow(&rc_ControlInstruction); p_DlgCameraCtrl->MoveWindow(&rc_ControlInstruction);
p_DlgCameraCtrl->ShowWindow(SW_SHOW); p_DlgCameraCtrl->ShowWindow(SW_SHOW);
/***********IMP************/
CRect rc_ControlInstructionIMP;
GetDlgItem(IDC_STATIC_CONTROLINSTRUCTION_IMP)->GetWindowRect(rc_ControlInstructionIMP);
ScreenToClient(rc_ControlInstructionIMP);
g_DlgIMP = new CDlgIMP();
if(g_DlgIMP != NULL)
{
g_DlgIMP->Create(IDD_DLG_IMP, this);
}
g_DlgIMP->MoveWindow(&rc_ControlInstructionIMP);
g_DlgIMP->ShowWindow(SW_SHOW);
if(g_DlgIMP->IsWindowVisible())
{
IMPDlgWindowVisible=true;
}
else
{
IMPDlgWindowVisible=false;
}
} }
// 对解码器进行初始化 // 对解码器进行初始化
void CCH91PayloadSoftwareDlg::OnInitCH96Decoder() void CCH91PayloadSoftwareDlg::OnInitCH96Decoder()
@ -584,6 +613,13 @@ void CCH91PayloadSoftwareDlg::OnDestroy()
delete p_DlgCameraCtrl; delete p_DlgCameraCtrl;
p_DlgCameraCtrl = NULL; p_DlgCameraCtrl = NULL;
} }
// 卸载IMP对话框
if(g_DlgIMP !=NULL)
{
delete g_DlgIMP;
g_DlgIMP = nullptr;
IMPDlgWindowVisible = false;
}
} }
// 显示可见光图像复接信息 // 显示可见光图像复接信息
@ -1159,13 +1195,16 @@ void CCH91PayloadSoftwareDlg::DlgStyleChange()
m_Btn_Replay.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));// 鼠标指向按钮时候的文字颜色 m_Btn_Replay.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));// 鼠标指向按钮时候的文字颜色
m_Btn_Replay.DrawTransparent(TRUE); m_Btn_Replay.DrawTransparent(TRUE);
//会报错,原因不明
// 状态查看 // 状态查看
m_Btn_FJ.SubclassDlgItem(IDC_BTN_SHOW_FJ, this); //m_Btn_FJ.SubclassDlgItem(IDC_BTN_SHOW_FJ, this);
m_Btn_FJ.SetIcon(IDI_ICON_MAIN_FJ); //m_Btn_FJ.SetIcon(IDI_ICON_MAIN_FJ);
m_Btn_FJ.SetTooltipText("Status Inquiry"); //m_Btn_FJ.SetTooltipText("Status Inquiry");
m_Btn_FJ.SetAlign(CButtonST::ST_ALIGN_VERT);// 文字在下 //m_Btn_FJ.SetAlign(CButtonST::ST_ALIGN_VERT);// 文字在下
m_Btn_FJ.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151)); //m_Btn_FJ.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151));
m_Btn_FJ.DrawTransparent(TRUE); //m_Btn_FJ.DrawTransparent(TRUE);
// 组播收数 // 组播收数
m_Btn_SocketReceive.SubclassDlgItem(IDC_BTN_MULTICASTSOCKETRECEIVE, this); m_Btn_SocketReceive.SubclassDlgItem(IDC_BTN_MULTICASTSOCKETRECEIVE, this);
m_Btn_SocketReceive.SetIcon(IDI_ICON_MAIN_SOCKETSEND); m_Btn_SocketReceive.SetIcon(IDI_ICON_MAIN_SOCKETSEND);
@ -2021,3 +2060,60 @@ double CCH91PayloadSoftwareDlg::GetOffsetAngle(int X, int Y)
return PayLoad_Yaw; return PayLoad_Yaw;
} }
/**********IMP**********/
////IMP下行帧通过校验后调的函数
//void CALLBACK IMPDOWNCheckCallback(CFrameIMPDown_ *ss)
//{
// ::SendMessageA(g_mainDlgHwnd,WM_UPDATE_IMPDOWN_CHECKED,0,0);
//}
////IMP串口有数据后进行校验
//void OnReadFromCommIMP( char *buffer,const DWORD size)
//{
// //buffer = (unsigned char*)buffer;
// const BYTE* buffer2 = (BYTE*)buffer;
// if(size>0)
// {
// BYTE DCBufferCmd[6];
// memset(DCBufferCmd,0,sizeof(DCBufferCmd));
//
// /********进入校验校验通过就给g_FrameIMPDown赋值********/
// g_FrameIMPDown.Phrase(buffer2, size);
// ////IMP协议类回调函数设置校验通过后回自动调用该回调函数
// //g_FrameIMPDown.SetCheckCallback((IMPDOWNCheckCallback,nullptr),nullptr);
// //g_FrameIMPDown.SetNotCheckCallback(nullptr);
// ::SendMessageA(g_mainDlgHwnd,WM_UPDATE_IMPDOWN_CHECKED,0,0);
// }
//}
////初始化
//void CCH91PayloadSoftwareDlg::onInitIMPFrame()
//{
// //串口通信设置
// memset(pSerialPort, 0, 20);
// GetSerialPortNumber(pSerialPort,"串口40");
// CString IMPComPort;
// IMPComPort = "115200";
// pSerialPortBaud = atoi(IMPComPort);//波特率
// if (!OnCheckComPort(pSerialPort)) //串口被占用返回false
// {
// return;
// }
// if(m_SerialIMP.Initialize(pSerialPort, pSerialPortBaud, 8, 0, 0)) //开启串口通信
// {
// m_SerialIMP.SetComReadCallback( OnReadFromCommIMP );
// //m_SerialIMP.SetNotCheckCallback(nullptr,NULL);
// BYTE buffersend[10];
// memset(buffersend,1,10);
// m_SerialIMP.WriteABuffer(buffersend,sizeof(buffersend));
// }
//}
////处理通过校验的IMP下行数据
//LRESULT CCH91PayloadSoftwareDlg::OnUpdateIMPDownDataChecked(WPARAM param, LPARAM lparam)
//{
// //数据解析与显示
// if(p_DlgIMP->IsWindowVisible())
// {
// p_DlgIMP->SetIMPData(g_FrameIMPDown);
// }
// return 0;
//}

@ -21,7 +21,8 @@
#include "afxwin.h" #include "afxwin.h"
#include "afxcmn.h" #include "afxcmn.h"
#include "DlgCameraCtrl.h" #include "DlgCameraCtrl.h"
#include "DlgIMP.h"
//#include "FrameIMP_DOWN.h"
// CCH91PayloadSoftwareDlg 对话框 // CCH91PayloadSoftwareDlg 对话框
class CCH91PayloadSoftwareDlg : public CDialogEx class CCH91PayloadSoftwareDlg : public CDialogEx
@ -192,4 +193,14 @@ public:
afx_msg void OnMButtonUp(UINT nFlags, CPoint point); afx_msg void OnMButtonUp(UINT nFlags, CPoint point);
// 计算拖动鼠标时,偏移量形成的角度 // 计算拖动鼠标时,偏移量形成的角度
double GetOffsetAngle(int X, int Y); double GetOffsetAngle(int X, int Y);
//////IMP相关
CDlgIMP * g_DlgIMP;//IMP对话框
//CSerial m_SerialIMP; // IMP通信串口
//char pSerialPort[20];//串口号
//DWORD pSerialPortBaud;//端口号
//void onInitIMPFrame();//初始化IMP协议
//LRESULT OnUpdateIMPDownDataChecked(WPARAM param, LPARAM lparam); //处理IMP下行通过校验的遥测数据
}; };

@ -0,0 +1,185 @@
//功能:实现串口操作的一些函数
#include "StdAfx.h"
#include "ComControlFunction.h"
//查找系统可用的串口号将所有的串口号保存在pPortList数组里
//输出串口数portNumber串口号数组pPortList
//pPortList保存各串口的串口数字
BOOL ScanPCCom( int *pPortList, int& portNumber )
{
portNumber = 0; //系统配置的串口总数
//扫描PC机存在的串口从注册表读取存在的串口。
UINT nComNum = 0;
HKEY hKEY = NULL;
LONG hResult = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, _T( "HARDWARE\\DEVICEMAP\\SERIALCOMM" ), 0, KEY_READ, &hKEY );
if ( hResult != ERROR_SUCCESS ) //如果无法打开hKEY,则中止程序的执行
{
return FALSE;
}
TCHAR strInf[30];
memset( strInf, 0, sizeof( TCHAR ) * 30 );
DWORD type_1 = REG_SZ;
DWORD cbData_1 = 10;
DWORD aa = 30, num = 0;
DWORD a1 = 0, a2 = 0, a3 = 0, a4 = 0, a5 = 0, a6 = 0, a7 = 0;
//hResult = ::RegQueryInfoKey( hKEY, strInf, &a7, NULL, &a3, &a1, &a2, &num, &a4, &a5, &a6, NULL );
hResult = ::RegQueryInfoKeyA( hKEY, NULL, NULL, NULL, &a3, &a1, NULL, &num, &a4, &a5, NULL, NULL );
if ( hResult != ERROR_SUCCESS )
{
RegCloseKey( hKEY );
return FALSE;
}
BYTE portName[15];
memset( portName, 0, 15 );
CString csr = _T( "" );
for ( DWORD i = 0 ; i < num ; ++i )
{
aa = 30 ;
cbData_1 = 10;
hResult = ::RegEnumValue( hKEY, i, strInf, &aa, NULL, &type_1, portName, &cbData_1 );
if ( hResult != ERROR_SUCCESS )
{
continue;
}
csr.Format( _T( "%s" ), portName );
csr.Delete( 0, 3 );
pPortList[portNumber] = atoi( csr );
++portNumber; //系统配置的串口总数
++nComNum;
}
RegCloseKey( hKEY );
return TRUE;
}
//判断串口是否被占有串口可用返回true否则返回false
bool OnCheckComPort( const CString& portName )
{
CString str = _T( "//./" ) + portName;
HANDLE hCom = CreateFile( str, //打开串口1
GENERIC_READ | GENERIC_WRITE, //允许读和写操作
0, //独占方式
0, OPEN_EXISTING, //打开一个存在的串口
0, 0 );
if ( hCom == INVALID_HANDLE_VALUE ) //打开串口失败
{
return false;
}
else
{
CloseHandle( hCom );
hCom = NULL;
return true;
}
}
//判断串口是否为空
//串口为空返回true,否则返回false
bool CheckComPortIsEmpty( const CString strPort )
{
if ( strPort.Compare( _T( "" ) ) == 0 )
{
return true;
}
return false;
}
//功能检测2个串口是否相同相同返回True否则返回false
bool CompareTwoComPort( const CString port1, const CString port2 )
{
if ( ( port1.Compare( port2 ) ) == 0 )
{
return true;
}
else
{
return false;
}
}
//判断串口是否可用
//可用返回true,否则返回false
bool CheckComPortCanWork( const CString strPort )
{
if ( strPort.GetLength() <= 4 )
{
return false;
}
CString str = strPort;
str.Delete( 0, 4 ); //删除“串口”字符
CString strSelectCom = _T( "" );
strSelectCom.Format( "COM%d", atoi( str ) );
if ( !OnCheckComPort( strSelectCom ) ) //串口被占用返回false
{
return false;
}
else //串口可用返回true
{
return true;
}
}
//判断串口名称是否正确正确的名称为“串口XX”——前面为“串口”后面为数字
//串口名称正确返回true, 否则返回false
bool CheckComPortName( const CString strPort )
{
if ( strPort.GetLength() < 5 )
{
return false;
}
CString str = strPort;
if ( str.Left( 4 ) != _T( "串口" ) )
{
return false;
}
str = strPort;
str.Delete( 0, 4 );
for ( int i = 0; i < str.GetLength(); ++i )
{
if ( ( str.GetAt( i ) < '0' ) || ( str.GetAt( i ) > '9' ) )
{
return false;
}
}
return true;
}
//从串口数组中进行查找,查找出配置文件设置的串口号
//输入数组portArray数组长度arrLength查找元素itemValue
//输出元素的位置pos
//返回值查找成功返回true否则返回false
bool FindItemFromComList( int& pos, const int *portArray, const int& arrLength, const int& itemValue )
{
for ( int i = 0; i < arrLength; ++i )
{
if ( itemValue == portArray[i] )
{
pos = i;
return true;
}
}
return false;
}

@ -0,0 +1,41 @@
//功能:实现串口操作的一些函数
#ifndef COM_CONTROL_FUNCTION_H
#define COM_CONTROL_FUNCTION_H
//查找系统可用的串口号将所有的串口号保存在pPortList数组里
//输出串口数portNumber串口号数组pPortList
//pPortList保存各串口的串口数字
extern BOOL ScanPCCom( int *pPortList, int& portNumber );
//判断串口是否被占有串口可用返回true否则返回false
extern bool OnCheckComPort( const CString& portName );
//功能检测2个串口是否相同相同返回True否则返回false
extern bool CompareTwoComPort( const CString port1, const CString port2 );
//判断串口是否可用
//可用返回true,否则返回false
extern bool CheckComPortCanWork( const CString strPort );
//判断串口是否为空
//串口为空返回true,否则返回false
extern bool CheckComPortIsEmpty( const CString strPort );
//判断串口名称是否正确正确的名称为“串口XX”
//串口名称正确返回true, 否则返回false
extern bool CheckComPortName( const CString strPort );
//从串口数组中进行查找,查找出配置文件设置的串口号
//输入数组portArray数组长度arrLength查找元素itemValue
//输出元素的位置pos
//返回值查找成功返回true否则返回false
extern bool FindItemFromComList( int& pos, const int *portArray, const int& arrLength, const int& itemValue );
const int MaxComPortNumber = 1024;
#endif

@ -0,0 +1,134 @@
// DlgIMP.cpp : 实现文件
//
#include "stdafx.h"
#include "CH91PayloadSoftware.h"
#include "DlgIMP.h"
#include "afxdialogex.h"
// CDlgIMP 对话框
IMPLEMENT_DYNAMIC(CDlgIMP, CDialogEx)
CDlgIMP::CDlgIMP()
: CDialogEx(CDlgIMP::IDD)
{
}
CDlgIMP::~CDlgIMP()
{
}
void CDlgIMP::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CDlgIMP, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &CDlgIMP::OnBnClickedButton1)
ON_MESSAGE(WM_UPDATE_IMP_SERIAL_CONNECT, ImpSerialConnectMessage) //IMP通信开始消息
ON_MESSAGE(WM_UPDATE_IMPDOWN_CHECKED, OnUpdateIMPDownDataChecked) //更新IMP下行遥测数据
END_MESSAGE_MAP()
BOOL CDlgIMP::OnInitDialog()
{
CDialogEx::OnInitDialog();
g_IMPDLGhwnd = GetSafeHwnd();
return TRUE;
}
// DlgIMP 消息处理程序
void CDlgIMP::SetIMPData(CFrameIMPDown_ data)
{
CString tstr;
tstr.Format(_T("%d"),data.Data.Bytes);
GetDlgItem(IDC_EDIT2)->SetWindowTextA(tstr);
}
void CDlgIMP::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
}
//IMP串口有数据后进行校验
void OnReadFromCommIMP( char *buffer,const DWORD size)
{
//buffer = (unsigned char*)buffer;
const BYTE* buffer2 = (BYTE*)buffer;
if(size>0)
{
BYTE DCBufferCmd[6];
memset(DCBufferCmd,0,sizeof(DCBufferCmd));
DCBufferCmd[0] = buffer2[0] ;
DCBufferCmd[1] = buffer2[1] ;
DCBufferCmd[2] = buffer2[2] ;
int a = sizeof(buffer2);
/********进入校验校验通过就给g_FrameIMPDown赋值********/
g_FrameIMPDown.Phrase(buffer2, size);
::SendMessageA(g_IMPDLGhwnd,WM_UPDATE_IMPDOWN_CHECKED,0,0);
}
}
LRESULT CDlgIMP::ImpSerialConnectMessage(WPARAM param, LPARAM lparam)
{
// 卸载串口
if (TRUE == m_SerialIMP.IsInitialized())
{
m_SerialIMP.DeInit();
}
else
{
//串口通信设置
char pSerialPort[20];//串口号
DWORD pSerialPortBaud;//端口号
memset(pSerialPort, 0, 20);
/*自定义消息发送CString类型数据时消息发送时采用如下方式
//::SendMessageA(g_IMPDLGhwnd,WM_UPDATE_IMP_SERIAL_CONNECT,(WPARAM)mComPortIMP.AllocSysString(), (LPARAM)mComBaudIMP.AllocSysString());
//解析时采用如下方式WPARAM转CSTring
*/
CString sPort = (CString)((BSTR)param);
CString sBaud = (CString)((BSTR)lparam);
SysFreeString((BSTR)param);
SysFreeString((BSTR)lparam);
GetSerialPortNumber(pSerialPort,sPort);
pSerialPortBaud = atoi(sBaud);//波特率
if (!OnCheckComPort(pSerialPort)) //串口被占用返回false
{
return 0;
}
if(m_SerialIMP.Initialize(pSerialPort, pSerialPortBaud, 8, 0, 0)) //开启串口通信
{
m_SerialIMP.SetComReadCallback( OnReadFromCommIMP );
//m_SerialIMP.SetNotCheckCallback(nullptr,NULL);
BYTE buffersend[10];
memset(buffersend,1,10);
m_SerialIMP.WriteABuffer(buffersend,sizeof(buffersend));
}
return 0;
}
}
//处理通过校验的IMP下行数据
LRESULT CDlgIMP::OnUpdateIMPDownDataChecked(WPARAM param, LPARAM lparam)
{
//数据解析与显示
//if(p_DlgIMP->IsWindowVisible())
//{
// p_DlgIMP->SetIMPData(g_FrameIMPDown);
//}
if(IMPDlgWindowVisible)
{
SetIMPData(g_FrameIMPDown);
}
return 0;
}

@ -0,0 +1,36 @@
#pragma once
#include "Global.h"
#include "resource.h"
#include "GlobalMessage.h"
#include "ComControlFunction.h"
#include "Serial.h"
// CDlgIMP 对话框
class CDlgIMP : public CDialogEx
{
DECLARE_DYNAMIC(CDlgIMP)
public:
CDlgIMP();
virtual ~CDlgIMP();
// 对话框数据
enum { IDD = IDD_DLG_IMP };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
void SetIMPData(CFrameIMPDown_ data);
afx_msg void OnBnClickedButton1();
afx_msg LRESULT ImpSerialConnectMessage(WPARAM param, LPARAM lparam); //IMP通信开始
virtual BOOL OnInitDialog();
CSerial m_SerialIMP; // IMP通信串口
char pSerialPort[20];//串口号
DWORD pSerialPortBaud;//端口号
//void onInitIMPFrame();//初始化IMP协议
afx_msg LRESULT OnUpdateIMPDownDataChecked(WPARAM param, LPARAM lparam); //处理IMP下行通过校验的遥测数据
};

@ -0,0 +1,110 @@
#include "StdAfx.h"
#include "FrameIMP_Down.h"
CFrameIMPDown_::CFrameIMPDown_(void)
{
_tcscpy(Name, _T("IMP下行"));
FrameLength = 6;
HeadLength = 1;
Head[0] = 0x55;
memcpy(Addr(), Head, HeadLength);
CheckLength = 1;
CheckPos = FrameLength - 2;
memset(&Data,0,sizeof(DataIMPDown));
memset(recvDataValue, 0, 6);
}
CFrameIMPDown_::~CFrameIMPDown_(void)
{
}
BOOL CFrameIMPDown_::FullFrame()
{
int HeaderPos, HeaderPos2;
HeaderPos = FindHead(0, Length() - HeadLength); //找第一个帧头
if (0 == HeaderPos) {
//帧头在最前面
if (OnCheck()) //CRC校验
DoCheck();
else {
if (Length() < FrameLength) //数据长度不足未通过CRC校验
{
if (Size() < FrameLength) //误码未通过CRC校验
{
DoDropBYTE((UINT16)HeadLength); //丢弃帧头
}
return TRUE;
}
else //误码未通过CRC校验
{
HeaderPos2 = FindHead(HeadLength, Length() - HeadLength);
if (HeaderPos2 >= 0)
{
Drop((UINT16) HeaderPos2);
return FALSE;
}
else
{
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
return TRUE;
}
}
}
} else if (HeaderPos < 0) {
//没找到帧头
DoDropBYTE((UINT16) (Length()-(HeadLength-1)));
} else {
//丢弃帧头前的数据
DoDropBYTE((UINT16) HeaderPos);
}
return FALSE;
}
BOOL CFrameIMPDown_::OnCheck()
{
//数据帧校验
BYTE* p = Addr();
memcpy(recvDataValue, p, 5);
if (Length() < FrameLength)
{
return false;
}
struCHECK ck1=CheckCRC(p);
//if (p[CheckPos] == ck1.C0 && p[CheckPos + 1] == ck1.C1)//CRC校验
if (p[CheckPos] == ck1.C0 )//和校验
{
memcpy(recvDataValue, p, 5);
return true;
}
else
{
return false;
}
}
void CFrameIMPDown_::DoCheck()
{
CountFrameAll++;
CountFrameCheck++;
OnDataCheck();
Drop(FrameLength);
}
struCHECK CFrameIMPDown_::CheckCRC(BYTE* const p)
{
return MakeCheckSum(p+1, FrameLength - HeadLength - CheckLength - 1);//1为帧尾IMP有一个字节的帧尾
}
void CFrameIMPDown_::Decode()
{
ProtocalIMPDown* pBuffIMP = (ProtocalIMPDown*)Addr();
Data.head = pBuffIMP->head;
Data.Bytes = pBuffIMP->Bytes;
Data.StatusWord = pBuffIMP->StatusWord;
Data.FaultWord = pBuffIMP->FaultWord;
Data.CHKSUM = pBuffIMP->CHKSUM;
Data.EndFlag = pBuffIMP->EndFlag;
}

@ -0,0 +1,84 @@
#include "FrameRecieve.h"
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifdef __WIN_32_VC__
typedef unsigned char BYTE;
typedef unsigned char INT8U;
typedef unsigned short INT16U;
typedef unsigned int INT32U;
typedef char INT8S;
typedef short INT16S;
typedef int INT32S;
#endif
#pragma pack(1)
//超视距通用协议帧
typedef struct struProtocalIMPDown{
UINT8 head; //帧头0x
UINT8 Bytes; //字节数
UINT8 StatusWord; //状态字
UINT8 FaultWord; //故障字
UINT8 CHKSUM; //校验和
UINT8 EndFlag; //结束标志
}ProtocalIMPDown;
#pragma pack()
//超视距通用帧数据
typedef struct struDataIMPDown{
UINT8 head; //帧头0x
UINT8 Bytes; //预留
UINT8 StatusWord; //状态字
UINT8 FaultWord; //故障字
UINT8 CHKSUM; //校验和
UINT8 EndFlag; //结束标志
}DataIMPDown;
class CFrameIMPDown_ : public CFrameAbstract
{
public:
CFrameIMPDown_(void);
~CFrameIMPDown_(void);
protected:
virtual BOOL FullFrame();
virtual BOOL OnCheck();
void DoCheck();
virtual struCHECK CheckCRC(BYTE* const p);
virtual void Decode();
BYTE recvDataValue[6];
public:
DataIMPDown Data; //IMP下行协议数据
public:
float LimitedValueF(float val,float minimum, float maximum)
{
val = val>maximum?maximum:val;
val = val<minimum?minimum:val;
return val;
}
int LimitedValueI(int val,int minimum, int maximum)
{
val = val>maximum?maximum:val;
val = val<minimum?minimum:val;
return val;
}
double LimitedValueD(double val,double minimum, double maximum)
{
val = val>maximum?maximum:val;
val = val<minimum?minimum:val;
return val;
}
};

@ -54,7 +54,6 @@ typedef void (CALLBACK *FLDropBYTECALLBACK)(CFrameAbstract* frm, UINT16 Count);
typedef void (CALLBACK *FLDropFrameCALLBACK)(CFrameAbstract* frm, UINT16 Count); typedef void (CALLBACK *FLDropFrameCALLBACK)(CFrameAbstract* frm, UINT16 Count);
typedef void (CALLBACK *FLNotCheckCALLBACK)(CFrameAbstract* frm); typedef void (CALLBACK *FLNotCheckCALLBACK)(CFrameAbstract* frm);
typedef void (CALLBACK *FLCheckCALLBACK)(CFrameAbstract* frm,LPVOID lp); typedef void (CALLBACK *FLCheckCALLBACK)(CFrameAbstract* frm,LPVOID lp);
//数据帧编帧、解析抽象类 //数据帧编帧、解析抽象类
class CFrameAbstract : public CBufferLoop { class CFrameAbstract : public CBufferLoop {
public: public:

@ -336,11 +336,11 @@ void ReplayInputData(const void* buffer, int length)
int iTimes = length/512; int iTimes = length/512;
for (int i = 0; i < iTimes; i++) for (int i = 0; i < iTimes; i++)
{ {
g_UDPTrans2Server.WriteBuffer(Buffer + i * 512, 512); // g_UDPTrans2Server.WriteBuffer(Buffer + i * 512, 512);
} }
if (length%512 > 0) if (length%512 > 0)
{ {
g_UDPTrans2Server.WriteBuffer(Buffer + iTimes * 512, length%512); // g_UDPTrans2Server.WriteBuffer(Buffer + iTimes * 512, length%512);
} }
//g_UDPTrans2Server.WriteBuffer(buffer, length); //g_UDPTrans2Server.WriteBuffer(buffer, length);
@ -373,7 +373,7 @@ void CALLBACK UDPRevTgtInfo(const void* buffer, int length, UINT32 data)
} }
} }
// CH96×é²¥ÊÕÊý // L链组播收数
void GetFH96DataFromNet() void GetFH96DataFromNet()
{ {
// 实时状态 // 实时状态
@ -393,26 +393,30 @@ void GetFH96DataFromNet()
&len); &len);
if (ret != SOCKET_ERROR) if (ret != SOCKET_ERROR)
{ {
//if (g_udpStarted)
// {
// int iTimes = ret/512;
// for (int i = 0; i < iTimes; i++)
// {
// g_UDPTrans2Server.WriteBuffer(Buffer + i * 512, 512);
// }
// if (ret%512 > 0)
// {
// g_UDPTrans2Server.WriteBuffer(Buffer + iTimes * 512, ret%512);
// }
//
// //g_UDPTrans2Server.WriteBuffer(Buffer, ret);
// }
// 处理数据 // 处理数据
SocketReceiveFH96Data(Buffer, ret); SocketReceiveFH96Data(Buffer, ret);
/*if (g_tcpStarted) /*if (g_tcpStarted)
{ {
g_TCPTrans2Server.WriteBuffer(Buffer, ret); g_TCPTrans2Server.WriteBuffer(Buffer, ret);
}*/ }*/
if (g_udpStarted)
{
int iTimes = ret/512;
for (int i = 0; i < iTimes; i++)
{
g_UDPTrans2Server.WriteBuffer(Buffer + i * 512, 512);
}
if (ret%512 > 0)
{
g_UDPTrans2Server.WriteBuffer(Buffer + iTimes * 512, ret%512);
}
//g_UDPTrans2Server.WriteBuffer(Buffer, ret);
}
} }
} }
} }
@ -438,7 +442,7 @@ void SocketReceiveFH96Data(const void* buffer, int length)
fwrite(buffer, static_cast<size_t>(1), length, g_pFileSaveCH96txData); // 写数据 fwrite(buffer, static_cast<size_t>(1), length, g_pFileSaveCH96txData); // 写数据
// 向移动终端发送数据 // 向移动终端发送数据
//g_UdpSend2Mobile.WriteBuffer(buffer, length); // g_UdpSend2Mobile.WriteBuffer(buffer, length);
} }
} }
@ -576,6 +580,7 @@ void ProcessCH96Data()
if (g_CH96_h264decoder != nullptr) if (g_CH96_h264decoder != nullptr)
{ {
g_CH96_h264decoder->decoding(midBuffer + 8, 248); g_CH96_h264decoder->decoding(midBuffer + 8, 248);
g_UDPTrans2Server.WriteBuffer(midBuffer + 8, 248);
} }
/* /*
if(g_tcpStarted==true){ if(g_tcpStarted==true){
@ -2778,3 +2783,20 @@ void ProcessH264VideoData()
} }
} }
} }
//功能:串口数字换算到标准的串口输出
//输入串口数值portID
//输出串口数组port
void GetSerialPortNumber(char *port, const CString portID)
{
CString strSerialPortNumber = portID;
strSerialPortNumber.Delete( 0, 4 );
int ptNumber = atoi( strSerialPortNumber );
CString str = _T( "" );
str.Format( "COM%d", ptNumber );
memcpy( port, str.GetBuffer( 255 ), str.GetLength() );
str.ReleaseBuffer();
}

@ -4,6 +4,7 @@
#include "MUDP.h" #include "MUDP.h"
#include "FrameFKU_Camera.h" #include "FrameFKU_Camera.h"
#define SAFE_DELETE(p) { if(p) { delete (p); (p) = nullptr; } } #define SAFE_DELETE(p) { if(p) { delete (p); (p) = nullptr; } }
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p) = nullptr; } } #define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p); (p) = nullptr; } }
@ -135,5 +136,4 @@ extern void GetH264VideoDataFromNet();
extern void SocketReceiveH264VideoData(const void* buffer, int length); extern void SocketReceiveH264VideoData(const void* buffer, int length);
extern void ProcessH264VideoData(); extern void ProcessH264VideoData();
extern void GetSerialPortNumber(char *port, const CString portID);//串口数字换算到标准的串口输出

@ -21,6 +21,7 @@ HWND g_JoyStickControlDlgHwnd = nullptr;
HWND g_CH96CtrlDlgHwnd = nullptr; HWND g_CH96CtrlDlgHwnd = nullptr;
HWND g_MulticastSocketReceiveDlgHwnd = nullptr; HWND g_MulticastSocketReceiveDlgHwnd = nullptr;
HWND g_mapMatchDlg = nullptr; HWND g_mapMatchDlg = nullptr;
HWND g_IMPDLGhwnd;//IMP窗口句柄
// 视频解码器 及 图像存储空间 // 视频解码器 及 图像存储空间
H264Decode g_EO_Decoder; H264Decode g_EO_Decoder;
@ -467,3 +468,23 @@ std::deque<QBStru> g_StitchImgDeque;
BOOL g_bRun = FALSE; BOOL g_bRun = FALSE;
BOOL g_bStop = FALSE; BOOL g_bStop = FALSE;
/*****IMP*****/
CFrameIMPDown_ g_FrameIMPDown;//IMP协议类实例化
bool IMPDlgWindowVisible;//IMP对话框为可视状态
//CDlgIMP * g_DlgIMP;//IMP对话框
//波特率列表
CString gComBaudItems[BAUDITEMNUM] =
{
"1200",
"2400",
"4800",
"9600",
"14400",
"19200",
"38400",
"56000",
"57600",
"115200"
};

@ -10,6 +10,8 @@
using namespace cv; using namespace cv;
#include "QBStru.h" #include "QBStru.h"
#include "FrameIMP_DOWN.h"
#include "DlgIMP.h"
// 命名 // 命名
typedef unsigned __int8 UINT8; typedef unsigned __int8 UINT8;
@ -38,6 +40,7 @@ extern HWND g_JoyStickControlDlgHwnd; // ҡ
extern HWND g_CH96CtrlDlgHwnd; // CH96控制页面 extern HWND g_CH96CtrlDlgHwnd; // CH96控制页面
extern HWND g_MulticastSocketReceiveDlgHwnd; // 组播收数窗口句柄 extern HWND g_MulticastSocketReceiveDlgHwnd; // 组播收数窗口句柄
extern HWND g_mapMatchDlg; extern HWND g_mapMatchDlg;
extern HWND g_IMPDLGhwnd;//IMP窗口句柄
// 视频解码器 及 图像存储空间 // 视频解码器 及 图像存储空间
@ -486,3 +489,13 @@ extern std::deque<QBStru> g_StitchImgDeque;
extern BOOL g_bRun; extern BOOL g_bRun;
extern BOOL g_bStop; extern BOOL g_bStop;
/*****IMP*****/
extern CFrameIMPDown_ g_FrameIMPDown;//IMP协议类实例化
extern bool IMPDlgWindowVisible;//IMP对话框为可视状态
//extern CDlgIMP* g_DlgIMP;//IMP对话框
//串口相关
const unsigned BAUDITEMNUM =10; //波特率数目
const unsigned NCOUNTER=500; //失败尝试次数
//波特率列表
extern CString gComBaudItems[BAUDITEMNUM];

@ -92,4 +92,8 @@ const UINT WM_OUTPUT_IMG = WM_USER + 6006;
const UINT WM_OUTPUT_QUADRANGLE = WM_USER + 6007; const UINT WM_OUTPUT_QUADRANGLE = WM_USER + 6007;
//IMP
#define WM_UPDATE_IMPDOWN_CHECKED WM_USER + 7008
#define WM_UPDATE_IMP_SERIAL_CONNECT WM_USER + 7009
#endif #endif

@ -0,0 +1,12 @@
#include "StdAfx.h"
#include "IMPConect.h"
IMPConect::IMPConect(void)
{
}
IMPConect::~IMPConect(void)
{
}

@ -0,0 +1,7 @@
#pragma once
class IMPConect
{
public:
IMPConect(void);
~IMPConect(void);
};

@ -33,6 +33,8 @@ IMPLEMENT_DYNAMIC(CMulticastSocketReceiveDlg, CDialogEx)
CMulticastSocketReceiveDlg::CMulticastSocketReceiveDlg(CWnd* pParent /*=NULL*/) CMulticastSocketReceiveDlg::CMulticastSocketReceiveDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CMulticastSocketReceiveDlg::IDD, pParent) : CDialogEx(CMulticastSocketReceiveDlg::IDD, pParent)
, m_iVideoSrc(0) , m_iVideoSrc(0)
, mComPortIMP(_T(""))
, mComBaudIMP(_T(""))
{ {
//, mStrCDPayLoadIPAddr(_T("0.0.0.0")) //, mStrCDPayLoadIPAddr(_T("0.0.0.0"))
@ -55,7 +57,9 @@ CMulticastSocketReceiveDlg::CMulticastSocketReceiveDlg(CWnd* pParent /*=NULL*/)
//卫通UDP单播 //卫通UDP单播
m_strSACUDPIPAddr = ""; m_strSACUDPIPAddr = "";
m_nSACUDPRemotePort = 2203; m_nSACUDPRemotePort = 2203;
m_nSACUDPLocalPort = 8002; m_nSACUDPLocalPort = 8009;
m_sysSetComNumber = 0;//窜口数
} }
CMulticastSocketReceiveDlg::~CMulticastSocketReceiveDlg() CMulticastSocketReceiveDlg::~CMulticastSocketReceiveDlg()
@ -68,6 +72,10 @@ void CMulticastSocketReceiveDlg::DoDataExchange(CDataExchange* pDX)
DDX_Control(pDX, IDC_IPADDRESS4,m_IPAddress_MultiCastIP); DDX_Control(pDX, IDC_IPADDRESS4,m_IPAddress_MultiCastIP);
DDX_Radio(pDX, IDC_RADIO_L, m_iVideoSrc); DDX_Radio(pDX, IDC_RADIO_L, m_iVideoSrc);
DDX_CBString(pDX, IDC_COMBO_PORT_IMP, mComPortIMP);
DDX_CBString(pDX, IDC_COMBO_BAUD_IMP, mComBaudIMP);
} }
@ -80,6 +88,12 @@ BEGIN_MESSAGE_MAP(CMulticastSocketReceiveDlg, CDialogEx)
ON_BN_CLICKED(IDC_RADIO_L, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked) ON_BN_CLICKED(IDC_RADIO_L, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked)
ON_BN_CLICKED(IDC_RADIO_SAC1, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked) ON_BN_CLICKED(IDC_RADIO_SAC1, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked)
ON_BN_CLICKED(IDC_RADIO_SAC2, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked) ON_BN_CLICKED(IDC_RADIO_SAC2, &CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked)
ON_CBN_SELCHANGE(IDC_COMBO_PORT_IMP, &CMulticastSocketReceiveDlg::OnCbnSelchangePortIMP)//串口号
ON_CBN_SELCHANGE(IDC_COMBO_BAUD_IMP, &CMulticastSocketReceiveDlg::OnCbnSelchangePortIMP)//波特率
ON_BN_CLICKED(IDC_BTN_IMP_SERIAL_CONNECT, &CMulticastSocketReceiveDlg::OnBnClickedBtnImpSerialConnect)
ON_BN_CLICKED(IDC_BTN_IMP_SERIAL_DISCONNECT, &CMulticastSocketReceiveDlg::OnBnClickedBtnImpSerialDisconnect)
END_MESSAGE_MAP() END_MESSAGE_MAP()
BOOL CMulticastSocketReceiveDlg::OnInitDialog() BOOL CMulticastSocketReceiveDlg::OnInitDialog()
@ -102,10 +116,15 @@ BOOL CMulticastSocketReceiveDlg::OnInitDialog()
// 设置按钮状态 // 设置按钮状态
GetDlgItem(IDC_BTN_MULTISOCKET_CONNECT)->EnableWindow(TRUE); GetDlgItem(IDC_BTN_MULTISOCKET_CONNECT)->EnableWindow(TRUE);
m_strServerPayLoadIPSend = _T("123.57.54.1"); m_strServerPayLoadIPSend = _T("192.168.1.20"); // udp单播转发的服务器IP
m_nServerSendLocalPort = 60302; m_nServerSendLocalPort = 60302;
m_nServerSendObjectPort = 11302; m_nServerSendObjectPort = 13001; // 远端端口
//添加串口号到列表框
AddPortNumberToComboBox();
//添加波特率到列表框
AddBaudNumberToComboBox();
return TRUE; // return TRUE unless you set the focus to a control return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE // 异常: OCX 属性页应返回 FALSE
@ -444,12 +463,12 @@ void CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked()
{ {
// 获取主机本地IP并显示 // 获取主机本地IP并显示
CString str_LocalIP_Receive; CString str_LocalIP_Receive;
str_LocalIP_Receive = _T("192.168.0.4"); str_LocalIP_Receive = _T("192.168.0.4"); // 界面展示本机卫通IP
GetDlgItem(IDC_EDIT_LOCALIP_RECEIVE)->SetWindowText(str_LocalIP_Receive); GetDlgItem(IDC_EDIT_LOCALIP_RECEIVE)->SetWindowText(str_LocalIP_Receive);
// 设置界面初始显示内容 // 设置界面初始显示内容
CString str_RemoteIP_Connect; CString str_RemoteIP_Connect;
str_RemoteIP_Connect = _T("192.168.0.180"); str_RemoteIP_Connect = _T("192.168.0.180"); // 界面展示IP
m_IPAddress_MultiCastIP.SetWindowText(str_RemoteIP_Connect); m_IPAddress_MultiCastIP.SetWindowText(str_RemoteIP_Connect);
GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->SetWindowText("8080"); GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->SetWindowText("8080");
GetDlgItem(IDC_EDIT_LOCALPORT_RECEIVE)->SetWindowTextA("8080"); GetDlgItem(IDC_EDIT_LOCALPORT_RECEIVE)->SetWindowTextA("8080");
@ -461,7 +480,7 @@ void CMulticastSocketReceiveDlg::CreateUDPSocketReceiveData()
{ {
//卫通UDP连接 //卫通UDP连接
m_nSACUDPSocket.SetCallBack(OnReadFromUDPSACKU, this); m_nSACUDPSocket.SetCallBack(OnReadFromUDPSACKU, this);
CString strLocalIPAddr = _T("192.168.0.4"); CString strLocalIPAddr = _T("192.168.1.20"); // 卫通接受IP
m_nSACUDPSocket.SetParams(strLocalIPAddr, m_nSACUDPLocalPort, m_strSACUDPIPAddr, m_nSACUDPRemotePort); m_nSACUDPSocket.SetParams(strLocalIPAddr, m_nSACUDPLocalPort, m_strSACUDPIPAddr, m_nSACUDPRemotePort);
if (m_nSACUDPSocket.StartListening()) if (m_nSACUDPSocket.StartListening())
{ {
@ -480,3 +499,187 @@ void CMulticastSocketReceiveDlg::CreateUDPSocketReceiveData()
ShowMulticastSocketInfoReceive(); ShowMulticastSocketInfoReceive();
} }
} }
//添加系统串口到组合选择框
void CMulticastSocketReceiveDlg::AddPortNumberToComboBox()
{
int *comPortList = new int[MaxComPortNumber];
memset( comPortList, 0, MaxComPortNumber );
//系统设置的串口数目
int sysSetComNumber = 0;
//获得系统当前的串口数量存于数组comPortList中
BOOL bScanPort = ScanPCCom( comPortList, sysSetComNumber );
m_sysSetComNumber = sysSetComNumber;
if ( !bScanPort ) //读取失败
{
if ( comPortList != NULL )
{
delete[]comPortList;
comPortList = NULL;
}
return;
}
//对数组进行升序排列
OrderComPortList( comPortList, sysSetComNumber );
//写入对话框的CComboBox中
CString str;
for ( int i = 0; i < sysSetComNumber; ++i )
{
str.Format( "串口%d", comPortList[i] );
( ( CComboBox * ) GetDlgItem( IDC_COMBO_PORT_IMP ) )->InsertString( i, str ); //IMP串口号
}
int setComPos = 0;
//配置文件设置
SetComboBoxCurSel( IDC_COMBO_PORT_IMP, comPortList, sysSetComNumber, mComPortIMP );
if ( comPortList != NULL )
{
delete[]comPortList;
comPortList = NULL;
}
}
//添加串口波特率到组合选择框
void CMulticastSocketReceiveDlg::AddBaudNumberToComboBox()
{
int iCount0=( ( CComboBox * ) GetDlgItem( IDC_COMBO_BAUD_IMP ) )->GetCount(); //IMP串口波特率
if(iCount0 < 1)
{
for(int i = 0; i < BAUDITEMNUM; ++i ){
( ( CComboBox * ) GetDlgItem( IDC_COMBO_BAUD_IMP ) )->InsertString( i, gComBaudItems[i] );
}
}
//配置文件设置的SD2串口
SetComboBaudCurSel( IDC_COMBO_BAUD_IMP, gComBaudItems, BAUDITEMNUM, mComBaudIMP );
}
//从配置文件中读取指定串口号
void CMulticastSocketReceiveDlg::SetComboBoxCurSel( int comboBoxID, const int *portArray, const int& arrLength,CString& strPortNumber )
{
if ( strPortNumber.GetLength() <= 4 )
{
strPortNumber = _T( "" );
return;
}
CString initializeComPort = strPortNumber;
initializeComPort.Delete( 0, 4 );
int filePortValue = atoi( initializeComPort );
int setComPos = 0;
if ( FindItemFromComList( setComPos, portArray, arrLength, filePortValue ) )
{
( ( CComboBox * ) GetDlgItem( comboBoxID ) )->SetCurSel( setComPos );
}
else
{
strPortNumber = _T( "" );
}
}
//对串口数组进行升序排列
void CMulticastSocketReceiveDlg::OrderComPortList( int *portArray, const int& arrLength )
{
int portValue = 0;
for ( int i = 0; i < arrLength - 1; ++i )
{
for ( int j = i + 1; j < arrLength; ++j )
{
if ( portArray[i] > portArray[j] )
{
portValue = portArray[i];
portArray[i] = portArray[j];
portArray[j] = portValue;
}
}
}
}
//给指定的波特率组合框设定选择值
void CMulticastSocketReceiveDlg::SetComboBaudCurSel( int comboBoxID, const CString *baudArray, const int& arrLength,CString& strBaudNumber )
{
if ( strBaudNumber.GetLength() <= 0 )
{
strBaudNumber = _T( "" );
return;
}
CString initializeComBaud = strBaudNumber;
initializeComBaud.Trim();
int fileBaudValue = atoi( initializeComBaud );
int setBaudPos = -1;
if ( FindItemFromBaudList( setBaudPos, baudArray, arrLength, fileBaudValue ) )
{
( ( CComboBox * ) GetDlgItem( comboBoxID ) )->SetCurSel( setBaudPos );
}
else
{
strBaudNumber = _T( "" );
}
}
//从波特率列表中查找指定波特率
bool CMulticastSocketReceiveDlg::FindItemFromBaudList( int& pos, const CString *baudArray, const int& arrLength, const int& itemValue )
{
for ( int i = 0; i < arrLength; ++i )
{
if ( itemValue == atoi((baudArray[i])) )
{
pos = i;
return true;
}
}
return false;
}
//IMP通信串口选择后触发
void CMulticastSocketReceiveDlg::OnCbnSelchangePortIMP()
{
UpdateData( true );
//判断该串口是否已经被占用
if ( !CheckComPortCanWork( mComPortIMP ) )
{
( ( CComboBox * ) GetDlgItem( IDC_COMBO_PORT_IMP ) )->SetCurSel( -1 );
}
}
//IMP通信串口波特率选择后触发
void CMulticastSocketReceiveDlg::OnCbnSelchangeBaudIMP()
{
UpdateData( true );
//判断该串口是否已经被占用
if ( !CheckComPortCanWork( mComPortIMP ) )
{
( ( CComboBox * ) GetDlgItem( IDC_COMBO_BAUD_IMP ) )->SetCurSel( -1 );
}
}
void CMulticastSocketReceiveDlg::OnBnClickedBtnImpSerialConnect()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BTN_IMP_SERIAL_CONNECT)->EnableWindow(FALSE);
GetDlgItem(IDC_BTN_IMP_SERIAL_DISCONNECT)->EnableWindow(TRUE);
::SendMessageA(g_IMPDLGhwnd,WM_UPDATE_IMP_SERIAL_CONNECT,(WPARAM)mComPortIMP.AllocSysString(), (LPARAM)mComBaudIMP.AllocSysString());
}
void CMulticastSocketReceiveDlg::OnBnClickedBtnImpSerialDisconnect()
{
// TODO: 在此添加控件通知处理程序代码
GetDlgItem(IDC_BTN_IMP_SERIAL_CONNECT)->EnableWindow(TRUE);
GetDlgItem(IDC_BTN_IMP_SERIAL_DISCONNECT)->EnableWindow(FALSE);
::SendMessageA(g_IMPDLGhwnd,WM_UPDATE_IMP_SERIAL_CONNECT,(WPARAM)mComPortIMP.AllocSysString(), (LPARAM)mComBaudIMP.AllocSysString());
}

@ -9,6 +9,8 @@
#include "afxwin.h" #include "afxwin.h"
#include "afxcmn.h" #include "afxcmn.h"
#include "opencv2/core/core.hpp" #include "opencv2/core/core.hpp"
#include "ComControlFunction.h"
// CMulticastSocketReceiveDlg 对话框 // CMulticastSocketReceiveDlg 对话框
class CMulticastSocketReceiveDlg : public CDialogEx class CMulticastSocketReceiveDlg : public CDialogEx
@ -81,4 +83,28 @@ public:
int m_nSACUDPLocalPort; //卫通UDP单播本地端口 int m_nSACUDPLocalPort; //卫通UDP单播本地端口
CUDPSocket m_nSACUDPSocket; //卫通UDP通信套接字 CUDPSocket m_nSACUDPSocket; //卫通UDP通信套接字
void CreateUDPSocketReceiveData(); //卫通UDP数据通信创建 void CreateUDPSocketReceiveData(); //卫通UDP数据通信创建
//IMP
CString mComPortIMP; //IMP通信串口号
CString mComBaudIMP; //IMP通信串口波特率
//const int MaxComPortNumber = 1024;
//const unsigned BAUDITEMNUM = 10; //波特率数目
//const unsigned NCOUNTER = 500; //失败尝试次数
private:
//添加系统串口到组合选择框
void AddPortNumberToComboBox();
void SetComboBoxCurSel( int comboBoxID, const int *portArray, const int& arrLength, CString& strPortNumber );
void SetComboBaudCurSel( int comboBoxID, const CString *baudArray, const int& arrLength, CString& strBaudNumber );
bool FindItemFromBaudList( int& pos, const CString *baudArray, const int& arrLength, const int& itemValue );
void AddBaudNumberToComboBox();
void OrderComPortList( int *portArray, const int& arrLength );
public:
afx_msg void OnCbnSelchangePortIMP();//串口号选择触发函数
afx_msg void OnCbnSelchangeBaudIMP();//串口波特率选择触发函数
private:
int m_sysSetComNumber; //串口数
public:
afx_msg void OnBnClickedBtnImpSerialConnect();
afx_msg void OnBnClickedBtnImpSerialDisconnect();
}; };

@ -218,9 +218,9 @@ BYTE parity ,У
BYTE stopbits, BYTE stopbits,
: BOOL : BOOL
: :
: : : : : : : :char *serial_port,
-----------------------------------------------------------------------------*/ -----------------------------------------------------------------------------*/
BOOL CSerial::Initialize(char *serial_port, BOOL CSerial::Initialize(PCTSTR serial_port,
DWORD baud_rate/*=CBR_9600*/, DWORD baud_rate/*=CBR_9600*/,
BYTE byte_size/*=8*/, BYTE byte_size/*=8*/,
BYTE parity/*=PARITY_NONE*/, BYTE parity/*=PARITY_NONE*/,
@ -228,7 +228,12 @@ BOOL CSerial::Initialize(char *serial_port,
{ {
if(m_bIsInitialized) if(m_bIsInitialized)
DeInit(); DeInit();
m_hComHandle=CreateFile(serial_port,
TCHAR name[256];
_tcscpy(name, _T("\\\\.\\"));
_tcscat(name, serial_port);
m_hComHandle=CreateFile(name,
GENERIC_READ|GENERIC_WRITE, GENERIC_READ|GENERIC_WRITE,
0, 0,
0, 0,

@ -97,9 +97,9 @@ public:
4. parity , 4. parity ,
5. stopbits, 5. stopbits,
: BOOL : BOOL char *serial_port,
*/ */
BOOL Initialize(char *serial_port, BOOL Initialize(PCTSTR serial_port,
DWORD baud_rate = CBR_9600, DWORD baud_rate = CBR_9600,
BYTE byte_size = 8, BYTE byte_size = 8,
BYTE parity = NOPARITY, BYTE parity = NOPARITY,

@ -233,4 +233,23 @@ inline struCHECK getCRC8(UINT8* data, int len)
return ck; return ck;
} }
//şÍĐŁŃé
//inline UINT8 MakeCheckSum(UINT8 *ptr, UINT8 len)
inline struCHECK MakeCheckSum(UINT8 *ptr, UINT8 len)
{
UINT8 i;
UINT8 CK_A=0;
BYTE *pData = ptr;
for (i=0; i < len; ++i )
{
CK_A = CK_A + ptr[i];
}
//return CK_A;
struCHECK ck;
ck.C0=CK_A;
ck.C1=0x00;
return ck;
}
#endif//_BASE_TYPE_H_ #endif//_BASE_TYPE_H_

@ -66,9 +66,12 @@ public:
memcpy(FBuffer, abl.FBuffer, FSize); memcpy(FBuffer, abl.FBuffer, FSize);
} }
virtual ~CBufferLoop(){ virtual ~CBufferLoop(){
delete[] FBuffer; delete[] FBuffer;
FBuffer = 0; FBuffer = 0;
delete cs; //by CYH 不注释会报错,原因未知
//delete cs;
} }
CBufferLoop& operator=(const CBufferLoop& abl) CBufferLoop& operator=(const CBufferLoop& abl)
{ {

@ -35,6 +35,7 @@
#endif // _AFX_NO_AFXCMN_SUPPORT #endif // _AFX_NO_AFXCMN_SUPPORT
#include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持 #include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持
#include <afxdlgs.h>

@ -0,0 +1,3 @@
202401221
增加IMP对话框
增加IMP上下行通信连接
Loading…
Cancel
Save