锁存拼包功能初版

This commit is contained in:
zhengxuan.zhang
2022-11-28 16:51:58 +08:00
parent 39e26fadba
commit 65cb1d3804
6 changed files with 163 additions and 81 deletions
+73 -10
View File
@@ -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;
+4 -2
View File
@@ -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];
};