diff --git a/Lib/Decoder_H264_ALLD.lib b/Lib/Decoder_H264_ALLD.lib index 34074e1..a261865 100644 Binary files a/Lib/Decoder_H264_ALLD.lib and b/Lib/Decoder_H264_ALLD.lib differ diff --git a/Lib/Decoder_H264_ALLR.lib b/Lib/Decoder_H264_ALLR.lib index 0ffefa3..b45e06e 100644 Binary files a/Lib/Decoder_H264_ALLR.lib and b/Lib/Decoder_H264_ALLR.lib differ diff --git a/Src/CH91PayloadSoftware/CH91PayloadSoftware.cpp b/Src/CH91PayloadSoftware/CH91PayloadSoftware.cpp index 12ef94d..1be3c39 100644 --- a/Src/CH91PayloadSoftware/CH91PayloadSoftware.cpp +++ b/Src/CH91PayloadSoftware/CH91PayloadSoftware.cpp @@ -60,6 +60,7 @@ BOOL CCH91PayloadSoftwareApp::InitInstance() Md5Encode m_Md5Encoder; str1 = m_Md5Encoder.Encode(str1); + //str1 = "A1335FA36BDA99F1E5D53DD08FDF7898"; string str2 = "FEIPENGZHIKONG2021.";//密钥 str1 = m_desUtils.H(str1);//十六进制转换为二进制 diff --git a/Src/CH91PayloadSoftware/CH91PayloadSoftware.rc b/Src/CH91PayloadSoftware/CH91PayloadSoftware.rc index 9f42df1..4063695 100644 Binary files a/Src/CH91PayloadSoftware/CH91PayloadSoftware.rc and b/Src/CH91PayloadSoftware/CH91PayloadSoftware.rc differ diff --git a/Src/CH91PayloadSoftware/CH91PayloadSoftware.vcxproj b/Src/CH91PayloadSoftware/CH91PayloadSoftware.vcxproj index 8aed757..c0148c3 100644 --- a/Src/CH91PayloadSoftware/CH91PayloadSoftware.vcxproj +++ b/Src/CH91PayloadSoftware/CH91PayloadSoftware.vcxproj @@ -49,15 +49,15 @@ true ..\..\Bin\ $(Configuration)\ - C:\ProgramFiles\boost_1_56;$(IncludePath) - C:\ProgramFiles\boost_1_56\stage\lib;$(LibraryPath) + E:\FH-98鏈鸿浇鐩告満鐩戞帶杞欢2023\ProgramFiles\boost_1_56;E:\FH-98鏈鸿浇鐩告満鐩戞帶杞欢2023\ProgramFiles\opencv245\include;E:\FH-98鏈鸿浇鐩告満鐩戞帶杞欢2023\ProgramFiles\gdal\include;$(IncludePath) + 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) false ..\..\Bin\ ..\..\Bin\ - C:\ProgramFiles\boost_1_56;$(IncludePath) - C:\ProgramFiles\boost_1_56\stage\lib;$(LibraryPath) + 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) + 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) FH98PayloadOnBoard @@ -176,13 +176,17 @@ + + + + @@ -225,10 +229,14 @@ + + + + diff --git a/Src/CH91PayloadSoftware/CH91PayloadSoftware.vcxproj.filters b/Src/CH91PayloadSoftware/CH91PayloadSoftware.vcxproj.filters index c82d0e3..5c51045 100644 --- a/Src/CH91PayloadSoftware/CH91PayloadSoftware.vcxproj.filters +++ b/Src/CH91PayloadSoftware/CH91PayloadSoftware.vcxproj.filters @@ -79,6 +79,21 @@ {ab6ee3f8-60f1-43e8-9f15-bbb160de9c67} + + {f06cd1e0-85bf-45a0-867a-ee5a88d8e499} + + + {ac0ffa33-f9fc-4e75-9781-73b28c12be43} + + + {14c6a6db-8887-4abf-aeee-f39bfcb37fc6} + + + {04315dca-4ce2-425a-bcc9-d26fe11219c5} + + + {8eb1f68d-8c2d-485d-b3bd-9859d81467d5} + @@ -357,6 +372,18 @@ 鍔犺В瀵 + + 閫氫俊鐩稿叧\涓插彛绫籠涓插彛鎺у埗鐩稿叧 + + + IMP\閫氫俊 + + + IMP\瀵硅瘽妗 + + + IMP\鍗忚 + @@ -470,6 +497,18 @@ 鍔犺В瀵 + + 閫氫俊鐩稿叧\涓插彛绫籠涓插彛鎺у埗鐩稿叧 + + + IMP\閫氫俊 + + + IMP\瀵硅瘽妗 + + + IMP\鍗忚 + diff --git a/Src/CH91PayloadSoftware/CH91PayloadSoftwareDlg.cpp b/Src/CH91PayloadSoftware/CH91PayloadSoftwareDlg.cpp index 541c549..002d511 100644 --- a/Src/CH91PayloadSoftware/CH91PayloadSoftwareDlg.cpp +++ b/Src/CH91PayloadSoftware/CH91PayloadSoftwareDlg.cpp @@ -81,6 +81,8 @@ CCH91PayloadSoftwareDlg::CCH91PayloadSoftwareDlg(CWnd* pParent /*=NULL*/) g_bMapDirectGuide = FALSE; // 是否是地图直接导引标志 p_DlgCameraCtrl = NULL; + g_DlgIMP = NULL;//IMP对话框初始化指针 + } void CCH91PayloadSoftwareDlg::DoDataExchange(CDataExchange* pDX) @@ -121,6 +123,9 @@ BEGIN_MESSAGE_MAP(CCH91PayloadSoftwareDlg, CDialogEx) ON_WM_MBUTTONDOWN() ON_WM_MOUSEMOVE() ON_WM_MBUTTONUP() + + //ON_MESSAGE(WM_UPDATE_IMPDOWN_CHECKED, OnUpdateIMPDownDataChecked) //更新IMP下行遥测数据 + END_MESSAGE_MAP() @@ -347,6 +352,7 @@ BOOL CCH91PayloadSoftwareDlg::OnInitDialog() assert(LocalPort1 != 0 && RemotePort1 != 0); g_bCreatSend2Mobile = g_UdpSend2Mobile.StartListening(LocalIp1, LocalPort1, RemoteIp1, RemotePort1); */ + return TRUE; } @@ -378,6 +384,29 @@ void CCH91PayloadSoftwareDlg::OnInitControlDlg() } p_DlgCameraCtrl->MoveWindow(&rc_ControlInstruction); 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() @@ -584,6 +613,13 @@ void CCH91PayloadSoftwareDlg::OnDestroy() delete p_DlgCameraCtrl; 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.DrawTransparent(TRUE); + + //会报错,原因不明 // 状态查看 - m_Btn_FJ.SubclassDlgItem(IDC_BTN_SHOW_FJ, this); - m_Btn_FJ.SetIcon(IDI_ICON_MAIN_FJ); - m_Btn_FJ.SetTooltipText("Status Inquiry"); - m_Btn_FJ.SetAlign(CButtonST::ST_ALIGN_VERT);// 文字在下 - m_Btn_FJ.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151)); - m_Btn_FJ.DrawTransparent(TRUE); + //m_Btn_FJ.SubclassDlgItem(IDC_BTN_SHOW_FJ, this); + //m_Btn_FJ.SetIcon(IDI_ICON_MAIN_FJ); + //m_Btn_FJ.SetTooltipText("Status Inquiry"); + //m_Btn_FJ.SetAlign(CButtonST::ST_ALIGN_VERT);// 文字在下 + //m_Btn_FJ.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(29, 191, 151)); + //m_Btn_FJ.DrawTransparent(TRUE); + // 组播收数 m_Btn_SocketReceive.SubclassDlgItem(IDC_BTN_MULTICASTSOCKETRECEIVE, this); m_Btn_SocketReceive.SetIcon(IDI_ICON_MAIN_SOCKETSEND); @@ -2021,3 +2060,60 @@ double CCH91PayloadSoftwareDlg::GetOffsetAngle(int X, int Y) 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; +//} \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/CH91PayloadSoftwareDlg.h b/Src/CH91PayloadSoftware/CH91PayloadSoftwareDlg.h index 3e60ff3..a3d38f0 100644 --- a/Src/CH91PayloadSoftware/CH91PayloadSoftwareDlg.h +++ b/Src/CH91PayloadSoftware/CH91PayloadSoftwareDlg.h @@ -21,7 +21,8 @@ #include "afxwin.h" #include "afxcmn.h" #include "DlgCameraCtrl.h" - +#include "DlgIMP.h" +//#include "FrameIMP_DOWN.h" // CCH91PayloadSoftwareDlg 对话框 class CCH91PayloadSoftwareDlg : public CDialogEx @@ -192,4 +193,14 @@ public: afx_msg void OnMButtonUp(UINT nFlags, CPoint point); // 计算拖动鼠标时,偏移量形成的角度 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下行通过校验的遥测数据 + }; diff --git a/Src/CH91PayloadSoftware/ComControlFunction.cpp b/Src/CH91PayloadSoftware/ComControlFunction.cpp new file mode 100644 index 0000000..596c527 --- /dev/null +++ b/Src/CH91PayloadSoftware/ComControlFunction.cpp @@ -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; +} + + diff --git a/Src/CH91PayloadSoftware/ComControlFunction.h b/Src/CH91PayloadSoftware/ComControlFunction.h new file mode 100644 index 0000000..c55fad4 --- /dev/null +++ b/Src/CH91PayloadSoftware/ComControlFunction.h @@ -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 \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/DlgIMP.cpp b/Src/CH91PayloadSoftware/DlgIMP.cpp new file mode 100644 index 0000000..fc019df --- /dev/null +++ b/Src/CH91PayloadSoftware/DlgIMP.cpp @@ -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; +} \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/DlgIMP.h b/Src/CH91PayloadSoftware/DlgIMP.h new file mode 100644 index 0000000..1177117 --- /dev/null +++ b/Src/CH91PayloadSoftware/DlgIMP.h @@ -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下行通过校验的遥测数据 +}; diff --git a/Src/CH91PayloadSoftware/FrameIMP_DOWN.cpp b/Src/CH91PayloadSoftware/FrameIMP_DOWN.cpp new file mode 100644 index 0000000..3bd1321 --- /dev/null +++ b/Src/CH91PayloadSoftware/FrameIMP_DOWN.cpp @@ -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; +} \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/FrameIMP_DOWN.h b/Src/CH91PayloadSoftware/FrameIMP_DOWN.h new file mode 100644 index 0000000..21a8a29 --- /dev/null +++ b/Src/CH91PayloadSoftware/FrameIMP_DOWN.h @@ -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 = valmaximum?maximum:val; + val = valmaximum?maximum:val; + val = val 0) { - g_UDPTrans2Server.WriteBuffer(Buffer + iTimes * 512, length%512); + // g_UDPTrans2Server.WriteBuffer(Buffer + iTimes * 512, length%512); } //g_UDPTrans2Server.WriteBuffer(buffer, length); @@ -373,7 +373,7 @@ void CALLBACK UDPRevTgtInfo(const void* buffer, int length, UINT32 data) } } -// CH96组播收数 +// L链组播收数 void GetFH96DataFromNet() { // 实时状态 @@ -393,26 +393,30 @@ void GetFH96DataFromNet() &len); 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); /*if (g_tcpStarted) { 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(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) { g_CH96_h264decoder->decoding(midBuffer + 8, 248); + g_UDPTrans2Server.WriteBuffer(midBuffer + 8, 248); } /* 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(); +} \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/Global.h b/Src/CH91PayloadSoftware/Global.h index 13e7548..be0ff31 100644 --- a/Src/CH91PayloadSoftware/Global.h +++ b/Src/CH91PayloadSoftware/Global.h @@ -4,6 +4,7 @@ #include "MUDP.h" #include "FrameFKU_Camera.h" + #define SAFE_DELETE(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 ProcessH264VideoData(); - - +extern void GetSerialPortNumber(char *port, const CString portID);//串口数字换算到标准的串口输出 \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/GlobalMember.cpp b/Src/CH91PayloadSoftware/GlobalMember.cpp index 96e84f0..08a9c95 100644 --- a/Src/CH91PayloadSoftware/GlobalMember.cpp +++ b/Src/CH91PayloadSoftware/GlobalMember.cpp @@ -21,6 +21,7 @@ HWND g_JoyStickControlDlgHwnd = nullptr; HWND g_CH96CtrlDlgHwnd = nullptr; HWND g_MulticastSocketReceiveDlgHwnd = nullptr; HWND g_mapMatchDlg = nullptr; +HWND g_IMPDLGhwnd;//IMP窗口句柄 // 视频解码器 及 图像存储空间 H264Decode g_EO_Decoder; @@ -466,4 +467,24 @@ HANDLE g_hMutex_ImgStitch = nullptr; std::deque g_StitchImgDeque; 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" +}; \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/GlobalMember.h b/Src/CH91PayloadSoftware/GlobalMember.h index 3cf8286..225c9a1 100644 --- a/Src/CH91PayloadSoftware/GlobalMember.h +++ b/Src/CH91PayloadSoftware/GlobalMember.h @@ -10,6 +10,8 @@ using namespace cv; #include "QBStru.h" +#include "FrameIMP_DOWN.h" +#include "DlgIMP.h" // 命名 typedef unsigned __int8 UINT8; @@ -38,6 +40,7 @@ extern HWND g_JoyStickControlDlgHwnd; // 摇 extern HWND g_CH96CtrlDlgHwnd; // CH96控制页面 extern HWND g_MulticastSocketReceiveDlgHwnd; // 组播收数窗口句柄 extern HWND g_mapMatchDlg; +extern HWND g_IMPDLGhwnd;//IMP窗口句柄 // 视频解码器 及 图像存储空间 @@ -486,3 +489,13 @@ extern std::deque g_StitchImgDeque; extern BOOL g_bRun; 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]; \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/GlobalMessage.h b/Src/CH91PayloadSoftware/GlobalMessage.h index dfa7e58..85403a3 100644 --- a/Src/CH91PayloadSoftware/GlobalMessage.h +++ b/Src/CH91PayloadSoftware/GlobalMessage.h @@ -92,4 +92,8 @@ const UINT WM_OUTPUT_IMG = WM_USER + 6006; 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 \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/IMPConect.cpp b/Src/CH91PayloadSoftware/IMPConect.cpp new file mode 100644 index 0000000..1cc5512 --- /dev/null +++ b/Src/CH91PayloadSoftware/IMPConect.cpp @@ -0,0 +1,12 @@ +#include "StdAfx.h" +#include "IMPConect.h" + + +IMPConect::IMPConect(void) +{ +} + + +IMPConect::~IMPConect(void) +{ +} \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/IMPConect.h b/Src/CH91PayloadSoftware/IMPConect.h new file mode 100644 index 0000000..dd13dda --- /dev/null +++ b/Src/CH91PayloadSoftware/IMPConect.h @@ -0,0 +1,7 @@ +#pragma once +class IMPConect +{ +public: + IMPConect(void); + ~IMPConect(void); +}; \ No newline at end of file diff --git a/Src/CH91PayloadSoftware/MulticastSocketReceiveDlg.cpp b/Src/CH91PayloadSoftware/MulticastSocketReceiveDlg.cpp index 71e0fb9..754404d 100644 --- a/Src/CH91PayloadSoftware/MulticastSocketReceiveDlg.cpp +++ b/Src/CH91PayloadSoftware/MulticastSocketReceiveDlg.cpp @@ -33,6 +33,8 @@ IMPLEMENT_DYNAMIC(CMulticastSocketReceiveDlg, CDialogEx) CMulticastSocketReceiveDlg::CMulticastSocketReceiveDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CMulticastSocketReceiveDlg::IDD, pParent) , m_iVideoSrc(0) + , mComPortIMP(_T("")) + , mComBaudIMP(_T("")) { //, mStrCDPayLoadIPAddr(_T("0.0.0.0")) @@ -55,7 +57,9 @@ CMulticastSocketReceiveDlg::CMulticastSocketReceiveDlg(CWnd* pParent /*=NULL*/) //卫通UDP单播 m_strSACUDPIPAddr = ""; m_nSACUDPRemotePort = 2203; - m_nSACUDPLocalPort = 8002; + m_nSACUDPLocalPort = 8009; + + m_sysSetComNumber = 0;//窜口数 } CMulticastSocketReceiveDlg::~CMulticastSocketReceiveDlg() @@ -68,6 +72,10 @@ void CMulticastSocketReceiveDlg::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_IPADDRESS4,m_IPAddress_MultiCastIP); 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_SAC1, &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() BOOL CMulticastSocketReceiveDlg::OnInitDialog() @@ -102,10 +116,15 @@ BOOL CMulticastSocketReceiveDlg::OnInitDialog() // 设置按钮状态 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_nServerSendObjectPort = 11302; + m_nServerSendObjectPort = 13001; // 远端端口 + + //添加串口号到列表框 + AddPortNumberToComboBox(); + //添加波特率到列表框 + AddBaudNumberToComboBox(); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE @@ -444,12 +463,12 @@ void CMulticastSocketReceiveDlg::OnRadioBtnVideoSrcClicked() { // 获取主机本地IP并显示 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); // 设置界面初始显示内容 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); GetDlgItem(IDC_EDIT_MULTISOCKETPORT_RECEIVE)->SetWindowText("8080"); GetDlgItem(IDC_EDIT_LOCALPORT_RECEIVE)->SetWindowTextA("8080"); @@ -461,7 +480,7 @@ void CMulticastSocketReceiveDlg::CreateUDPSocketReceiveData() { //卫通UDP连接 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); if (m_nSACUDPSocket.StartListening()) { @@ -480,3 +499,187 @@ void CMulticastSocketReceiveDlg::CreateUDPSocketReceiveData() 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()); + +} diff --git a/Src/CH91PayloadSoftware/MulticastSocketReceiveDlg.h b/Src/CH91PayloadSoftware/MulticastSocketReceiveDlg.h index 98c7fcc..8c662ac 100644 --- a/Src/CH91PayloadSoftware/MulticastSocketReceiveDlg.h +++ b/Src/CH91PayloadSoftware/MulticastSocketReceiveDlg.h @@ -9,6 +9,8 @@ #include "afxwin.h" #include "afxcmn.h" #include "opencv2/core/core.hpp" +#include "ComControlFunction.h" + // CMulticastSocketReceiveDlg 对话框 class CMulticastSocketReceiveDlg : public CDialogEx @@ -81,4 +83,28 @@ public: int m_nSACUDPLocalPort; //卫通UDP单播本地端口 CUDPSocket m_nSACUDPSocket; //卫通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(); }; diff --git a/Src/CH91PayloadSoftware/Serial.cpp b/Src/CH91PayloadSoftware/Serial.cpp index f06cd0a..9ed4292 100644 --- a/Src/CH91PayloadSoftware/Serial.cpp +++ b/Src/CH91PayloadSoftware/Serial.cpp @@ -218,9 +218,9 @@ BYTE parity ,校 BYTE stopbits,停止位长度 返回值: BOOL 型,表明是否初始化成功 备注: -修改记录: 日期: 作者: 备注: +修改记录: 日期: 作者: 备注:char *serial_port, -----------------------------------------------------------------------------*/ -BOOL CSerial::Initialize(char *serial_port, +BOOL CSerial::Initialize(PCTSTR serial_port, DWORD baud_rate/*=CBR_9600*/, BYTE byte_size/*=8*/, BYTE parity/*=PARITY_NONE*/, @@ -228,7 +228,12 @@ BOOL CSerial::Initialize(char *serial_port, { if(m_bIsInitialized) DeInit(); - m_hComHandle=CreateFile(serial_port, + + TCHAR name[256]; + _tcscpy(name, _T("\\\\.\\")); + _tcscat(name, serial_port); + + m_hComHandle=CreateFile(name, GENERIC_READ|GENERIC_WRITE, 0, 0, diff --git a/Src/CH91PayloadSoftware/Serial.h b/Src/CH91PayloadSoftware/Serial.h index 77d681a..1adac55 100644 --- a/Src/CH91PayloadSoftware/Serial.h +++ b/Src/CH91PayloadSoftware/Serial.h @@ -97,9 +97,9 @@ public: 4. parity ,校验类型 5. stopbits,停止位长度 输出: - 返回值: BOOL 型,表明是否初始化成功 + 返回值: BOOL 型,表明是否初始化成功char *serial_port, */ - BOOL Initialize(char *serial_port, + BOOL Initialize(PCTSTR serial_port, DWORD baud_rate = CBR_9600, BYTE byte_size = 8, BYTE parity = NOPARITY, diff --git a/Src/CH91PayloadSoftware/basetype.h b/Src/CH91PayloadSoftware/basetype.h index 000417f..b088f8e 100644 --- a/Src/CH91PayloadSoftware/basetype.h +++ b/Src/CH91PayloadSoftware/basetype.h @@ -233,4 +233,23 @@ inline struCHECK getCRC8(UINT8* data, int len) 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_ diff --git a/Src/CH91PayloadSoftware/bufferloop.h b/Src/CH91PayloadSoftware/bufferloop.h index 6c19845..af47aaa 100644 --- a/Src/CH91PayloadSoftware/bufferloop.h +++ b/Src/CH91PayloadSoftware/bufferloop.h @@ -66,9 +66,12 @@ public: memcpy(FBuffer, abl.FBuffer, FSize); } virtual ~CBufferLoop(){ + delete[] FBuffer; FBuffer = 0; - delete cs; + //by CYH 不注释会报错,原因未知 + //delete cs; + } CBufferLoop& operator=(const CBufferLoop& abl) { diff --git a/Src/CH91PayloadSoftware/resource.h b/Src/CH91PayloadSoftware/resource.h index 70dc420..c33093b 100644 Binary files a/Src/CH91PayloadSoftware/resource.h and b/Src/CH91PayloadSoftware/resource.h differ diff --git a/Src/CH91PayloadSoftware/stdafx.h b/Src/CH91PayloadSoftware/stdafx.h index 4037b91..0f549b4 100644 --- a/Src/CH91PayloadSoftware/stdafx.h +++ b/Src/CH91PayloadSoftware/stdafx.h @@ -35,6 +35,7 @@ #endif // _AFX_NO_AFXCMN_SUPPORT #include // 功能区和控件条的 MFC 支持 +#include diff --git a/鐗堟湰璇存槑.txt b/鐗堟湰璇存槑.txt new file mode 100644 index 0000000..b00c468 --- /dev/null +++ b/鐗堟湰璇存槑.txt @@ -0,0 +1,3 @@ +202401221 +澧炲姞IMP瀵硅瘽妗 +澧炲姞IMP涓婁笅琛岄氫俊杩炴帴 \ No newline at end of file