コンピューターからサーボを管理する必要があります。
そのため、コンピューターからArduinoに管理メッセージを送信する必要があります。サーボの数とコーナーを管理する必要があります。私はこのような何かを送ることを考えています: "1; 130"(最初のサーボとコーナー130、デリミタ ";")。
これを達成するためのより良い方法はありますか?
これが私のこのコードです:
String foo = "";
void setup(){
Serial.begin(9600);
}
void loop(){
readSignalFromComp();
}
void readSignalFromComp() {
if (Serial.available() > 0)
foo = '';
while (Serial.available() > 0){
foo += Serial.read();
}
if (!foo.equals(""))
Serial.print(foo);
}
これは機能しません。どうしたの?
コード例
int x;
String str;
void loop()
{
if(Serial.available() > 0)
{
str = Serial.readStringUntil('\n');
x = Serial.parseInt();
}
}
シリアルで送信する値は「my string\n5」になり、結果はstr =「my string」およびx = 5になります
注:Serial.available()はStreamユーティリティクラスを継承します。https: //www.arduino.cc/reference/en/language/functions/communication/serial/available/
これは私が見つけた素晴らしいサブです。これは非常に役に立ちました。あなたにも役立つことを願っています。
これは、サブルーチンを呼び出すメソッドです。
String xval = getValue(myString, ':', 0);
これはサブです!
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]) : "";
}
他の回答のほとんどは非常に冗長または非常に一般的であるため、Arduinoライブラリを使用して特定の例を使用してそれをどのように実行できるか例を示したいと思いました。
メソッド Serial.readStringUntil を使用して、Serial
ポートからの区切り文字まで読み取ることができます。
そして、 toInt を使用して、文字列を整数に変換します。
したがって、完全な例では:
void loop()
{
if (Serial.available() > 0)
{
// First read the string until the ';' in your example
// "1;130" this would read the "1" as a String
String servo_str = Serial.readStringUntil(';');
// But since we want it as an integer we parse it.
int servo = servo_str.toInt();
// We now have "130\n" left in the Serial buffer, so we read that.
// The end of line character '\n' or '\r\n' is sent over the serial
// terminal to signify the end of line, so we can read the
// remaining buffer until we find that.
String corner_str = Serial.readStringUntil('\n');
// And again parse that as an int.
int corner = corner_str.toInt();
// Do something awesome!
}
}
もちろん、これを少し単純化できます。
void loop()
{
if (Serial.available() > 0)
{
int servo = Serial.readStringUntil(';').toInt();
int corner = Serial.readStringUntil('\n').toInt();
// Do something awesome!
}
}
読み取りバッファを構築し、2つのフィールド(サーボ#、コーナー)の開始位置と終了位置を計算する必要があります。次に、それらを読み込んで、文字を整数に変換して、残りのコードで使用できます。このようなものは動作するはずです(Arduinoではテストされていませんが、標準C):
void loop()
{
int pos = 0; // position in read buffer
int servoNumber = 0; // your first field of message
int corner = 0; // second field of message
int cornerStartPos = 0; // starting offset of corner in string
char buffer[32];
// send data only when you receive data:
while (Serial.available() > 0)
{
// read the incoming byte:
char inByte = Serial.read();
// add to our read buffer
buffer[pos++] = inByte;
// check for delimiter
if (itoa(inByte) == ';')
{
cornerStartPos = pos;
buffer[pos-1] = 0;
servoNumber = atoi(buffer);
printf("Servo num: %d", servoNumber);
}
}
else
{
buffer[pos++] = 0; // delimit
corner = atoi((char*)(buffer+cornerStartPos));
printf("Corner: %d", corner);
}
}
修正する必要があるようです
foo = ''; >>to>> foo = "";
foo += Serial.read(); >>to>> foo += char(Serial.read());
私も似たようなものを作りました。
void loop(){
while (myExp == "") {
myExp = myReadSerialStr();
delay(100);
}
}
String myReadSerialStr() {
String str = "";
while (Serial.available () > 0) {
str += char(Serial.read ());
}
return str;
}