Проблема со связью arduino/mac с использованием ORSSerialPort
Я пытаюсь отправить трехзначное число из основного инструмента командной строки XCode в arduino через USB в качестве доказательства концепции отправки потока данных. Код arduino должен мигать количество раз, которое число во входящих данных. Он отлично работает, используя последовательный монитор в IDE Arduino, но когда я пытаюсь использовать программу Objective-C, которая использует ORSSerialPort, на 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--;
}
}
}
2 ответа
Пара мыслей:
Основная проблема в том, что вы никогда не устанавливаете
baudRate
заORSSerialPort
, (У вас это задание задом наперед.) Кроме того, примеры, которые я видел, устанавливали скорость передачи вORSSerialPort
до открытия порта. Итак, я бы предложил:arduino.baudRate = @(1200); //sets baud rate [arduino open]; //opens port
Кроме того, в моем тесте, если бы я попытался закрыть порт для Arduino сразу после записи данных, он не был бы получен. Возможно, вы захотите немного подождать, прежде чем закрыть этот порт
Вы также можете использовать новый терминатор строки для того, что вы отправляете в Arduino. Это, очевидно, изменение как отправляющего, так и принимающего кода, но оно будет немного более надежным, чем просто чтение следующих трех байтов.
Я также могу предположить, что если вы хотите быть особенно осторожным, вы можете установить
delegate
дляORSSerialPort
возразить и реализоватьORSSerialPortDelegate
методы. Там есть метод сообщения об ошибках, который вы можете использовать самостоятельно.Когда я
begin
мойSerial
на Arduino, я включаю цикл, который ждетSerial
подключиться. Фрагмент кода, из которого я взял это, говорит, что это необходимо только с Леонардо, но стоит попробовать, если вы обнаружите, что не можете успешно получать данные при первом открытии соединения со стороны 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, чтобы подтвердить успешное получение данных. По сути, это способ подтверждения получения команды, который поможет вам изолировать проблемы, связанные со связью, от проблем с проводкой.
Только что встретил ту же проблему и решил. Установка DTR на 1, вероятно, решит эту проблему.
arduino.DTR = YES;