Serial port 与Arduino的Charlieplexing

Serial port 与Arduino的Charlieplexing,serial-port,arduino,delay,led,multiplexing,Serial Port,Arduino,Delay,Led,Multiplexing,我试图在我的Arduino上实现。目前,我使用3个输出来控制6个LED,并且工作正常。问题是,当我在一个函数中设置延迟时,这个重新出现的bug似乎来了又去。如果我在一个或多或少不相关的函数中设置了一些延迟,这个错误会导致我的串行输入(通过Arduino USB电缆)出错。 我通过串行端口发送一个介于1和6之间的数字来控制Charlieplexing阵列 if(Serial.available() > 0) { tempChar = 0; char temp = char(Ser

我试图在我的Arduino上实现。目前,我使用3个输出来控制6个LED,并且工作正常。问题是,当我在一个函数中设置延迟时,这个重新出现的bug似乎来了又去。如果我在一个或多或少不相关的函数中设置了一些延迟,这个错误会导致我的串行输入(通过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。要打开更多,我必须使Arduino在LED之间切换,使其看起来一次打开更多。 为此,我创建了一个新函数:

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
void范围(字节输入)
{
如果(输入=1)
{
查理(1);
}
else if(输入=2)
{
用于(字节i=1;i<3;i++)
{
查理(一);
}
}
else if(输入=3)
{ 
用于(字节i=1;i<4;i++)
{
查理(一);
延迟(4);
}
}…(继续输入==6)
这就是问题所在。如果调用Charlie()函数后没有包含delay(),串行输入就会中断。现在真正奇怪的是,延迟不一定是任何东西,也就是delay(0)将解决我的问题

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

123456

这就是我们所期望的。现在,如果我引入Range()函数时没有正确的延迟,那么输出将如下所示:

15 25 35 45 55 65

这将破坏程序

我知道这有点模糊,但我觉得很难解释。希望你能理解

完整代码可在此处找到:

更新


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

首先要解决的问题是:

char temp = char(Serial.read());
/*byte*/ tempChar = atoi(&temp);
atoi
函数需要一个
\0
终止的
char
数组。在您的情况下,如果在单个字符后面的某个地方有一个0字节,您就很幸运了。由于您不知道编译器在
temp
变量后面放了什么,并且当这个未知的东西改变其状态时,您就

因此,请尝试以下代码:

char temp = char(Serial.read());
tempChar = temp - '0';
然后报告这是否有帮助。

你说的“通过AVR Studio运行”到底是什么意思?你是否将代码调整为纯C?如果是,请也粘贴该代码。