开发中通长会遇到两边通信解析数据失败的情况,这时候我们可以打印两边的码流来看看打印的字节序等数据,看看发的和收的是不是一致的,解析的位置如有偏差,就可以调整头部偏移来进行解析了。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define BUFFERSIZE 68
#define PAGELINES 20
typedef char cyg_uint8 ;
typedef unsigned int CYG_ADDRWORD;
typedef int __printf_fun(const char *fmt, ...);
void diag_vdump_buf_with_offset(__printf_fun *pf,
cyg_uint8 *p,
CYG_ADDRWORD s,
cyg_uint8 *base)
{
int i, c;
if ((CYG_ADDRWORD)s > (CYG_ADDRWORD)atoi(p)) {
s = (CYG_ADDRWORD)s - (CYG_ADDRWORD)atoi(p);
}
while ((int)s > 0) {
if (base) {
(*pf)("%08X: ", (CYG_ADDRWORD)atoi(p) - (CYG_ADDRWORD)atoi(base));
} else {
(*pf)("%08X: ", p);
}
for (i = 0; i < 16; i++) {
if (i < (int)s) {
(*pf)("%02X ", p[i] & 0xFF);
} else {
(*pf)(" ");
}
if (i == 7) (*pf)(" ");
}
(*pf)(" |");
for (i = 0; i < 16; i++) {
if (i < (int)s) {
c = p[i] & 0xFF;
if ((c < 0x20) || (c >= 0x7F)) c = '.';
} else {
c = ' ';
}
(*pf)("%c", c);
}
(*pf)("|\n");
s -= 16;
p += 16;
}
}
void
diag_dump_buf_with_offset(cyg_uint8 *p,
CYG_ADDRWORD s,
cyg_uint8 *base)
{
diag_vdump_buf_with_offset(printf, p, s, base);
}
void
diag_dump_buf(void *p, CYG_ADDRWORD s)
{
diag_dump_buf_with_offset((cyg_uint8 *)p, s, 0);
}
int print16(void *buf, int addrword)
{
diag_dump_buf(buf, addrword);
return 0;
}
比如调用print16(buf,1024);来打印收到的msg;就可以得到下面的码流。