简体   繁体   English

奇怪的 C++ Arduino 串行行为

[英]Strange C++ Arduino serial behavior

I am writing some code for my arduino to print 4 button states and the X,Y coordinates from an analogue joystick and I am having strange behavior.我正在为我的 arduino 编写一些代码来打印 4 个按钮状态和来自模拟操纵杆的 X、Y 坐标,但我有奇怪的行为。

Here is the code:这是代码:

  int x,y;
  x = analogRead(joy_x);
  y = analogRead(joy_y);
  char* buf = new char[4];
  sprintf(buf, "%4d", x);
  Serial.print("X:");
  Serial.print(buf);
  Serial.print(" Y:");
  sprintf(buf, "%4d", y);
  Serial.println(buf);

  int one,two,three,four;
  one = digitalRead(touchOne);
  two = digitalRead(touchTwo);
  three = digitalRead(touchThree);
  four = digitalRead(touchFour);

  // create an array of states set to the default values
  char states[4] = {'X', 'X', 'X', 'X'};
  // change each value if it is not in the default state
  if(one   == 1) states[0] = 'O';
  if(two   == 1) states[1] = 'O';
  if(three == 1) states[2] = 'O';
  if(four  == 1) states[3] = 'O';
  // output the states to the OLED display
  //display.print(states);
  Serial.print(states);

When it is run the serial output looks like this:当它运行时,串行输出如下所示:

XXXX3X: 515 Y: 520
XXXX3X: 516 Y: 520
XXXX3X: 516 Y: 519
XXXX3X: 516 Y: 520
XXXX3X: 515 Y: 520
XXXX3X: 516 Y: 519
XXXX3X: 516 Y: 520
XXXX3X: 515 Y: 519
XXXX3X: 516 Y: 520

Even though the X, Y should be before the XXXX and the number three appears from nowhere.即使 X、Y 应该在 XXXX 之前,并且数字 3 突然出现。 I hope this mystery can be solved, thanks.希望能解开这个谜,谢谢。

You have several buffer overruns in the code.代码中有多个缓冲区溢出。

  char* buf = new char[4];
  sprintf(buf, "%4d", x);
  ...
  sprintf(buf, "%4d", y);

This needs room for the null terminator which sprintf adds.这需要为sprintf添加的空终止符sprintf

  char* buf = new char[5];

Also easier: there's no need to use the free store here.也更容易:这里没有必要使用免费商店。

  char buf[5];

Same kind of thing here:同样的事情在这里:

  char states[4] = {'X', 'X', 'X', 'X'};
  ...
  Serial.print(states);

We need to add a null terminator to make it a valid string.我们需要添加一个空终止符以使其成为有效的字符串。

  char states[5] = {'X', 'X', 'X', 'X', '\0'};

That should take care of the immediate memory issues.这应该处理直接的内存问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM