我的缓冲区大小是50,但我想加载我的缓冲区只有12个长度字符
并且我必须加载具有不同字符长度的缓冲区,但我不能
再次加载缓冲区,它显示以前的数据与一些垃圾值。我试图
通过使用硬编码值删除垃圾值,并再次重新初始化缓冲区为零值,但我仍然遇到同样的问题。
此代码用于接收C
中的数据{
if(PortRecvs(0,buff,sizeof(buff),1000)<0)
{
clrscr();
printf("Receive Fail..");
DelayMs(1000);
}
clrscr();
printf("Receive Buff:\n%s",buff);
DelayMs(1000);
if(PortRecvs(0,buff,12,1000)<0)
{
clrscr();
printf("Receive Fail..");
DelayMs(1000);
}
clrscr();
printf("Receive Buff:\n%s",buff);
DelayMs(1000);
}
答案 0 :(得分:1)
有太多的clrscr()
调用来进行良好的调试。 DelayMs()
电话也会让我感到疯狂(虽然有些人会认为这对我来说是一种不必要的锻炼)。
您的PortRecvs()
函数返回读取的字节数是合理的推理;但是,您不能确保printf()
仅打印读取的字节数。您的代码可能看起来更像:
{
int nbytes;
if ((nbytes = PortRecvs(0, buff, sizeof(buff), 1000)) < 0)
{
printf("Receive Fail.\n");
DelayMs(1000);
}
else
printf("Receive Buff: [[%.*s]]\n", nbytes, buff); // Do not print if receive failed
DelayMs(1000);
if ((nbytes = PortRecvs(0, buff, 12, 1000)) < 0)
{
printf("Receive Fail.\n");
DelayMs(1000);
}
else
printf("Receive Buff: [[%.*s]]\n", nbytes, buff);
DelayMs(1000);
}
请注意,如果接收失败,此代码不会打印缓冲区。它确保每条消息以换行符结尾。它使用标记[[
和]]
包围数据(如果您不喜欢,请选择自己的数据 - 我经常使用<<
和>>
)以便您可以看到更容易拖尾空白或嵌入换行符。最重要的是,它使用%.*s
转换规范来打印从PortRecvs()
收到的字节数。
请注意,像PortRecvs()
这样的函数通常使用二进制数据,并且不会为接收的值添加空终止符。您有责任确保在没有正确终止的情况下处理数据。