【问题标题】:Why Does Serial.println(<char[]>); Return Random Characters?为什么 Serial.println(<char[]>);返回随机字符?
【发布时间】:2020-06-09 20:14:42
【问题描述】:

我正在绞尽脑汁试图解决这个问题。 对于初学者: *我的波特率两端都是9600。 *我有一个大小为 8 的数组,所以最大索引是 7 *我根据时间将数组中的每个字符(位置 0、1、3、4、6、7)设置为数字 0-9 *如果我打印时间,它会完美显示,除非数字高于 18:00:00 *MSin1Hr、MSin24Hr 等的 const long 是全局声明的 下面是从 MS 获取时间到字符串的代码

char lightOffTime[] = {'0', '0', ':', '0', '0', ':', '0', '0'};

void getTimeStr(char inArr[], unsigned long timeInMS)
{
  int num = 0;
  char cstr[16];

  num = timeInMS / (10 * MSin1Hr); //tens of hours
  sprintf(cstr, "%01d", num);
  inArr[0] = cstr[0];

  num = timeInMS % (10 * MSin1Hr) / MSin1Hr; //remainder
  sprintf(cstr, "%01d", num);
  inArr[1] = cstr[0];

  unsigned long minutesMS = timeInMS % MSin1Hr;
  num = minutesMS / (10 * MSin1Minute); //tens of minutes
  sprintf(cstr, "%01d", num);
  inArr[3] = cstr[0];

  num = minutesMS % (10 * MSin1Minute) / MSin1Minute; //remainder
  sprintf(cstr, "%01d", num);
  inArr[4] = cstr[0];

  unsigned long secondsMS = timeInMS % MSin1Minute;
  num = secondsMS / 10000; //tens of seconds
  sprintf(cstr, "%01d", num);
  inArr[6] = cstr[0];

  num = (secondsMS % 10000) / 1000; //remainder
  sprintf(cstr, "%01d", num);
  inArr[7] = cstr[0];
}

我使用

调用函数
getTimeStr(lightOffTime, lightTurnOffTime);

然后我可以使用Serial.println(lightOffTime);将其打印到串行

如您所见,我只是在 MS 中传入数组和时间,它应该将时间作为格式化字符串弹出。有任何想法吗? - 我传入的具体数字是 68401000 (19:00:01),由于某种原因正在打印 19:00:01h

【问题讨论】:

  • 你能贴出你用来调用这个函数的代码,包括数组的声明吗?
  • 已添加,同时被否决了 xD
  • 数组是作为字符串使用的吗?如果是这样,你最后没有 nul char \0
  • 所以数组实际上应该是 char lightOffTime[] = {'0', '0', ':', '0', '0', ':', '0', '0 ', '\0'};?编辑:我不认为我是,我只是将它作为一个数组直接传递给 println,并且只有当数字也是 > 19:00:00 时才会发生错误
  • @ComputerTuts 您如何期望println 知道要发送多少字节?

标签: c++ c arrays serialization arduino


【解决方案1】:

你必须在你的字符串末尾有一个空终止符来告诉打印函数在哪里停止打印。可能只是碰巧,内存中的下一个位置恰好有一个 0 直到你到达那个特定的数字,无论出于何种原因,在这种情况下,在你的内存数组之后最终会出现一个 h,然后显然是一个0 在那之后,因为它停在那里。

所以它与其他数字一起工作的事实只是侥幸。有时错误就是这样,你犯了一个错误,无论出于何种原因,它在某些情况下似乎工作正常。这就是从数组末端跑出来的本质。他们称其为“未定义行为”,因为无法预测当你这样做时会发生什么。

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 2021-12-03
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多