@@ -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 ) ) ;
}
}
}