Applescript to Arduino LCD solo funciona con Serial Monitor

3

Pasé todo el día tratando de resolver esto y finalmente llegué a un lugar que al menos me deja saber que estoy haciendo algo raro ...

Estoy intentando enviar datos a mi pantalla LCD en mi Arduino Uno, pero por alguna razón, solo funciona si el monitor de serie está abierto primero, luego trato de ejecutar mi Applecript ...

Entonces, este es mi Código Arduino ...

#include <Adafruit_CharacterOLED.h>
Adafruit_CharacterOLED lcd(6, 7, 8, 9, 10, 11, 12);

String inData;


void setup() 
{
  // Print a message to the LCD.
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
char TestData='X';
lcd.print(TestData);
}

void loop() {
while (Serial.available() > 0)
{
    char recieved = Serial.read();
    inData += recieved; 

    // Process message when new line character is recieved
    if (recieved == '\n')
    {
        lcd.setCursor(0, 0);
        lcd.print(inData);

        inData = ""; // Clear recieved buffer
    }
}
}

Si abro mi monitor serie y escribo algo, aparece en mi pantalla ... Genial

Así que ahora si ejecuto este script, desde applecript con el complemento SerialPort X instalado ...

set portRef to serialport open item 1 of (get serialport list)
if portRef is equal to -1 then
display dialog " could not open port "
else
serialport write "text  " to portRef
delay 1
serialport close portRef
end if

si trato de usar el nombre del puerto real ... siempre dice que no se puede conectar, solo se puede conectar si uso el elemento 1, no tengo idea de por qué, pero eso está bien por ahora ...

Entonces, si no tengo el monitor de serie abierto y ejecuto mi Applecript, esto sucede ...

Mi LCD se restablece a su estado inicial con una X en la esquina superior izquierda ... ahora si abro mi monitor serie ...

y enviar algo a la pantalla ... vuelve a funcionar

y si intento volver a AppleScript y ejecutarlo ...

otra vez no pasa nada ...

pero aquí es donde se pone raro ... si vuelvo a mi monitor serial y escribo algo y lo envío ...

Aparece test something en mi pantalla ... obviamente, obteniendo la prueba de AppleScript y algo del monitor de serie ... ¿hay algo realmente simple que me falta ... he intentado agregar \ n a Applecript, y también trató de agregar & Regrese, ninguno de los dos pareció funcionar ... ¿cuál es el pequeño detalle que me estoy perdiendo aquí?

EDIT

Así que hice una buena cantidad de investigación anoche y esta mañana, y encontré las representaciones ASCII tanto de Nueva línea como de Retorno de carro ... Ya que la nueva línea no funcionaba antes de comenzar con el cambio a un Retorno de carro ...

Reemplacé if (recieved == '\n'); con if (recieved == 13); y luego en mi applecript agregé set CR to (ASCII character 13) y luego cambié la línea de escritura a serialport write "really" & CR to portRef

Esto funciona ... bueno. A veces, sé que es un problema de abrir y cerrar el puerto serie, sobre el cual tengo poco conocimiento ... pero lo que está sucediendo es que, si comienzo de cero ... abrir el monitor serial luego abre Applecript y el script funciona ... el único problema que tengo es que si intento ejecutarlo una segunda vez ... dice que no se puede abrir el puerto

Aquí es donde estoy confundido, mi script se repetirá, pero lo que quiero saber es ¿por qué no puede conectarse al puerto la segunda vez?

    

2 respuestas

0

Pude hacer que esto funcionara, como expliqué en una edición anterior, hice lo siguiente ...

Reemplazé if (recieved == '\n'); con if (recieved == 13); y luego en mi applecript agregé set CR to (ASCII character 13) y luego cambié la línea de escritura a serialport write "really" & CR to portRef

Eso pareció funcionar para mí

    
respondido por el Chris James Champeau
2

Creo que estás mordido por CR-LF (retorno de carro [0x0d, '\ r'], avance de línea [0x0a, '\ n']). A veces, el CR es primero seguido por un LF; a veces el LF viene primero, seguido por el CR; a veces solo se envía un CR; a veces solo se envía un LF

Realmente depende de la aplicación y / o sistema operativo que use. Le aconsejaría que cambie su boceto de tal manera que no imprima los caracteres reales, sino que imprima los códigos hexadecimales. Esa será la forma más fácil de solucionar este problema.

No filtre los datos entrantes, así que elimine el '\ n'-check:

if (recieved == '\n')

Reemplazar:

lcd.print(inData);

por:

char ascii[ 8 ];
sprintf( ascii , "0x%02x " , inData );
lcd.print( ascii );

para ver los datos en hexadecimal.

Una vez que haya averiguado qué códigos están llegando a su Arduino, puede cambiar su código en consecuencia. Haga su código lo más robusto posible, ya que CR / LF viene en muchas variaciones. Incluso contaría con un carácter NULO (0x00).

    
respondido por el jippie

Lea otras preguntas en las etiquetas