3

我正在尝试通过 USB 将一个三位数的数字从 XCode 基础命令行工具发送到 arduino,作为发送数据流的概念证明。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. 主要问题是您永远不会设置baudRatefor ORSSerialPortORSSerialPort(你有这个分配。)另外,我看到的例子在打开端口之前设置了波特率。所以,我建议:

    arduino.baudRate = @(1200); //sets baud rate
    [arduino open];             //opens port
    
  2. 此外,在我的测试中,如果我在写入数据后立即尝试关闭 Arduino 的端口,则不会收到它。在关闭该端口之前,您可能需要稍等片刻

  3. 您可能还想为发送到 Arduino 的内容使用新的行终止符。这显然是发送和接收代码的变化,但它会比仅仅读取接下来的三个字节更健壮一些。

  4. 我可能还建议,如果您想特别小心,您可能需要delegateORSSerialPort对象设置 并实现ORSSerialPortDelegate方法。那里有一个错误报告方法,您可能想利用它。

  5. 当我beginSerialArduino 上时,我包含一个等待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()成功读取来自 的输入时Serial,您可以让 Arduino 回写内容(通过Serial.println),您可以让 Mac 读取这些内容以确认成功接收数据。它实际上是一种确认收到命令的方法,可以帮助您将通信相关问题与接线问题隔离开来。

于 2014-03-14T02:00:47.707 回答
0

刚刚遇到同样的问题并解决了。将 DTR 设置为 1 可能会解决此问题。

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