我一直在寻找这个问题的答案,但无法弄明白。
我有一个结构:
typedef struct {
BYTE hour;
BYTE minute;
BYTE second;
BYTE dom;
BYTE month;
BYTE year;
} t_time_date ;
串口接收功能:
g_curr_td.year = g_rx_buffer[3];
g_curr_td.month = g_rx_buffer[4];
g_curr_td.dom = g_rx_buffer[5];
g_curr_td.hour = g_rx_buffer[6];
g_curr_td.minute = g_rx_buffer[7];
g_curr_td.second = g_rx_buffer[8];
我已验证g_rx_buffer
是否正确且包含数据。如果我硬编码一个数字到变量它的工作原理:
g_curr_td.year = 10; /* this works */
但是,运行实时数据会崩溃并且似乎在内存中的其他位置写入数据。任何人都可以在我的设置中看到错误吗?
感谢。
答案 0 :(得分:1)
g_rx_buffer是否至少有9个BYTE数据?
答案 1 :(得分:1)
虽然我可能不会直接回答您的问题,但这可能有助于您获得更清晰的代码:
有传入数据格式的结构:
typedef struct {
BYTE year;
BYTE month;
BYTE dom;
BYTE hour;
BYTE minute;
BYTE second;
} t_time_input_date __attribute__((packed));
// First you can make sure the data is received in its whole
assert(g_rx_length >= sizeof(t_time_input_date) + 3);
t_time_input_date *in_date = (t_time_input_date *)(g_rx_buffer+3);
g_curr_td.year = in_date->year;
g_curr_td.month = in_date->month;
g_curr_td.dom = in_date->dom;
g_curr_td.hour = in_date->hour;
g_curr_td.minute = in_date->minute;
g_curr_td.second = in_date->second;
这样你的代码就会更干净,并且会在3个月内帮助你。
答案 2 :(得分:1)
出于调试目的,您可以尝试创建一个为所有结构成员提取参数的函数,例如:
/* Assumes g_curr_td is a global variable. */
void FillStruct( BYTE hour, BYTE minute, BYTE second, BYTE dom, BYTE month, BYTE year )
{
g_curr_td.year = year;
g_curr_td.month = month;
g_curr_td.dom = dom;
g_curr_td.hour = hour;
g_curr_td.minute = minute;
g_curr_td.second = second;
}
使用这样的函数应该使汇编代码相同,无论您是使用缓冲区中的值还是常量表达式。如果它仍然崩溃,它可能与你的缓冲区有关,即使你似乎已经检查了我能想到处理缓冲区的所有角度。
您可以将此函数称为FillStruct( g_rx_buffer[3], g_rx_buffer[4], g_rx_buffer[5], g_rx_buffer[6], g_rx_buffer[7], g_rx_buffer[8] )
,如果崩溃,请将其称为FillStruct( a, b, c, d, e, f )
,其中a,b,c,d,e和f是原始参数或新常量参数。尝试一次更换一个参数,看看它是否只是一个失败的特定字段,或者是否是任何失败的字段。
编辑:此外,typedef
类型的#define
或BYTE
究竟是什么,您使用的编译器和操作系统是什么,并且您使用的是任何编译指示,例如将结构打包为字节对齐?
答案 3 :(得分:0)
您是否有任何系统可以通过串口获取数据?你怎么保证g_rx_buffer [3]真的是g_curr_td.year?
答案 4 :(得分:0)
我在这里看到的唯一错误来源是g_rx_buffer上的访问权限。 g_rx_buffer中的数组是否足够大?
也许你可以循环遍历g_rx_buffer并向我们展示这个数组的内容。
答案 5 :(得分:0)
什么是g_rx_buffer?如果它不是BYTE数组而不是指向BYTE的指针,则g_rx_buffer[3]
与((BYTE*)g_rx_buffer)[3]
不同。