From 39e26fadbad864491f806b2afeba96d6eb9e9c53 Mon Sep 17 00:00:00 2001 From: "zhengxuan.zhang" Date: Mon, 28 Nov 2022 14:09:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E5=AF=B9=E4=B8=B2=E5=8F=A3?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC=E6=83=85=E5=86=B5=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E6=80=9D=E8=B7=AF=EF=BC=8C=E5=BC=95?= =?UTF-8?q?=E5=85=A5=E6=9C=9F=E6=9C=9B=E8=BF=94=E5=9B=9E=E5=AD=97=E8=8A=82?= =?UTF-8?q?=EF=BC=8C=E5=BD=93=E4=B8=8D=E6=98=AF=EF=BC=8C=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E9=87=8D=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HSI_HexagonMI_EF3/HSI.h | 5 +- HSI_HexagonMI_EF3/HSI_Motion.cpp | 223 ++++++++++++------ HSI_HexagonMI_EF3/HSI_Motion.h | 1 + HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP | 3 + HSI_HexagonMI_EF3/version.h | 4 +- HSI_SEVENOCEAN_EF1_CsTest/Program.cs | 24 +- 6 files changed, 179 insertions(+), 81 deletions(-) diff --git a/HSI_HexagonMI_EF3/HSI.h b/HSI_HexagonMI_EF3/HSI.h index 7a43adb..644bac0 100644 --- a/HSI_HexagonMI_EF3/HSI.h +++ b/HSI_HexagonMI_EF3/HSI.h @@ -79,8 +79,7 @@ enum HSI_STATUS HSI_STATUS_VP_TIMEOUT = 350, HSI_STATUS_VP_IMAGEPROCESS_FAIL, - HSI_ACS_OK=400, - // ACS命令成功 + HSI_ACS_OK=400,// ACS命令成功 HSI_ACS_ERROR }; @@ -412,7 +411,6 @@ enum HSI_SCAN_MOTION_TYPE HSI_SCAN_MOTION_MANUAL_TEST //测试使用 }; - enum HSI_ZOOM_TYPE { HSI_ZOOM_MANUAL = 0, @@ -475,7 +473,6 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_POSITIONPROBE(UINT AxisTypes, double& P HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ENCODER_XYZ(long* lEncVal); HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_XYZ_CACHE(UINT AxisTypes, HSI_MOTION_MOVE_TYPE eType, int DataCount, Point* CacheData); - HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_POSITION_R(UINT AxisTypes, double& PositionR, double& Time); HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_R(UINT AxisTypes, double PositionR, HSI_MOTION_AXIS_R_MOVE_TYPE DirectionType, bool bWait); diff --git a/HSI_HexagonMI_EF3/HSI_Motion.cpp b/HSI_HexagonMI_EF3/HSI_Motion.cpp index dff0192..74ab4a3 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.cpp +++ b/HSI_HexagonMI_EF3/HSI_Motion.cpp @@ -776,12 +776,6 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) //锁存模式设置,定时模式 //if (m_IsUseRocker == 1) { - //软件清空 - //m_cSendData[0] = 0x01; - //m_cSendData[1] = 0x06; - //m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2); - //Sleep(10); - //设置锁存频率 1秒钟() m_cSendData[0] = 0x01; m_cSendData[1] = 0x01; @@ -789,10 +783,10 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) //m_cSendData[3] = 0x03; // 10000 (0x27 0x10)对应1秒,3-4字节表示锁存周期 //m_cSendData[4] = 0xE8; - // 10000 (0x27 0x10)对应1秒,3-4字节表示锁存周期 - m_cSendData[3] = (m_axisLatchFrequency >> 8) & 0xFF; - m_cSendData[4] = m_axisLatchFrequency & 0xFF; - m_WriteByte = Send_Command(0, (const char*)m_cSendData, 5); + // 10000 (0x27 0x10)对应1秒,3-4字节表示锁存周期 + m_cSendData[3] = (m_axisLatchFrequency >> 8) & 0xFF; + m_cSendData[4] = m_axisLatchFrequency & 0xFF; + m_WriteByte = Send_Command(0, (const char*)m_cSendData, 5, 2); Sleep(10); g_pLogger->SendAndFlushWithTime(L"[Startup] Set EF3 Timing latch Success\n"); @@ -824,16 +818,16 @@ HSI_STATUS HSI_Motion::GetFirmwareVersion(byte* version) senddata[0] = 0x01; senddata[1] = 0x08; m_SO7_Serial.m_RecvData[0] = 0; - m_WriteByte = Send_Command(0, (const char*)senddata, sizeof(senddata)); - Sleep(30); - m_SO7_Serial.m_RecvData[0] = 0; - m_WriteByte = Send_Command(0, (const char*)senddata, sizeof(senddata)); - Sleep(30); - m_SO7_Serial.m_RecvData[0] = 0; - m_WriteByte = Send_Command(0, (const char*)senddata, sizeof(senddata)); + m_WriteByte = Send_Command(0, (const char*)senddata, 2, 20); Sleep(30); + //m_SO7_Serial.m_RecvData[0] = 0; + //m_WriteByte = Send_Command(0, (const char*)senddata, sizeof(senddata)); + //Sleep(30); + //m_SO7_Serial.m_RecvData[0] = 0; + //m_WriteByte = Send_Command(0, (const char*)senddata, sizeof(senddata)); + //Sleep(30); - while ((m_SO7_Serial.m_RecvData[0] != 3) && (m_SO7_Serial.m_RecvData[0] != 2)) + while ((m_SO7_Serial.m_RecvData[0] != 0x32) && (m_SO7_Serial.m_RecvData[1] != 0x30)) { waite_count++; if (waite_count > 100) @@ -843,8 +837,8 @@ HSI_STATUS HSI_Motion::GetFirmwareVersion(byte* version) if (waite_count > 100) { waite_count = 0; - m_WriteByte = Send_Command(0, (const char*)senddata, sizeof(senddata)); - while ((m_SO7_Serial.m_RecvData[0] != 3) && (m_SO7_Serial.m_RecvData[0] != 2)) + m_WriteByte = Send_Command(0, (const char*)senddata, 2, 20); //再次重发,并等待回应 + while ((m_SO7_Serial.m_RecvData[0] != 0x32) && (m_SO7_Serial.m_RecvData[1] != 0x30)) { waite_count++; if (waite_count > 100) @@ -870,7 +864,7 @@ HSI_STATUS HSI_Motion::GetFirmwareVersion(byte* version) } } - g_pLogger->SendAndFlushWithTime(L"[GetFirmwareVersion] EF3 Firmware Version %s\n", version); + g_pLogger->SendAndFlushWithTime(L"[GetFirmwareVersion] EF3 Firmware Version %S\n", version); m_Thread_StateData = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEventData); //触发事件,其中hEvent表示句柄,返回值:如果操作成功,则返回非零值,否则为0。 return HSI_STATUS_NORMAL; @@ -967,10 +961,14 @@ HSI_STATUS HSI_Motion::HomeMachineOld(bool bHomed) int SavePos[5] = {0}; if (m_SO7_Serial.m_RecvData[0] == 2) { - SavePos[1] = (m_SO7_Serial.m_RecvData[41] << 24 | m_SO7_Serial.m_RecvData[42] << 16 | m_SO7_Serial.m_RecvData[43] << 8 | m_SO7_Serial.m_RecvData[44]); - SavePos[2] = (m_SO7_Serial.m_RecvData[45] << 24 | m_SO7_Serial.m_RecvData[46] << 16 | m_SO7_Serial.m_RecvData[47] << 8 | m_SO7_Serial.m_RecvData[48]); - SavePos[3] = (m_SO7_Serial.m_RecvData[49] << 24 | m_SO7_Serial.m_RecvData[50] << 16 | m_SO7_Serial.m_RecvData[51] << 8 | m_SO7_Serial.m_RecvData[52]); - SavePos[4] = (m_SO7_Serial.m_RecvData[53] << 24 | m_SO7_Serial.m_RecvData[54] << 16 | m_SO7_Serial.m_RecvData[55] << 8 | m_SO7_Serial.m_RecvData[56]); + SavePos[1] = (m_SO7_Serial.m_RecvData[41] << 24 | m_SO7_Serial.m_RecvData[42] << 16 | m_SO7_Serial. + m_RecvData[43] << 8 | m_SO7_Serial.m_RecvData[44]); + SavePos[2] = (m_SO7_Serial.m_RecvData[45] << 24 | m_SO7_Serial.m_RecvData[46] << 16 | m_SO7_Serial. + m_RecvData[47] << 8 | m_SO7_Serial.m_RecvData[48]); + SavePos[3] = (m_SO7_Serial.m_RecvData[49] << 24 | m_SO7_Serial.m_RecvData[50] << 16 | m_SO7_Serial. + m_RecvData[51] << 8 | m_SO7_Serial.m_RecvData[52]); + SavePos[4] = (m_SO7_Serial.m_RecvData[53] << 24 | m_SO7_Serial.m_RecvData[54] << 16 | m_SO7_Serial. + m_RecvData[55] << 8 | m_SO7_Serial.m_RecvData[56]); } double PrinfPos[5] = {0}; PrinfPos[1] = SavePos[1] * m_Resolution[1]; @@ -1131,7 +1129,7 @@ HSI_STATUS HSI_Motion::HomeMachine(bool bHomed) //回家后,将锁存板的位置设置为0 - unsigned char m_cSendData[8] = { 0 }; + unsigned char m_cSendData[8] = {0}; m_cSendData[0] = 0x01; m_cSendData[1] = 0x06; m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2); @@ -2057,7 +2055,7 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) //速度限制 g_pLogger->SendAndFlushWithTime( L"[Jog] DriveSpeed: [%d], AccCurve: [%d], AccLine: [%d], DecCurve: [%d], DecLine: [%d]\n", - DriveSpeed, AccCurve, AccLine, DecCurve, DecLine); + DriveSpeed, AccCurve, AccLine, DecCurve, DecLine); // 急停判断 if ((StartSpeed < 250) && (DriveSpeed < 6)) @@ -2084,18 +2082,19 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) //int acsDirection = bJOGDir ? ACSC_POSITIVE_DIRECTION : ACSC_NEGATIVE_DIRECTION; //正方向,或 负方向 //设置加速度 - if(!acsc_SetAccelerationImm(handleACS, jogAxisNum, AccLine, nullptr)) + if (!acsc_SetAccelerationImm(handleACS, jogAxisNum, AccLine, nullptr)) { - g_pLogger->SendAndFlushWithTime(L"[Jog] ACS SetAccelerationImm failed, Aixs:[%d] AccCurve:[%d]\n", jogAxisNum, - AccLine); + g_pLogger->SendAndFlushWithTime(L"[Jog] ACS SetAccelerationImm failed, Aixs:[%d] AccCurve:[%d]\n", + jogAxisNum, + AccLine); ErrorsHandler(); } //设置减速度 - if(!acsc_SetDeceleration(handleACS, jogAxisNum, AccLine, nullptr)) + if (!acsc_SetDeceleration(handleACS, jogAxisNum, AccLine, nullptr)) { g_pLogger->SendAndFlushWithTime(L"[Jog] ACS SetDeceleration failed, Aixs:[%d] DecCurve:[%d]\n", jogAxisNum, - AccLine); + AccLine); ErrorsHandler(); } @@ -2109,7 +2108,8 @@ HSI_STATUS HSI_Motion::Jog(UINT AxisTypes, double Speed) jogMoving = true; - g_pLogger->SendAndFlushWithTime(L"[Jog] Out, DriveSpeed = %d AccCurve:[%d] DecCurve:[%d]\n", DriveSpeed, AccLine, AccLine); + g_pLogger->SendAndFlushWithTime(L"[Jog] Out, DriveSpeed = %d AccCurve:[%d] DecCurve:[%d]\n", DriveSpeed, + AccLine, AccLine); } return rStatus; } @@ -3753,45 +3753,53 @@ HSI_STATUS HSI_Motion::SetPositionXyzCache(UINT AxisTypes, HSI_MOTION_MOVE_TYPE * \param DataCount * \return */ -HSI_STATUS HSI_Motion::GetPositionXyzCache(unsigned char * CacheData, int DataCount) +HSI_STATUS HSI_Motion::GetPositionXyzCache(unsigned char* CacheData, int DataCount) { auto rStatus = HSI_STATUS_NORMAL; if (g_pHSI_Motion) { g_pLogger->SendAndFlushWithTime(L"[GetPositionXyzCache] start\n"); - if(m_SO7_Serial.IsOpen()) + if (m_SO7_Serial.IsOpen()) { //发送获取点数量命令 0x01 0x05 - unsigned char m_cSendData[8] = { 0 }; + unsigned char m_cSendData[8] = {0}; m_cSendData[0] = 0x01; m_cSendData[1] = 0x05; - m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2); - Sleep(2); + m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2,8); + //解析缓存点数量 - if(m_SO7_Serial.m_iRecvState) + if (m_SO7_Serial.m_iRecvState) { //特殊帧头, 表示该内容为回复点数 - if ((m_SO7_Serial.m_RecvData[0] == 0x01) && (m_SO7_Serial.m_RecvData[0] == 0x1B)) + if ((m_SO7_Serial.m_RecvData[0] == 0x01) && (m_SO7_Serial.m_RecvData[1] == 0x1B)) { - 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]); + 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)); + g_pLogger->SendAndFlushWithTime(L"[GetPositionXyzCache] DataCount:%d, %s\n", DataCount, + m_SO7_Serial.ToHexStr((const char*)m_SO7_Serial.m_RecvData, 8)); + } + else + { + g_pLogger->SendAndFlushWithTime(L"[GetPositionXyzCache] DataCount:%d, %s\n", DataCount, + m_SO7_Serial.ToHexStr((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); //此处应该返回 "ok" - Sleep(2); + m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2,DataCount); //此处应该返回 "ok" + //读取点的字节数,每个点占用12个字节 - if (m_SO7_Serial.m_iRecvBytes != DataCount*12) + if (m_SO7_Serial.m_iRecvBytes != DataCount * 12) { - g_pLogger->SendAndFlushWithTime(L"[GetPositionXyzCache] m_iRecvBytes: %d != Points: %d\n", m_SO7_Serial.m_iRecvBytes, DataCount * 12); + g_pLogger->SendAndFlushWithTime(L"[GetPositionXyzCache] m_iRecvBytes: %d != Points: %d\n", + m_SO7_Serial.m_iRecvBytes, DataCount * 12); rStatus = HSI_STATUS_FAILED; } else @@ -3800,7 +3808,6 @@ HSI_STATUS HSI_Motion::GetPositionXyzCache(unsigned char * CacheData, int DataCo m_SO7_Serial.m_iRecvState = FALSE; rStatus = HSI_STATUS_FAILED; } - } else { @@ -6265,7 +6272,7 @@ HSI_STATUS HSI_Motion::DCCScanSetData(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType } //启动定时锁存的同时,启动扫描 外部IO - unsigned char m_cSendData[8] = { 0 }; + unsigned char m_cSendData[8] = {0}; //清空EF3缓存Flash m_cSendData[0] = 0x01; @@ -6403,8 +6410,8 @@ HSI_STATUS HSI_Motion::DCCScanStart() unsigned char m_cSendData[8] = {0}; m_cSendData[0] = 0x01; m_cSendData[1] = 0x02; - m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2); - Sleep(2); + m_WriteByte = Send_Command(0, (const char*)m_cSendData, 2,2); + g_pLogger->SendAndFlushWithTime(L"[DCCScanStart] Out\n"); m_IsUsePPS = false; @@ -6443,7 +6450,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); + m_WriteByte = Send_Command(0, (const char*)m_SendDCCData, 2,2); g_pLogger->SendAndFlushWithTime(L"[DCCScanStop] Out\n"); } ReleaseMutex(g_WR_ToMove_Mutex); @@ -8884,24 +8891,75 @@ HSI_STATUS HSI_Motion::FindOriginTest(bool type) } //=========================================================================== +/** + * \brief 串口发送命令 + * \param com + * \param _SendData 发送内容指针 + * \param SendDataLength 发送字节长度 + * \param expectType 期待返回长度,2:返回ok,8:返回8个字节,N:返回N字节,如果本次返回内容不是期待字节,等待或重发该命令。 + * \return + */ BOOL HSI_Motion::Send_Command(int com, const char* _SendData, DWORD SendDataLength) { BOOL rStatus = TRUE; WaitForSingleObject(g_RW_Data_Mutex, INFINITE); 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)); + int iWriteByte = m_SO7_Serial.Send(_SendData, SendDataLength); + if (iWriteByte == 0) + { + int iError = GetLastError(); + g_pLogger->SendAndFlushWithTime(L"[Send_Command] GetLastError = %d\n", iError); + if (iError == 1167) + { + g_pLogger->SendAndFlushWithTime(L"[Send_Command] GetLastError is 1167,EF3 device is no connect\n"); + m_Thread_StateData = THREAD_PAUSED; + if (m_bConnected == true && g_IsClose == false) + { + g_pLogger->SendAndFlushWithTime(L"[Send_Command] GetLastError is 1167,EF3 device is no connect\n"); + sEvenProp.Init(); + sEvenProp.EventType = HSI_EVENT_ERROR; + sEvenProp.EventID = HSI_EVENT_MOTION; + sEvenProp.EventResponse = HSI_EVENT_RESPONSE_OK; + strcpy_s(sEvenProp.EventData, HSI_MaxStringLength, "EF3控制器已断开连接"); + EventCallback(sEvenProp); + } + } + g_pLogger->SendAndFlushWithTime(L"[Send_Command] m_SO7_Serial[%d].Send failed\n", com); + rStatus = FALSE; + } + // Sleep(5); + // m_SO7_Serial.OnReceive(); + } + ReleaseMutex(g_RW_Data_Mutex); + return rStatus; +}; + +BOOL HSI_Motion::Send_Command(int com, const char* _SendData, DWORD SendDataLength, int expectType) +{ + BOOL rStatus = TRUE; + WaitForSingleObject(g_RW_Data_Mutex, INFINITE); + + //指令回复分两种情况: + //1、正常2字节,回复 OK,(0x6F 0x6B ) + //2、返回多字节 + + if (m_bConnected && (m_IsUseEF3 == 1) /*&& (com == 0)*/) { //------------------------------调试区-----------------------------------// //原文链接:https://blog.csdn.net/qq_31073871/article/details/85696092 - /*printf("Send_Command: "); - for (int i = 0; i < SendDataLength; i++) - { - printf("%02X ", ((uint8_t*)_SendData)[i]); - } - printf("\r\n");*/ - + //printf("Send_Command: "); + //for (int i = 0; i < SendDataLength; i++) + //{ + // printf("%02X ", ((uint8_t*)_SendData)[i]); + //} + //printf("\r\n"); //------------------------------调试区-----------------------------------// - g_pLogger->SendAndFlushWithTime(L"[Send_Command] lenth:%d, %s\n", SendDataLength,m_SO7_Serial.ToHexStr(_SendData, SendDataLength)); + g_pLogger->SendAndFlushWithTime(L"[Send_Command] lenth:%d, expectType:%d, %s\n", SendDataLength, expectType, + m_SO7_Serial.ToHexStr(_SendData, SendDataLength)); int iWriteByte = m_SO7_Serial.Send(_SendData, SendDataLength); if (iWriteByte == 0) @@ -8927,27 +8985,60 @@ BOOL HSI_Motion::Send_Command(int com, const char* _SendData, DWORD SendDataLeng rStatus = FALSE; } - if (iWriteByte != SendDataLength)// 写入字节数不等于发送字节数 + if (iWriteByte != SendDataLength) // 写入字节数不等于发送字节数 { rStatus = FALSE; - g_pLogger->SendAndFlushWithTime(L"[Send_Command] WriteByte:%d,!= SendDataLength:%d\n", iWriteByte, SendDataLength); + g_pLogger->SendAndFlushWithTime(L"[Send_Command] WriteByte:%d,!= SendDataLength:%d\n", iWriteByte, + SendDataLength); } + m_SO7_Serial.m_iRecvState = false; //发送完毕,接收状态置为false,并开始等待EF3回复 //判断回复值,是否为ok 6F 6B int iRetrys = 0; - while (!m_SO7_Serial.m_iRecvState && iRetrys < 20) + bool iReSend = false; + while (!m_SO7_Serial.m_iRecvState && iRetrys < 100) //等待300毫秒 { iRetrys++; - Sleep(100); + Sleep(1); } //发送完当前指令后,第一次结束完成标志 if (m_SO7_Serial.m_iRecvState) { - if ((m_SO7_Serial.m_RecvData[0] == 0x6F) && (m_SO7_Serial.m_RecvData[0] == 0x6B)) + if (m_SO7_Serial.m_iRecvBytes != expectType) //获取数量不等于期望数量,打印错误,并重发 { - g_pLogger->SendAndFlushWithTime(L"[Send_Command] m_SO7_Serial[%d]. EF3 Reply not ok.\n", com); - rStatus = FALSE; + 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)); + } } } diff --git a/HSI_HexagonMI_EF3/HSI_Motion.h b/HSI_HexagonMI_EF3/HSI_Motion.h index 0af7224..57d8fdc 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.h +++ b/HSI_HexagonMI_EF3/HSI_Motion.h @@ -556,6 +556,7 @@ public: CPSerial m_SO7_Serial; DWORD m_WriteByte; BOOL Send_Command(int com, const char* _SendData, DWORD _SendDataLength); + BOOL Send_Command(int com, const char* _SendData, DWORD SendDataLength, int expectType);// 带期望返回值的发送命令 BOOL Receive_Data(); bool PortInit(int iSerialComPort, int iBuadRate); char m_RecvData[MAX_RECIEVE_BUFFER_SIZE]; diff --git a/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP b/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP index b19e75d..7ed6367 100644 --- a/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP +++ b/HSI_HexagonMI_EF3/SevenOcean/CMMIO_SERIAL.CPP @@ -474,7 +474,10 @@ int CPSerial::ReadBlock(BYTE* abIn, int MaxLength) // m_osRead.Offset=(m_osRead.Offset+dwLength)%MAXBLOCK; } else + { dwLength = 0; + } + } } return dwLength; diff --git a/HSI_HexagonMI_EF3/version.h b/HSI_HexagonMI_EF3/version.h index 2ba3a92..78f0898 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.25 / 17:25 " -#define HSI_FILE_CSDESCRIPTION _T("2022.11.25 / 17:25 ") +#define HSI_FILE_DESCRIPTION "2022.11.28 / 14:06 " +#define HSI_FILE_CSDESCRIPTION _T("2022.11.28 / 14:06 ") diff --git a/HSI_SEVENOCEAN_EF1_CsTest/Program.cs b/HSI_SEVENOCEAN_EF1_CsTest/Program.cs index 81102ea..7721189 100644 --- a/HSI_SEVENOCEAN_EF1_CsTest/Program.cs +++ b/HSI_SEVENOCEAN_EF1_CsTest/Program.cs @@ -1,6 +1,7 @@ 锘縰sing System; using System.Runtime.InteropServices; using System.Text; +using System.Threading; using HSI_SEVENOCEAN_EF1_CsTest.HSI; namespace HSI_SEVENOCEAN_EF1_CsTest @@ -36,27 +37,32 @@ namespace HSI_SEVENOCEAN_EF1_CsTest rStatus = Interface.SetEventCallback(Interface.HsiCallback); Console.WriteLine("SetEventCallback:{0}", rStatus); //浜嬩欢鍥炶皟鎴愬姛 + + //if (Motion.IsActive(true)) { rStatus = Motion.Startup(true); //杩愬姩鍒濆鍖栵紝鍥炲鍒ゆ柇 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)); + Motion.DCCScanStart(); + Thread.Sleep(5000); + + Motion.DCCScanStop(); IntPtr dataCache = IntPtr.Zero; int pointCount = 0; Motion.GetPositionXyzCache(dataCache, pointCount); Console.WriteLine("pointCount = " + pointCount); - //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)); - //6 鏄惁鍥炲 //var bHomed = true; //rStatus = Motion.IsHomed(ref bHomed);