Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serial port 带Arduino的串行数据_Serial Port_Arduino_Hardware Interface - Fatal编程技术网

Serial port 带Arduino的串行数据

Serial port 带Arduino的串行数据,serial-port,arduino,hardware-interface,Serial Port,Arduino,Hardware Interface,我刚刚开始了解Arduino。我有一个1米长的LED带从无线电棚屋周围玩 这部连续剧附带了一个示例程序,所以我看了一下,把它缩减到了最基本的部分,但我不明白到底发生了什么。我正在寻找一个人来解释发生了什么以及函数代码是如何工作的 代码如下: #include <avr/pgmspace.h> #define DATA_1 (PORTC |= 0X01) #define DATA_0 (PORTC &= 0XFE) #define STRIP_PINOUT (DDRC=0

我刚刚开始了解Arduino。我有一个1米长的LED带从无线电棚屋周围玩

这部连续剧附带了一个示例程序,所以我看了一下,把它缩减到了最基本的部分,但我不明白到底发生了什么。我正在寻找一个人来解释发生了什么以及函数代码是如何工作的

代码如下:

#include <avr/pgmspace.h>

#define DATA_1 (PORTC |=  0X01)
#define DATA_0 (PORTC &=  0XFE)
#define STRIP_PINOUT (DDRC=0xFF)

/*
green 0xff0000
cyan 0xff7f00
truquoise 0xffff00
dark blue 0x00ff00
red 0x0000ff
dark yellow 0x6f00ff
yellow 0x8f00ff
white 0xffffff
off white 0x444444
dim white 0x111111
off 0x000000
*/

PROGMEM long test[10][10]={
  {0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00},
  {0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000},
};

void setup() {

  STRIP_PINOUT;

  reset_strip();

}


void loop() 
{
  while (1)
  {
    send_pattern(test, 10, 50);
    reset_strip();
  }
}


void send_pattern(long data[][10], int length, int rate)
{
  int i=0;
  int j=0;

  for (i=0; i<length; i++)
  {
    noInterrupts();
    for (j=0; j<10; j++)
    {
      send_strip(pgm_read_dword_near(&data[i][j]));
    }
    interrupts();

    delay(rate);

  }




}


void send_strip(uint32_t data)
{
  int i;
  unsigned long j=0x800000;

  for (i=0;i<24;i++)
  {
    if (data & j)
    {
      DATA_1;
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");    
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      DATA_0;
    }
    else
    {
      DATA_1;
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");
      __asm__("nop\n\t");    
      DATA_0;
    }

    j>>=1;
  }
}


