是这样的,定义了一个时间,格式为BCD,7个字节。
长这样:
0x20 0x20 0x11 0x24 0x17 0x15 0x20
然后呢,国标上规则了一个东西,里面也有时间,格式为HEX。
长这样:
0x7E4 0xB 0x18 0x11 0xF 0x14
这时,就需要把前面的时间格式转换成后面的时间格式。
我这里想到了两种思路:
1.BCD -> SRTINGS --> DEC
相当于前面的时间就是十六进制,先把十六进制转成字符串,再转成十进制就可以了,单片机内存储的是十六进制,输出十进制就是国标上的格式了。
2.将每一位取出,再转成十六进制
我这里就把第一种贴出来
/* 十六进制转字符串 */
void HexToStr(uint8_t *pszDest, uint8_t *pbSrc, uint8_t nLen)
{
uint8_t ddl, ddh;
for (uint8_t 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';
}
/* 字符串转十进制 */
void StrtoDec(uint8_t *pbDest, uint8_t *pbSrc, uint8_t nLen)
{
uint8_t i;
uint8_t nTempDest[5],nTempData[2];
uint16_t nTemp;
for (i = 0; i < nLen/2-3; i++)
{
nTempDest[i] = (pbSrc[4+2*i] -'0') * 10 + (pbSrc[4+2*i+1] -'0');
// DBG_PRINTF("%d = %d *10 - %d\n",nTempDest[i],(pbSrc[4+2*i] -'0') * 10 ,(pbSrc[4+2*i+1] -'0'));
}
nTemp = (pbSrc[0] -'0') * 1000 + (pbSrc[1] -'0') * 100 + (pbSrc[2] -'0') * 10 + (pbSrc[3] -'0');
memcpy(nTempData,(uint8_t *)&nTemp,2);
pbDest[0] = nTempData[1];
pbDest[1] = nTempData[0];
memcpy(pbDest+2,nTempDest,nLen/2-3);
}