我不明白为什么当我用if在for循环中对两个unint8_t进行比较而不添加任何printf时,比较是不正确的。
这段代码正常,我没有任何错误:
for (uint16_t i = 0; i < BUFFER_SIZE; i++)
{
printf("Position Value: %d -> read %d, expected %d n", i, RxData[i], TxData[i]);
if (TxData[i] != RxData[i])
{
error++;
}
}
这个代码不工作,我有错误:
for (uint16_t i = 0; i < BUFFER_SIZE; i++)
{
if (TxData[i] != RxData[i])
{
error++;
}
}
工作→这两个向量具有相同的元素,因此它们的比较不会产生任何误差。不工作->这两个向量具有相同的元素,但它们的比较不成功,因此误差变量增加。
Error是一个变量,如果比较不成功则递增。
程序的行为通过输入或不输入printf来改变。
你知道这是为什么吗?我还试着用"continue"但是我也有同样的问题。
从对原始问题的评论来看,我认为这里发生了什么(没有OP的澄清,这是猜测)是这样的:
#define BUFFER_SIZE 256
// returns the actual number of bytes sent, stops and NUL terminator
int send_string(char const *buf, size_t bufsz);
// returns the actual number of bytes received
int receive_some_data(char *buf, size_t bufsz);
int test_interface_loopback()
{
char TxData[BUFFER_SIZE] = "Test Data";
char RxData[BUFFER_SIZE]; // left uninitialized
// return values are ignored -> PROBLEM!
send_some_data(TxData, BUFFER_SIZE);
receive_some_data(RxData, BUFFER_SIZE);
int error = 0;
for( uint16_t i = 0; i < BUFFER_SIZE; i++ )
{
if( TxData[i] != RxData[i] ){
error++;
}
}
return error;
}
这里的问题是,send_some_data
由于某种原因不会传输整个256字节,而只执行一个短写。这可能是,因为它假设一个以null结尾的C字符串;但也可能是由于其他原因,如系统缓冲区限制,或者可能字节刚刚排队等待发送,但没有从接口中刷新。
无论哪种方式,receive_some_data
实际上都不会读取256字节,而是更少。因此RxData
的剩余部分未初始化,因此比较调用未定义行为。
正确的解决方案在于考虑两个缓冲区中有效的实际数据量。