void reset_strip()
{
  DATA_0;
  delayMicroseconds(20);
}
#包括
#定义数据_1(端口C |=0X01)
#定义数据0(端口C&=0XFE)
#定义带_引脚(DDRC=0xFF)
/*
绿色0xff0000
青色0xff7f00
truquoise 0xffff00
深蓝色0x00ff00
红色0x0000ff
深黄色0x6f00ff
黄色0x8f00ff
白色0xffffff
灰白色0x4444
暗白色0x111111
关闭0x000000
*/
程序长测试[10][10]={
{0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
{0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
{0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
{0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
{0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
{0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00,0x00ff00},
{0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00,0x00ff00},
{0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00,0x00ff00},
{0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000,0x00ff00},
{0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x00ff00,0x000000},
};
无效设置(){
剥去皮诺;
重置_条();
}
void循环()
{
而(1)
{
发送_模式(测试,10,50);
重置_条();
}
}
无效发送模式(长数据[][10],整数长度,整数速率)
{
int i=0;
int j=0;

对于(i=0;i,如果您不懂C和/或以前没有使用过Arduino,那么该代码不是一个好的起点

Arduino编程语言(称为Wiring)将C代码的许多原始细节抽象为更简化的格式(和/或语言),这样初学者就更容易在思想上取得进步,而不会陷入“成为程序员”的困境布线代码在编译之前会被解释为C代码,这样用户就可以在一个草图中混合使用C(和C++)和布线

您上面的代码混合了C和Wiring语法,因此您无法在Arduino文档中找到有关语法的所有信息,但值得搜索您不了解的关键字或术语。不同的做法包括设置和使用串行端口。请参阅Arduino文档中的
serial
,了解如何在那里执行(理解起来要简单得多)

我将粗略地描述一下功能(在我感到厌烦之前)


该行定义了一个名为
test
的变量(在
PROGMEM
-EEPROM内存中),它是一个10 x 10的数字数组(
longs
):例如,有10个数组,每个数组包含10个数字(十六进制表示法)


此块调用函数(在代码顶部定义)来设置端口)和函数(在代码底部)来重置条带

void setup() 
  STRIP_PINOUT;
  reset_strip();
}


此函数遍历传递的var
数据(在本例中为var'test'),读取数组中位置[i][j]处的值使用名为
pgm\u read\u dword\u near
的AVR函数,并将该值发送到函数
send\u strip
,该函数将其发送到串行端口。发送每个阵列后,它调用
delay()
以等待
rate
中定义的毫秒数

void send_pattern(long data[][10], int length, int rate)
{
  int i=0;
  int j=0;

  for (i=0; i<length; i++)
  {
    noInterrupts();
    for (j=0; j<10; j++)
    {
      send_strip(pgm_read_dword_near(&data[i][j]));
    }
    interrupts();

    delay(rate);

  }
}
void发送模式(长数据[][10],整数长度,整数速率)
{
int i=0;
int j=0;

对于(i=0;i米长的LED带有10个段,每个段有三个LED,因此即使总共有30个LED,您也只能控制10个段

LED条有三根导线,红色(电源)、黑色(接地)和绿色(信号)

每段采用24位十六进制数来确定LED的颜色。当一段获得24位时,它设置其颜色,然后将信号的其余部分传输到下一段

信号为高或低,但对于接收信号的芯片而言,它通过先高后低的时间长度来确定信号是1还是零。该条附带的手册用图片更好地解释了这一点

高电平和低电平的定时由void send_strip(uint32_t data)方法控制。
\uu asm_uuu(“nop\n\t”)
告诉微控制器基本上浪费一个周期,因此它基本上是一个很短的延迟(在16MHz Arduino上为62.5ns)。我不得不玩send_strip()方法来获得正确的时间,否则所有的LED都会显示为全白色

void send_模式(long data[][10],int length,int rate)将10种颜色发送到LED条的10段。对于1M条,这应该是所有LED

PROGMEM long test[10][10]中的每一行都是条带的一组颜色。在本例中,条带有10种变体


我目前正在玩这篇文章,因此如果需要更多的示例或解释,请告诉我。

您是否使用C编译器编译了代码?您使用了什么编译器,在什么平台上?运行生成的可执行文件时会发生什么情况?“代码显示不正确”-如果格式正确,可以。感谢您正确设置碳酸(H2CO3)代码的格式.Halfer,我使用Audrnio附带的软件编译代码并将其上载到电路板,因此我不知道生成的可执行文件。如果您了解代码的工作原理,我将不胜感激。我本人没有使用Arduino用户,但您是否阅读过随附的入门指南,或者Arduino网站上的入门指南te?当你把代码上传到黑板上时,你有没有发现任何错误
void loop() 
{
  while (1) // i.e. do this forever
  {
    // send the test var, its length and the delay amount between each pattern
    send_pattern(test, 10, 50); 
    reset_strip();
  }
}
void send_pattern(long data[][10], int length, int rate)
{
  int i=0;
  int j=0;

  for (i=0; i<length; i++)
  {
    noInterrupts();
    for (j=0; j<10; j++)
    {
      send_strip(pgm_read_dword_near(&data[i][j]));
    }
    interrupts();

    delay(rate);

  }
}