From 65cb1d380472f385779e2ebe7e687c325d6d1e91 Mon Sep 17 00:00:00 2001 From: "zhengxuan.zhang" Date: Mon, 28 Nov 2022 16:51:58 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=81=E5=AD=98=E6=8B=BC=E5=8C=85=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E5=88=9D=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HSI_HexagonMI_EF3/HSI_Motion.cpp | 133 ++++++++++-------- HSI_HexagonMI_EF3/HSI_Motion.h | 2 +- HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP | 83 +++++++++-- HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.H | 6 +- HSI_HexagonMI_EF3/version.h | 4 +- HSI_SEVENOCEAN_EF1_CsTest/Program.cs | 16 +-- 6 files changed, 163 insertions(+), 81 deletions(-) diff --git a/HSI_HexagonMI_EF3/HSI_Motion.cpp b/HSI_HexagonMI_EF3/HSI_Motion.cpp index 74ab4a3..11b9fbc 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.cpp +++ b/HSI_HexagonMI_EF3/HSI_Motion.cpp @@ -1135,7 +1135,6 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed) m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2); Sleep(5); - //清除锁存板Flash区 m_cSendData[0] = 0x01; m_cSendData[1] = 0x04; @@ -3766,33 +3765,34 @@ HSI_STATUS HSI_Motion::GetPositionXyzCache(unsigned char* CacheData, int DataCou unsigned char m_cSendData[8] = {0}; m_cSendData[0] = 0x01; m_cSendData[1] = 0x05; - m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2,8); + m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2, 8); //期望回复8个字节,其中 4-7字节为点数量 //解析缓存点数量 if (m_SO7_Serial.m_iRecvState) { //特殊帧头, 表示该内容为回复点数 - if ((m_SO7_Serial.m_RecvData[0] == 0x01) && (m_SO7_Serial.m_RecvData[1] == 0x1B)) + if ((m_SO7_Serial.m_RecvData[0] == 0x01) && (m_SO7_Serial.m_RecvData[1] == 0x1B) && (m_SO7_Serial. + m_iRecvBytes == 8)) { DataCount = (m_SO7_Serial.m_RecvData[4] << 24 | m_SO7_Serial.m_RecvData[5] << 16 | m_SO7_Serial. m_RecvData[6] << 8 | m_SO7_Serial.m_RecvData[7]); //详细 https://blog.csdn.net/hebbely/article/details/79577880 g_pLogger->SendAndFlushWithTime(L"[GetPositionXyzCache] DataCount:%d, %s\n", DataCount, - m_SO7_Serial.ToHexStr((const char*)m_SO7_Serial.m_RecvData, 8)); + m_SO7_Serial.HexToStr((const char*)m_SO7_Serial.m_RecvData, 8)); } - else + else //查询失败 { g_pLogger->SendAndFlushWithTime(L"[GetPositionXyzCache] DataCount:%d, %s\n", DataCount, - m_SO7_Serial.ToHexStr((const char*)m_SO7_Serial.m_RecvData, 8)); + m_SO7_Serial.HexToStr((const char*)m_SO7_Serial.m_RecvData, 8)); } } //读取锁存点 m_cSendData[0] = 0x01; m_cSendData[1] = 0x09; - m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2,DataCount); //此处应该返回 "ok" + m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2, DataCount*12); //读取点的字节数,每个点占用12个字节 @@ -6406,11 +6406,16 @@ HSI_STATUS HSI_Motion::DCCScanStart() iTriggleNum, iMotionDirection, begin_position[1]); //m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, m_SendDataLength); - //启动定时锁存的同时,启动扫描 外部IO - unsigned char m_cSendData[8] = {0}; + //启动定时扫描,此处清空旧缓存值 + unsigned char m_cSendData[8] = { 0 }; + m_cSendData[0] = 0x01; + m_cSendData[1] = 0x04; + m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2, 2); + + //启动定时锁存的同时启动扫描外部IO m_cSendData[0] = 0x01; m_cSendData[1] = 0x02; - m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2,2); + m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2, 2); g_pLogger->SendAndFlushWithTime(L"[DCCScanStart] Out\n"); @@ -6450,7 +6455,7 @@ HSI_STATUS HSI_Motion::DCCScanStop() unsigned char m_SendDCCData[64] = {0}; m_SendDCCData[0] = 0x01; m_SendDCCData[1] = 0x03; - m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, 2,2); + m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, 2, 2); g_pLogger->SendAndFlushWithTime(L"[DCCScanStop] Out\n"); } ReleaseMutex(g_WR_ToMove_Mutex); @@ -8906,7 +8911,7 @@ BOOL HSI_Motion::Send_Command(int com, const char* _SendData, DWORD SendDataLeng if (m_bConnected && (m_IsUseEF3 == 1) && (com == 0)) { g_pLogger->SendAndFlushWithTime(L"[Send_Command] lenth:%d, %s\n", SendDataLength, - m_SO7_Serial.ToHexStr(_SendData, SendDataLength)); + m_SO7_Serial.HexToStr(_SendData, SendDataLength)); int iWriteByte = m_SO7_Serial.Send(_SendData, SendDataLength); if (iWriteByte == 0) { @@ -8959,7 +8964,7 @@ BOOL HSI_Motion::Send_Command(int com, const char* _SendData, DWORD SendDataLeng //------------------------------调试区-----------------------------------// g_pLogger->SendAndFlushWithTime(L"[Send_Command] lenth:%d, expectType:%d, %s\n", SendDataLength, expectType, - m_SO7_Serial.ToHexStr(_SendData, SendDataLength)); + m_SO7_Serial.HexToStr(_SendData, SendDataLength)); int iWriteByte = m_SO7_Serial.Send(_SendData, SendDataLength); if (iWriteByte == 0) @@ -8992,60 +8997,72 @@ BOOL HSI_Motion::Send_Command(int com, const char* _SendData, DWORD SendDataLeng SendDataLength); } m_SO7_Serial.m_iRecvState = false; //发送完毕,接收状态置为false,并开始等待EF3回复 - + m_SO7_Serial.m_iExpectBytes = expectType; //判断回复值,是否为ok 6F 6B int iRetrys = 0; - bool iReSend = false; - while (!m_SO7_Serial.m_iRecvState && iRetrys < 100) //等待300毫秒 + while (!m_SO7_Serial.m_iRecvState && iRetrys < 1000) //等待 { iRetrys++; - Sleep(1); + Sleep(3); } - + g_pLogger->SendAndFlushWithTime(L"[Send_Command] iRetrys:%d\n", iRetrys); //发送完当前指令后,第一次结束完成标志 - if (m_SO7_Serial.m_iRecvState) + //if (m_SO7_Serial.m_iRecvBytes != expectType) //获取数量不等于期望数量,打印错误,并重发 + //{ + // g_pLogger->SendAndFlushWithTime(L"[Send_Command] EF3 Reply Error, RecvBytes:%d, %s\n", + // m_SO7_Serial.m_iRecvBytes, + // m_SO7_Serial.HexToStr((const char*)m_SO7_Serial.m_RecvData, + // m_SO7_Serial.m_iRecvBytes)); + // m_SO7_Serial.m_iRecvState = false; + // int iWriteByte = m_SO7_Serial.Send(_SendData, SendDataLength); //再次重发,并等待回应 + // while (!m_SO7_Serial.m_iRecvState && iRetrys < 100) //等待300毫秒 + // { + // iRetrys++; + // Sleep(3); + // } + // if (m_SO7_Serial.m_iRecvState) + // { + // if (iRetrys > 100) + // { + // iRetrys = 0; + // while (m_SO7_Serial.m_iRecvBytes != expectType) + // { + // iRetrys++; + // if (iRetrys > 100) + // break; + // Sleep(2); + // } + // } + + // if (iRetrys > 100) + // { + // rStatus = HSI_STATUS_FAILED; + // g_pLogger->SendAndFlushWithTime(L"[Send_Command] EF3 Reply Error!"); + // } + // else //获得期望结果 + // { + // rStatus = HSI_STATUS_NORMAL; + // g_pLogger->SendAndFlushWithTime(L"[Send_Command] EF3 Reply OK, RecvBytes:%d, %s\n", + // m_SO7_Serial.m_iRecvBytes, + // m_SO7_Serial.HexToStr((const char*)m_SO7_Serial.m_RecvData, + // m_SO7_Serial.m_iRecvBytes)); + // } + // } + //} + //else { - if (m_SO7_Serial.m_iRecvBytes != expectType) //获取数量不等于期望数量,打印错误,并重发 - { - iReSend = true; - g_pLogger->SendAndFlushWithTime(L"[Send_Command] EF3 Reply Error, RecvBytes:%d, %s\n", - m_SO7_Serial.m_iRecvBytes, - m_SO7_Serial.ToHexStr((const char*)m_SO7_Serial.m_RecvData, - m_SO7_Serial.m_iRecvBytes)); - - int iWriteByte = m_SO7_Serial.Send(_SendData, SendDataLength); //再次重发,并等待回应 - - if (iRetrys > 100) - { - iRetrys = 0; - while (m_SO7_Serial.m_iRecvBytes != expectType) - { - iRetrys++; - if (iRetrys > 100) - break; - Sleep(2); - } - } - - if (iRetrys > 100) - { - rStatus = FALSE; - } - else //获得期望结果 - { - rStatus = TRUE; - g_pLogger->SendAndFlushWithTime(L"[Send_Command] EF3 Reply OK, RecvBytes:%d, %s\n", - m_SO7_Serial.m_iRecvBytes, - m_SO7_Serial.ToHexStr((const char*)m_SO7_Serial.m_RecvData, - m_SO7_Serial.m_iRecvBytes)); - } - } + rStatus = FALSE; + g_pLogger->SendAndFlushWithTime(L"[Send_Command] EF3 Reply OK, RecvBytes:%d, %s\n", + m_SO7_Serial.m_iRecvBytes, + m_SO7_Serial.HexToStr((const char*)m_SO7_Serial.m_RecvData, + m_SO7_Serial.m_iRecvBytes)); } - - //打印串口返回值,该方式废弃 - //Sleep(5); - //m_SO7_Serial.OnReceive(); } + + //打印串口返回值,该方式废弃 + //Sleep(5); + //m_SO7_Serial.OnReceive(); + ReleaseMutex(g_RW_Data_Mutex); return rStatus; }; diff --git a/HSI_HexagonMI_EF3/HSI_Motion.h b/HSI_HexagonMI_EF3/HSI_Motion.h index 57d8fdc..0e608e5 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.h +++ b/HSI_HexagonMI_EF3/HSI_Motion.h @@ -257,7 +257,7 @@ public: HSI_STATUS SetPositionXyza(UINT AxisTypes, double PositionX, double PositionY, double PositionZ, double PositionA, HSI_MOTION_MOVE_TYPE eType, double dFlyRadius); HSI_STATUS SetPositionXyzCache(UINT AxisTypes, HSI_MOTION_MOVE_TYPE eType, int DataCount, Point* CacheData); - HSI_STATUS HSI_Motion::GetPositionXyzCache(unsigned char * CacheData, int DataCount); + HSI_STATUS GetPositionXyzCache(unsigned char * CacheData, int DataCount); HSI_STATUS GetPositionR(UINT AxisTypes, double& PositionR, double& Time); HSI_STATUS SetPositionR(UINT AxisTypes, double PositionR, HSI_MOTION_AXIS_R_MOVE_TYPE DirectionType, bool bWait); HSI_STATUS SetCircleInterpolate(double PositionX, double PositionY, double PositionZ); //圆弧插补 diff --git a/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP b/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP index 7ed6367..2995730 100644 --- a/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP +++ b/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP @@ -445,7 +445,7 @@ DWORD CPSerial::WritePort(const char* Buffer, DWORD Bytes) //========================================================================== - +//鍗曠函璇诲彇鍗曞寘涓插彛鏁版嵁锛屾嫾鍖呭姛鑳藉湪涓婂眰瀹炵幇 int CPSerial::ReadBlock(BYTE* abIn, int MaxLength) { BOOL JudgeRead; @@ -458,8 +458,8 @@ int CPSerial::ReadBlock(BYTE* abIn, int MaxLength) return 0; } dwLength = (static_cast(MaxLength) < ComStat.cbInQue ? MaxLength : ComStat.cbInQue); - memset(abIn, 0, MaxLength); - //濡傛灉鏈夊瓧绗﹀嵆璇诲叆 + //memset(abIn, 0, MaxLength); + //濡傛灉鏈夊瓧绗﹀嵆璇诲叆, 杩欑绛栫暐涓嬫棤娉曡В鍐宠鍏ョ殑瀛楃涓嶆槸瀹屾暣鐨勪竴甯х殑闂 Bug if (dwLength) { JudgeRead = ReadFile(m_PortHandle, abIn, dwLength, &dwLength, &m_ReceiveOLap); //璇诲嚭瀛楃鑷砤bIn澶 @@ -477,7 +477,6 @@ int CPSerial::ReadBlock(BYTE* abIn, int MaxLength) { dwLength = 0; } - } } return dwLength; @@ -487,6 +486,31 @@ int CPSerial::ReadBlock(BYTE* abIn, int MaxLength) // ReceiveTask() : Internal function, this runs as a thread and provides the // OnRecieve and OnTransmit events +/* +// C prototype : void HexToStr(char *pszDest, byte *pbSrc, int nLen) +// parameter(s): [OUT] pszDest - 瀛樻斁鐩爣瀛楃涓 +// [IN] pbSrc - 杈撳叆16杩涘埗鏁扮殑璧峰鍦板潃 +// [IN] nLen - 16杩涘埗鏁扮殑瀛楄妭鏁 +// return value: +// remarks : 灏16杩涘埗鏁拌浆鍖栦负瀛楃涓 +*/ +void CPSerial::hex2str(char* pszDest, byte* pbSrc, int nLen) +{ + char ddl, ddh; + for (int i = 0; i < nLen; i++) + { + ddh = 48 + pbSrc[i] / 16; + ddl = 48 + pbSrc[i] % 16; + if (ddh > 57) ddh = ddh + 7; + if (ddl > 57) ddl = ddl + 7; + pszDest[i * 2] = ddh; + pszDest[i * 2 + 1] = ddl; + } + + pszDest[nLen * 2] = '\0'; +} + +#if 1 void CPSerial::ReceiveTask(void) { //DWORD BytesWritten; @@ -498,13 +522,44 @@ void CPSerial::ReceiveTask(void) Sleep(2); BYTE abIn[MAXBLOCK]; int len; - len = ReadBlock(abIn, MAXBLOCK); + len = ReadBlock(abIn, MAXBLOCK); //鍗曞寘璇诲彇 if ((len > 0) && (len < MAX_RECIEVE_BUFFER_SIZE)) { //memset(m_RecvData, 0, m_iRecvBytes); - memcpy(m_RecvData, abIn, len); - m_iRecvBytes = len; - m_iRecvState = TRUE; + if (m_bDebug) + { + auto pszDest = new char[len * 2 + 1]; + hex2str(pszDest, abIn, len); + printf("len=%d, m_iExpectBytes=%d, %s\n", len, m_iExpectBytes, pszDest); + } + if (m_iExpectBytes != 0) //褰撴湁鏈熸湜鍊兼椂锛岃繘琛屾嫾鍖 + { + //寰幆鎷煎寘 + if (m_iRecvBytes < m_iExpectBytes) + { + while (m_iRecvBytes < m_iExpectBytes) + { + memcpy(m_RecvData + m_iRecvBytes, abIn, len); + m_iRecvBytes += len; + + auto pszDest = new char[m_iRecvBytes * 2 + 1]; + hex2str(pszDest, m_RecvData, m_iRecvBytes); + printf("11111=%d %s\n", m_iRecvBytes, pszDest); + } + } + else // 澶т簬绛変簬鏈熸湜杩斿洖鏁伴噺锛屾垚鍔 + { + memcpy(m_RecvData, abIn, len); + m_iRecvBytes = len; + m_iRecvState = TRUE; + } + } + else //鏃犳湡鏈涜繑鍥炴暟閲忔椂锛岄殢鏈鸿繑鍥炲崟鍖呮暟鎹 + { + memcpy(m_RecvData, abIn, len); + m_iRecvBytes = len; + m_iRecvState = TRUE; + } } // Events=0; // @@ -557,6 +612,9 @@ void CPSerial::ReceiveTask(void) } while (IsOpen()); } + + +#endif #if 0 void CPSerial::ReceiveTask(void) { @@ -1323,17 +1381,22 @@ int CPSerial::HexToInt(char* Data, int Bytes) Value <<= 4; HexChar = *Data++ -= '0'; if (HexChar > 32) + { HexChar -= 39; + } else if (HexChar > 9) + { HexChar -= 7; + } + Value += HexChar; } return (Value); } -//锟街斤拷锟斤拷锟斤拷转锟斤拷为16锟斤拷锟斤拷锟街凤拷 -CString CPSerial::ToHexStr(const char* pData, int nLen) +//瀛楄妭鏁版嵁杞崲涓16杩涘埗瀛楃涓 +CString CPSerial::HexToStr(const char* pData, int nLen) { CString str; CString strTemp; diff --git a/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.H b/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.H index 7ddd783..91808e5 100644 --- a/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.H +++ b/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.H @@ -127,9 +127,9 @@ public: //CSerialRaw *AttachWnd( CWnd *Wnd ); // Convert ascii hex into an int int HexToInt(char* Data, int Bytes); - + void hex2str(char* pszDest, byte* pbSrc, int nLen); //字节数据转换为16进制字符串 - CString ToHexStr(const char* pData, int nLen); + CString HexToStr(const char* pData, int nLen); DWORD Send(LPCSTR buffer, int l, BOOL needsResponse = FALSE) override; //virtual DWORD Send(CString what); @@ -193,6 +193,8 @@ public: BOOL m_iRecvState; //接收状态 INT m_iRecvBytes; //接收字节数 INT m_iRecvCount; //接收计数 + INT m_iExpectBytes =0; //定义期望接收的数据长度 + BOOL m_bDebug = true; //调试模式,默认关闭 unsigned char m_RecvData[MAX_RECIEVE_BUFFER_SIZE]; }; diff --git a/HSI_HexagonMI_EF3/version.h b/HSI_HexagonMI_EF3/version.h index 78f0898..dfec466 100644 --- a/HSI_HexagonMI_EF3/version.h +++ b/HSI_HexagonMI_EF3/version.h @@ -12,5 +12,5 @@ #define HSI_VERSION_REVNUM #define HSI_VERSION_BUILD_DATE _T(__DATE__ ) #define HSI_VERSION_BUILD_TIME _T(__TIME__ ) -#define HSI_FILE_DESCRIPTION "2022.11.28 / 14:06 " -#define HSI_FILE_CSDESCRIPTION _T("2022.11.28 / 14:06 ") +#define HSI_FILE_DESCRIPTION "2022.11.28 / 16:48 " +#define HSI_FILE_CSDESCRIPTION _T("2022.11.28 / 16:48 ") diff --git a/HSI_SEVENOCEAN_EF1_CsTest/Program.cs b/HSI_SEVENOCEAN_EF1_CsTest/Program.cs index 7721189..248621a 100644 --- a/HSI_SEVENOCEAN_EF1_CsTest/Program.cs +++ b/HSI_SEVENOCEAN_EF1_CsTest/Program.cs @@ -45,16 +45,16 @@ namespace HSI_SEVENOCEAN_EF1_CsTest Console.WriteLine("Motion.Startup:{0}", rStatus); //5 鑾峰彇EF3鍥轰欢鐗堟湰鍙,寰呮祴璇 - var EF3Version = new byte[20]; - //IntPtr intPtrEF3Version = IntPtr.Zero; - IntPtr intPtrEF3Version = Marshal.StringToHGlobalAnsi(""); - rStatus = Interface.MotionGetFirewareVerion(intPtrEF3Version); - Console.WriteLine("Interface.MotionGetFirewareVerion: {0}", rStatus); - Marshal.Copy(intPtrEF3Version, EF3Version, 0, EF3Version.Length); - Console.WriteLine("EF3 FirewareVerion Version: {0}", Encoding.UTF8.GetString(EF3Version)); + //var EF3Version = new byte[20]; + ////IntPtr intPtrEF3Version = IntPtr.Zero; + //IntPtr intPtrEF3Version = Marshal.StringToHGlobalAnsi(""); + //rStatus = Interface.MotionGetFirewareVerion(intPtrEF3Version); + //Console.WriteLine("Interface.MotionGetFirewareVerion: {0}", rStatus); + //Marshal.Copy(intPtrEF3Version, EF3Version, 0, EF3Version.Length); + //Console.WriteLine("EF3 FirewareVerion Version: {0}", Encoding.UTF8.GetString(EF3Version)); Motion.DCCScanStart(); - Thread.Sleep(5000); + Thread.Sleep(10000); Motion.DCCScanStop(); IntPtr dataCache = IntPtr.Zero;