我目前正在创建一个通过串行通信来控制我的Arduino的可视化基本程序,问题是在我将第一个字符串从VB发送到arduino之后, if (Serial.available() )
在下次发送字符串时不再有效...
这是从VB发送到Arduino的字符串的示例: 5,10,0,0,0050,0100,00,1,0,0050,0100,01,2,0,0050,0100,02
这是Arduino代码:
int functions[3][5];
int fLength, numF = 0;
int minF, minFIdx = 98;
String functionString = "";
uint8_t dataPin = 2; // Yellow wire on Adafruit Pixels
uint8_t clockPin = 3; // Green wire on Adafruit Pixels
Adafruit_WS2801 strip = Adafruit_WS2801((uint16_t)11, (uint16_t)9, dataPin, clockPin);
void setup()
{
//Start Comm on BAUD 9600
Serial.begin(9600);
delay(2);
strip.begin();
strip.show();
}
void loop()
{
//If serial communication exists, build string
if (Serial.available())
{
Serial.print("Serial On");
delay(5);
while (Serial.available())
{
functionString.concat(Serial.read());
}
//sort all data into arrays
int fSet = 2;
int numStrings = 0;
for (int z = 0; getValue(functionString, ',', z); z++)
{
numStrings++;
}
fLength = stringToNumber(getValue(functionString, ',', 0));
numF = stringToNumber(getValue(functionString, ',', 1));
for (int j = 0; j < numF; j++)
{
for (int i = 0; i < fLength; i ++)
{
functions[j][i] = stringToNumber(getValue(functionString, ',', fSet));
if (fSet < numStrings -1)
{
fSet++;
}
}
}
functionString = "";
}
//sort and find the minimum priority w/ index of function if min is 98
if (minF >= 98)
{
for (int u = 0; u < numF; u++)
{
if (functions[u][4] < minF)
{
minF = functions[u][7];
minFIdx = u;
}
}
}
//select case for the function index pulled prior
switch (minFIdx)
{
case 0:
Serial.print("Case 0");
break;
case 1:
Serial.print("Case 1");
break;
case 2:
Serial.print("Case 2");
break;
}
}
如果你看一下 Serial.print("Serial On");
行,它只会在我第一次发送字符串时返回"Serial On"因此我假设它只进入 if (Serial.available())
一次 . 让它再次返回"Serial On"的唯一方法是将代码重新上传到arduino,在VB端没什么需要做的,所以我认为问题出在arduino代码的某个地方,下面是一个快照VB程序,在"Send"上它应该返回"Serial On"
~~~~~~~~~~~编辑~~~~~~~~~~~~~~~~~~~~~~~~~
刚想到,无论如何,我自己的调试命令是否会中断我的串口通讯? Serial.print("Serial On");
有谁知道这是否可能???
~~~~~~~~~~~~~~~编辑2 ~~~~~~~~~~~~~~~~~~~~
好吧,我能够发现问题,唯一的问题是它没有任何意义,由于某种原因,下面指定的代码段停止所有串行通信,进出arduino .....任何人都可以告诉我为什么这是和我该怎么办呢?
for (int z = 0; getValue(functionString, ',', z); z++)
{
numStrings++;
}
~~~~~~~~~~~~~~~~~~~~~编辑3 ~~~~~~~~~~~~~~~~~~~~~
这是你们正在寻找的getValue()代码
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1};
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(data.charAt(i)==separator || i==maxIndex){
found++;
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}