我正在尝试使用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]);
}
}`
首先,你实际上没有问一个问题。这对这个论坛来说是不好的形式。
看到您基本上复制了典型的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()”出现了,但