锁存拼包功能初版
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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); //圆弧插补
|
||||
|
||||
@@ -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<DWORD>(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); //读出字符至abIn处
|
||||
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
};
|
||||
|
||||
|
||||
@@ -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 ")
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user