0

我正在尝试在我的 Arduino 上实现Charlieplexing 。目前我使用 3 个输出来控制 6 个 LED,并且工作正常。问题是我有这个重新出现的错误,当我在我的一个功能中放置延迟时,它似乎来来去去。如果我在一个或多或少不相关的功能中放置一些延迟,该错误会导致我的串行输入(通过 Arduino USB 电缆)混乱。我通过串行端口发送 1 到 6 之间的数字来控制 Charlieplexing 阵列。

if(Serial.available() > 0)
 {
  tempChar = 0;

  char temp = char(Serial.read());

  tempChar = atoi(&temp);

  Serial.println(tempChar, DEC);
 }

然后将其转换为整数,然后由函数解释并转换为三个输入/输出端口中的每一个的正确端口状态。

void Charlie(byte input)
{

 if(input == 1)
 {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, INPUT);

  digitalWrite(2, 1);
  digitalWrite(3, 0);
  digitalWrite(4, 0);

 }
else if(input == 2)
{
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, INPUT);

  digitalWrite(2, 0);
  digitalWrite(3, 1);
  digitalWrite(4, 0);

 }... (continues to input == 6)

以上工作非常好,但一次只会打开一个LED。要打开更多,我将不得不在 LED 之间切换 Arduino,以使其看起来一次打开更多。为此,我创建了一个新函数:

void Range(byte input)
{

  if(input == 1)
  {
   Charlie(1);

  }
 else if(input == 2)
{
  for(byte i = 1; i < 3; i++)
  {
   Charlie(i);
  }

}
 else if(input == 3)
{ 

 for(byte i = 1; i < 4; i++)
 {
  Charlie(i);
  delay(4);
 }
}... (Continues to input == 6

这就是问题出现的地方。如果我在调用 Charlie() 函数后不包含 delay(),则串行输入中断。现在真正奇怪的是延迟不一定是任何东西,也就是延迟(0)会解决我的问题。

当我通过串行接口发送一些输入时,Arduino 会再次将其吐出。因此,如果我发送数字 1 到 6,它在串行控制台中将如下所示:

1 2 3 4 5 6

这是预期的。现在,如果我在没有正确延迟的情况下引入 Range() 函数,输出将如下所示:

15 25 35 45 55 65

这会破坏程序。

我知道这有点模糊,但我觉得很难解释。希望它对你有意义。

完整的代码可以在这里找到:http: //pastebin.com/t7tdtfid

更新

我尝试通过 AVR Studio 5 运行我的程序,但它没有受到问题的影响。

4

1 回答 1

1

首先要解决的是:

char temp = char(Serial.read());
/*byte*/ tempChar = atoi(&temp);

这些atoi函数需要一个\0终止的数组char。在您的情况下,如果在您的单个字符之后的某处有一个 0 字节,您会很幸运。而且由于您不知道编译器在您的temp变量之后放置了什么以及当这个未知事物改变其状态时,您......

因此,请尝试使用以下代码:

char temp = char(Serial.read());
tempChar = temp - '0';

然后报告是否有帮助。

于 2012-03-25T09:40:44.193 回答