当前位置: 首页 > 知识库问答 >
问题:

arduino与vixen的串行通信

水昊阳
2023-03-14

我正在尝试使用arduino通过串行通信从泼妇软件获取传入数据。并将数据移动到其他12个arduino,如果我将泼妇的通道号保留为43,但我需要控制480个通道,它就可以工作。所以第一个arduino控制43个通道,下一个是44-87,依此类推。

这是我的主代码:'ulusetup(){Serial.begin(9600);

  Serial3.begin(9600); 
}

void loop()
{ 
   // read from port 0, send to port 1:
   if (Serial.available()) {
   int inByte = Serial.read();
   Serial3.write(inByte); 

}}这是从代码://输出

int cue1 = 3;
int cue2 = 4;
int cue3 = 5;
int cue4 = 6;
int cue5 = 7;
int cue6 = 8;
int cue7 = 9;
int cue8 = 10;
int cue9 = 11;
int cue10 = 12;
int cue11 = 13;
int cue12 = 22;
int cue13 = 23;
int cue14 = 24;
int cue15 = 25;
int cue16 = 26;
int cue17 = 27;
int cue18 = 28;
int cue19 = 29;
int cue20 = 30;
int cue21 = 31;
int cue22 = 32;
int cue23 = 33;
int cue24 = 34;
int cue25 = 35;
int cue26 = 36;
int cue27 = 37;
int cue28 = 38;
int cue29 = 39;
int cue30 = 40;
int cue31 = 41;
int cue32 = 42;
int cue33 = 43;
int cue34 = 44;
int cue35 = 45;
int cue36 = 46;
int cue37 = 47;
int cue38 = 48;
int cue39 = 49;
int cue40 = 50;
int cue41 = 51;
int cue42 = 52;
int cue43 = 53;


 int i = 0;
 int incomingByte[43];


  void setup() // run once, when the sketch starts

  {
     Serial3.begin(9600);
     pinMode(cue1, OUTPUT); // sets the digital pin as output
     pinMode(cue2, OUTPUT); // sets the digital pin as output
     pinMode(cue3, OUTPUT); // sets the digital pin as output
     pinMode(cue4, OUTPUT); // sets the digital pin as output
     pinMode(cue5, OUTPUT); // sets the digital pin as output
     pinMode(cue5, OUTPUT); // sets the digital pin as output
     pinMode(cue6, OUTPUT); // sets the digital pin as output
     pinMode(cue7, OUTPUT); // sets the digital pin as output
     pinMode(cue8, OUTPUT); // sets the digital pin as output
     pinMode(cue9, OUTPUT); // sets the digital pin as output
     pinMode(cue10, OUTPUT); // sets the digital pin as output
     pinMode(cue11, OUTPUT); // sets the digital pin as output
     pinMode(cue12, OUTPUT); // sets the digital pin as output
     pinMode(cue13, OUTPUT); // sets the digital pin as output
     pinMode(cue14, OUTPUT); // sets the digital pin as output
     pinMode(cue15, OUTPUT); // sets the digital pin as output
     pinMode(cue16, OUTPUT); // sets the digital pin as output
     pinMode(cue17, OUTPUT); // sets the digital pin as output
     pinMode(cue18, OUTPUT); // sets the digital pin as output
     pinMode(cue19, OUTPUT); // sets the digital pin as output
     pinMode(cue20, OUTPUT); // sets the digital pin as output
     pinMode(cue21, OUTPUT); // sets the digital pin as output
     pinMode(cue22, OUTPUT); // sets the digital pin as output
     pinMode(cue23, OUTPUT); // sets the digital pin as output
     pinMode(cue24, OUTPUT); // sets the digital pin as output
     pinMode(cue25, OUTPUT); // sets the digital pin as output
     pinMode(cue26, OUTPUT); // sets the digital pin as output
     pinMode(cue27, OUTPUT); // sets the digital pin as output
     pinMode(cue28, OUTPUT); // sets the digital pin as output
     pinMode(cue29, OUTPUT); // sets the digital pin as output
     pinMode(cue30, OUTPUT); // sets the digital pin as output
     pinMode(cue31, OUTPUT); // sets the digital pin as output
     pinMode(cue32, OUTPUT); // sets the digital pin as output
     pinMode(cue33, OUTPUT); // sets the digital pin as output
     pinMode(cue34, OUTPUT); // sets the digital pin as output
     pinMode(cue35, OUTPUT); // sets the digital pin as output
     pinMode(cue36, OUTPUT); // sets the digital pin as output
     pinMode(cue37, OUTPUT); // sets the digital pin as output
     pinMode(cue38, OUTPUT); // sets the digital pin as output
     pinMode(cue39, OUTPUT); // sets the digital pin as output
     pinMode(cue40, OUTPUT); // sets the digital pin as output
     pinMode(cue41, OUTPUT); // sets the digital pin as output
     pinMode(cue42, OUTPUT); // sets the digital pin as output
     pinMode(cue43, OUTPUT); // sets the digital pin as output

     }

      void loop()
    {
       if (Serial3.available() >=43)
    {
      for (int i=0; i<43;i++)
     {
       incomingByte[i] = Serial3.read();
        }                                      
     digitalWrite(cue1, incomingByte[0]);  
     digitalWrite(cue2, incomingByte[1]);  
     digitalWrite(cue3, incomingByte[2]);  
     digitalWrite(cue4, incomingByte[3]);  
     digitalWrite(cue5, incomingByte[4]);  
     digitalWrite(cue6, incomingByte[5]);  
     digitalWrite(cue7, incomingByte[6]);  
     digitalWrite(cue8, incomingByte[7]);  
     digitalWrite(cue9, incomingByte[8]);  
     digitalWrite(cue10, incomingByte[9]);  
     digitalWrite(cue11, incomingByte[10]); 
     digitalWrite(cue12, incomingByte[11]); 
     digitalWrite(cue13, incomingByte[12]); 
     digitalWrite(cue14, incomingByte[13]); 
     digitalWrite(cue15, incomingByte[14]); 
     digitalWrite(cue16, incomingByte[15]);  
     digitalWrite(cue17, incomingByte[16]);  
     digitalWrite(cue18, incomingByte[17]);  
     digitalWrite(cue19, incomingByte[18]);  
     digitalWrite(cue20, incomingByte[19]);  
     digitalWrite(cue21, incomingByte[20]);  
     digitalWrite(cue22, incomingByte[21]);  
     digitalWrite(cue23, incomingByte[22]);  
     digitalWrite(cue24, incomingByte[23]);  
     digitalWrite(cue25, incomingByte[24]);  
     digitalWrite(cue26, incomingByte[25]); 
     digitalWrite(cue27, incomingByte[26]); 
     digitalWrite(cue28, incomingByte[27]); 
     digitalWrite(cue29, incomingByte[28]); 
     digitalWrite(cue30, incomingByte[29]); 
     digitalWrite(cue31, incomingByte[30]);  
     digitalWrite(cue32, incomingByte[31]);  
     digitalWrite(cue33, incomingByte[32]);  
     digitalWrite(cue34, incomingByte[33]);  
     digitalWrite(cue35, incomingByte[34]);  
     digitalWrite(cue36, incomingByte[35]);  
     digitalWrite(cue37, incomingByte[36]);  
     digitalWrite(cue38, incomingByte[37]);  
     digitalWrite(cue39, incomingByte[38]);  
     digitalWrite(cue40, incomingByte[39]);  
     digitalWrite(cue41, incomingByte[40]); 
     digitalWrite(cue42, incomingByte[41]); 
     digitalWrite(cue43, incomingByte[42]); 

       }
      }`

共有1个答案

何涵育
2023-03-14

首先,你实际上没有问一个问题。这对这个论坛来说是不好的形式。

看到您基本上复制了典型的Vixen代码,并将其添加到Mega上,我可以看到需要解决的几个方面。如何扩展到多个单元、帧和缓冲区大小。

Arduino从Vixen收到的消息似乎是一个典型的例子。这是可怕的,因为它没有框架开始或结束的线索流。相反,它要求流保持同步,这取决于长度。这将一直工作到丢失一个字节。然后一切都将不同步,直到每个组件重置并重新启动。一些你不想用多个Arduino做的事情。

下面的代码通过配置Vixen的通用串行端口设置来增强这一点,以启用“发送文本页脚”发送单个字母“E”。

利用这个实现中的输出提示只是布尔值。开或关。其中,Vixen将为序列中的每个提示发送0x00或0xFF。因此,在启用上述页脚的情况下,Vixen将用字节“E”或0x45(十六进制)终止每个序列。通常,提示的强度范围为0x00到0xFF。如果是这种情况,则需要更复杂的页脚,因为0x45可能是合法值。而在这种情况下,“E”将很好地工作。

#define FIRST_IN_CHAIN 1 // set this to 1 for the first in Chain
#define SIZE_OF_ARRAY(X) (sizeof(X)/sizeof(X[0])) //total length divided by length of one element

// As specified in Vixen's General Serial Port Setup "Send a Text Footer"
#define VIXEN_END_OF_TEXT 'E'

#if (FIRST_IN_CHAIN == 1)
  #define SERIALIN Serial
#else
  #define SERIALIN Serial2
#endif

// General GPIO used to output Cues
uint8_t pins[] = {3,4,5,6,7,8,9,10,11,12,13,\
  // not used SerialX ports
  // 14,15, \ // TXD3/RXD3
  // 16,17, \ // TXD2/RXD2
  // 18,19, \ // TXD1/RXD1
  // 20,21, \ // SDA/SCL
  22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53};

void setup() {
  SERIALIN.begin(9600);
  Serial3.begin(9600);

  // initialize cue pins OFF and Output
  for (uint8_t pin = 0; pin < SIZE_OF_ARRAY(pins); pin++) {
    digitalWrite(pins[pin], LOW);
    pinMode(pins[pin], OUTPUT);
  }
}

void loop()
{
  // get first 43 cues for this Arduino
  for (uint8_t pin = 0; pin < SIZE_OF_ARRAY(pins); pin++) {
    while(!SERIALIN.available()); // wait for some data.
    char c = SERIALIN.read();
    if(c == VIXEN_END_OF_TEXT) {
      return;
    }
    else if(c > 0) {
      digitalWrite(pins[pin], HIGH);
    } 
    else {
      digitalWrite(pins[pin], LOW);
    }
  }

  // read from port 0, send to port 1:
  while(1) {
    while(!SERIALIN.available()) ; // wait for next data.
   // echo byte on to the next stage
    char c = SERIALIN.read();
    Serial3.write(c); 
    if(c == VIXEN_END_OF_TEXT) {
      // when Carriage Return is received Exit while and wait for new frame 
      break;
    }
  }
}

现在这不是完美的,因为我没有雌狐,这样的设置还没有被证明。然而,它确实编译了,看起来应该可以正常工作。

配置为页脚为“E”的Vixen发送字节流,表示每个提示以“E”结束帧。因此,上面的示意图将侦听前43个提示,并将其应用于本地PIN。如果脚本偶然出现顺序错误,并且无意中检测到“E”的页脚,则返回loop()以开始一个新的循环。如果成功接收到所有要在本地应用的提示,则会将剩余的输入提示从串行3(TXD3)回显到下一个Arduino的串行2(RXD2),直到收到一个表示序列结束的页脚“E”。在这一点上,它会重新开始。注意,本地应用的提示没有回音,这意味着下一个Arduino将再次作用于它接收到的下43个或前43个提示,并回音剩余的提示,直到链耗尽。

有几个有趣的地方:

注意使用

    while(!SERIALIN.available()); // wait for some data.

这实际上是“在没有数据可读取时等待”或等待,直到有东西。这些都是阻塞(意味着代码被卡住)直到收到一些东西。然而,预计Vixen将定期发送线索流。即使丢失了一个“E”,下一帧也会包含它,这样代码就会自动重新同步。

同样值得注意的是,pins-to-cue的定义更加灵活。如果你想使用47个提示,请发表评论:

  // 18,19, \ // TXD1/RXD1
  // 20,21, \ // SDA/SCL

代码将自动调整大小。如果用于其他目的,则注释掉其他引脚。

值得注意的是,9600波特约为每秒960字节。这意味着序列每秒只能更新不到两次或大约2赫兹。菊花链将增加明显的传播延迟和Arduino之间的差异。Vixen 2可配置为57600波特的最大速率,可产生约12 Hz的频率。因此,我建议将Vixen和Arduino配置为至少57600波特。尽量减少这些影响。Vixen 3实际上可以跑得更快。我推荐115200波特或24赫兹。

总而言之,第一个单元的编译FIRST_IN_CHAIN定义为1。这会导致引线ArduinoMega从连接到运行Vixen的PC的Serial端口接收数据。其余Mega的编译FIRST_IN_CHAIN定义为0。其中前一个单元的Serial3连接到下一个单元Serial2。可以驱动到Serial。其中保留Serial用于调试等更简单。Vixen配置为“E”英尺。

缓冲区大小在这个解决方案中不是问题,因为每个字节都是单独处理的。不要等待它们都在Arduino的Serial.read()缓冲区中建立。这将超过62。

 类似资料:
  • 我想用Python在我的树莓派和Arduino之间进行交流。到目前为止,Arduino成功地向Raspberry Pi发送了一条串行消息,并使用Python中的ser.readline()函数读取消息。但是当我想用IF语句闪烁连接到树莓派的led时,它就不起作用了 这是我的Arduino代码: 这是在我的Raspberry Pi上运行的Python代码: 这是我在终端中看到的:终端图像 我已经找了

  • 我在Raspberry Pi(Python脚本)和Arduino nano/uno之间的串行通信方面遇到一些问题。我的两个设备都通过USB端口连接,当我直接从arduino IDE串行监视器发送命令时,arduino草图始终正确响应: 但是,当我运行python脚本,他发送相同的命令时,草图以随机方式响应。 覆盆子终端: Arduino串行监视器: Mi代码为: Arduino草图: Python

  • 我在一个项目中,我想通过串行通信发送传感器数据从Arduino到PHP。 不幸的是,我无法读取PHP中的串行端口。然而,另一个方向(PHP到Arduino)工作得很好。我使用的是php_系列。班来自Rémy Sanchez的php,由Rizwan Kassim修改。我依赖于readPort()函数。 我在Mac OS X上使用Arduino UNO和Apache WAMP-Server。我应该实现

  • 我遇到了一个非常简单的问题。 我正在尝试制作一个Qt GUI应用程序,以从GUI控制我的Arduino(而不是从Arduino IDE的串行监视器控制它)。我能够使用QSerialPort Write()方法成功地向Arduino写入,但我无法从Arduino读取任何内容。从串行端口读取数据的唯一方法是在Qt代码的waitForBytesWrite()中的write()函数之后使用waitForR

  • Arduino代码 虽然很简单,但有一个问题,可能是因为我无法理解串行方法。它首先向串口发送一个测试字节,告诉计算机上的C#程序它可以开始发送信息。接下来,它会检查序列中是否有任何字节,如果有,它会检查第一个字节是否与r、g或b中的任何一个匹配,并从序列中获取接下来的三个字节,并将其转换为整数。 在VisualStudio方面 在visual studio上,如果它检测到arduino已使用“x”

  • 我对Arduino和Processing都比较陌生,我一直在开发一种利用两者之间串行通信的代码。我的Arduino代码从压电传感器读取并打印数值,然后将数值发送给Processing,Processing根据数值绘制特定形状。该代码以前已经工作过,但由于某种原因,它不再工作。一切都会编译,但当我运行处理代码时,草图窗口是空的,并且仍然是空的。有几次“错误,禁用serialEvent()”出现了,但