3

データストリームを送信するための概念実証として、XCode Foundation コマンドラインツールから USB 経由で arduino に 3 桁の番号を送信しようとしています。arduino コードは、着信データの数値の回数だけライトを点滅させることになっています。arduino IDEのシリアルモニターを使用すると完全に動作しますが、ORSSerialPortを使用するObjective-Cプログラムを使用しようとすると、arduinoでRxライトが点滅し、データを受信したことを示しますが、他には何も起こりません.

Objective-C コードは次のとおりです。

#import <Foundation/Foundation.h>
#import <IOKit/IOKitLib.h>
#import "ORSSerialPort.h"
#import "ORSSerialPortManager.h"



int main(int argc, const char * argv[])
{
    @autoreleasepool {

        ORSSerialPort *arduino = [ORSSerialPort serialPortWithPath:@"/dev/tty.usbmodem26231"];
        //initalizes ORSSerialPort instance

        NSString *string = @"012"; //creates string from the 3-digit number

        NSData *outgoingdata = [string dataUsingEncoding:NSASCIIStringEncoding]; 
        //encodes string using ASCII

        int number = 1200;
        NSNumber *baudrate = [[NSNumber alloc] initWithInt:number];
        //initializes an NSNumber for the baud rate

        [arduino open]; //opens port
        baudrate = arduino.baudRate; //sets baud rate
        [arduino sendData:outgoingdata]; //sends data
        [arduino close]; //closes port

        NSLog(@"%@ sent", string); //logs the number
    }   
    return 0;
}

arduinoのコードは次のとおりです。

#include <SoftwareSerial.h>

int i100;
int i10;
int i1;
int total;

void setup() {
  Serial.begin(1200);
  pinMode(2, OUTPUT);
}

void loop() {
int mail = Serial.available(); //reads number of available bytes
  if(mail >= 3) {
    int i100raw = Serial.read()-48; //reads 3 bytes and decodes from ASCII by subtracting 48
    int i10raw = Serial.read()-48;  
    int i1raw = Serial.read()-48; 

    if(i1raw >= 0) {  //checks if each byte is a valid input 
      i100 = i100raw; 
    }
    if(i10raw >= 0) {
      i10 = i10raw; 
    }
    if(i1raw >= 0) {
      i1 = i1raw; 
    }

    total = (i100*100)+(i10*10)+(i1); //puts together 3 digit number from 3 bytes

    while(total > 0) {       //flashes light  
      digitalWrite(2, HIGH);
      delay(50);
      digitalWrite(2, LOW);
      delay(50);
      total--;
    }   
  }
} 
4

2 に答える 2

1

いくつかの考え:

  1. 主な問題は、 for を設定していないことbaudRateですORSSerialPortORSSerialPort(その割り当ては逆です。) また、私が見た例では、ポートを開く前にボーレートを設定しています。だから、私はお勧めします:

    arduino.baudRate = @(1200); //sets baud rate
    [arduino open];             //opens port
    
  2. また、私のテストでは、データを書き込んだ直後にArduinoへのポートを閉じようとすると、受信されませんでした。そのポートを閉じる前に少し待つことをお勧めします

  3. Arduino に送信するものに改行ターミネータを使用することもできます。これは明らかに送信側と受信側の両方のコードの変更ですが、次の 3 バイトを読み取るだけよりも少し堅牢になります。

  4. また、特に注意したい場合はdelegateORSSerialPortオブジェクトに を設定してメソッドを実装することをお勧めしORSSerialPortDelegateます。そこには、利用したいエラー報告方法があります。

  5. Arduino を使用するときはbegin、接続Serialを待機するループを含めます。Serial私が引用したコード スニペットは、これは Leonardo でのみ必要であると述べていますが、Mac 側から最初に接続を開いたときにデータを正常に受信できない場合は、試してみる価値があります。

    void setup() 
    {
      pinMode(2, OUTPUT);
    
      Serial.begin(1200); 
      while (!Serial) {
        // wait for serial port to connect. Needed for Leonardo only
      } 
    
      Serial.println("OK. Connected.");
    }
    

    また、loop()からの入力の読み取りに成功したら、データを正常に受信したことを確認するために、Mac に読み取らせることができるSerialものを ( 経由で) Arduino に書き戻すことができます。Serial.printlnこれは事実上、コマンドの受信を確認する方法であり、配線の問題から通信関連の問題を切り分けるのに役立ちます。

于 2014-03-14T02:00:47.707 に答える
0

同じ問題に遭遇して解決しました。DTR を 1 に設定すると、おそらくこの問題が解決します。

arduino.DTR = YES;
于 2020-12-18T06:44:23.387 に答える