HEX Befehle über RS-232 senden

Hallo Zusammen

Ich per kontakt ein Befehl über RS232 senden können und beim loslassen einen weiteren Befehl senden.

Es geht um ein Beamer den ich Ein/Ausschalten muss.

https://www.canon.co.uk/Images/WUX450ST_UserCommands_E_YT1-1465-000_tcm14-1455893.pdf

Meiner Meinung nach muss ich "504F5745523D4F4E0D" (HEX) zum Einschalten senden

Zudem ist bei diesem Beamer so das man 2 Stop bit braucht nicht wie sonst nur 1s

Kann mir hier jemand weiterhelfen?

Ich habe hier einen code aus dem Internet der ein wenig angepasst wurde
Hier versucht das Arduino den Befehl noch ins HEX umzuwandeln, was ich aber nicht unbedingt brauche.

/*
  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo and Micro support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 */
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
boolean lastState = false;
boolean manuallyState = false;

//Ab hier anpassen
long baudRate = 19200;    //BaudRate Serial-Kommunikation RS232 und PC

int pinRelais = 2;       //Pin fuer Relais
int pinManuell_On = 3;   //Pin fuer manueller Schalter <ON>
int pinManuell_Off = 4;  //Pin fuer manueller Schalter <OFF>
int repeate = 1;         //Wie viel mal soll das Kommando gesendet werden
long sleep = 1100;        //Wie lange soll zwischen den Wiederholungen gewartet werden

char commandOn[] = "POWER=ON";    //Was ueber RS232 gesendet wird, sobald Pin <Relais> geschlossen wird

char commandOff[] = "POWER=OFF";    //Was ueber RS232 gesendet wird, sobald Pin <Relais> geoeffnet wird
//Bis hier anpassen



void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(baudRate);
  mySerial.begin(baudRate);
  
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Good morning!");

  //PinMode
  pinMode(pinRelais, INPUT_PULLUP);
  pinMode(pinManuell_On, INPUT_PULLUP);
  pinMode(pinManuell_Off, INPUT_PULLUP);
}

void loop() {
  //Hat sich etwas veraendert?
  if(!lastState && digitalRead(pinRelais) == LOW){ //Voher aus, nun an
    lastState = true;
    sendCommand(commandOn, sizeof(commandOn));
  }else if(lastState && digitalRead(pinRelais) == HIGH){ //Voher an, nun aus
    lastState = false;
    sendCommand(commandOff, sizeof(commandOff));
  }


  if(!manuallyState &&  digitalRead(pinManuell_On) == LOW){
    manuallyState = true;
    sendCommand(commandOn, sizeof(commandOn));
  }else if(!manuallyState &&  digitalRead(pinManuell_Off) == LOW){
    manuallyState = true;
    sendCommand(commandOff, sizeof(commandOff));
  }else if(digitalRead(pinManuell_On) == HIGH &&  digitalRead(pinManuell_Off) == HIGH){
    manuallyState = false;
  }


  //Kommunikation zwischen Serial Pc und Serial Beamer
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

//Send command to mySerial
void sendCommand(char command[], int command_size){
  for(int j=0; j<repeate; j++){
    for (int i=0; i < command_size-1; i++){
      Serial.println((int)command[i],HEX); //Char zu Int konventiere (ASCII) und dann als HEX ausgeben
      mySerial.print((int)command[i],HEX); //Char zu Int konventiere (ASCII) und dann als HEX ausgeben
    }
    
    mySerial.print("0D");  
    Serial.println("0D");  

  // Notfallweise auskommentieren CR  
  //  mySerial.print(13, HEX);  
 //   Serial.println(13, HEX);  

     
    delay(sleep);
  }

}

Ich bin froh um jede Antwort!

Danke schon im Voraus!

noch ins HEX umzuwandeln,

HEX ist nur eine Form der Präsentation.
Hauptsächlich für Menschen.

Grundsätzlich sind Computer Daten immer binär.

Also musst du unterscheiden, zwischen Daten und Präsentation.

Meiner Meinung nach muss ich "504F5745523D4F4E0D" (HEX) zum Einschalten senden

Leider kann ich daran nicht erkennen, was das Gerät sich wünscht.

Was du da zeigst ist eine Sammlung ASCII codierter Hexadezimal zahlen.
Zumindest sieht es so aus.
In Wirklichkeit:
ASCII codierte Hexadezmalzahlen welche eine Repräsentation einer ASCII Zeichenkette ist.
Doppelt gemoppelter Unsinn.

Mein Glaskugel sagt:
Es erwartet den String POWER=ON

Einzig das 0x0D braucht eine Extrawurst da Arduino typischer weise \r\n sendet.

Also einfach nur: mySerial.print("POWER=ON\r");
Und fertig!

Danke dir viel mal für deine schnelle Antwort!

Der Beamer hat mit dieser Code Zeile Eingeschaltet

 mySerial.print("POWER=ON\r");

Das Problem liegt jetzt beim Ausschalten, da dieser Beamer 2 Stop bit brucht...
Die baudRate ist 19200 und auch so eingestellt aber wie definiere ich die Stop bit's?

Hallo,

wie in der Beschreibung zu Serial angeben?
https://www.arduino.cc/en/serial/begin

Serial.begin(19200,SERIAL_8N2);

Gruß aus Berlin
Michael

Bei SoftwareSerial musst Du wohl eine andere Lib nehmen, HardwareSerial kann das in Serial.begin.

Gruß Tommy

Komisch daß das Protokoll für's Einschalten anders ist als fürs Ausschalten.
Bist Du sicher daß Du das mit den stopbits richtig verstanden hast?
Grüße Uwe

@combie
Hut ab - obwohl ich auch durchaus schon manchen Abend mit ASCII und Deren HEX-Code zu tun hatte, wäre mir Das So nicht aufgefallen.

Geiles Volk hier :slight_smile:

Danke für die Blumen!

Übrigens:
Mein zweiter Vorname ist RS232C.
:o

Manchmal hat man mich auch V24 gerufen.
z.B: "Bringe das Gerät mal zu unserem V24, der macht das schon an deine mv8000 dran!"
Natürlich auch RS485 und RS422 ...

Also, so eine große Leistung war das jetzt nicht....
Aber dennoch: Meinen Dank für die Belobigung.

Am Rande:
Die 2 Stoppbits erleichtern dem Empfänger die Synchronisation.

combie:
Am Rande:
Die 2 Stoppbits erleichtern dem Empfänger die Synchronisation.

Das will ich ger nicht bestreiten;
Mich wundert es nur daß der Einschaltbefehl ein anderes Protokoll hat als der Einschaltbefehl. Ausschaltbefehl.

Grüße Uwe

Ich vermute, dass der Einschaltbefehl auch mit 1 Stopbit erkannt wird, ebenso wahrscheinlich der Ausschaltbefehl mit

mySerial.print("POWER=OFF\r");

Es ist halt (lt. TO) mit 2 Stopbits definiert. Wenn es mir einem Stopbit funktioniert, ist es gut, der Rest für die Stopbitumstellung wurde schon genannt.

Gruß Tommy

danke euch allen für die mithilfe!

Hab jetzt den code ein wenig angepasst

das mit dem Umstellen Auf 2 Bit hat noch nicht funktioniert da es ein Problem mit dieser genannten Libery gibt...

Der Beamer läst sich mit 1 stop bit wie auch mit 2 stop bit Einschalten, aussachlten aber nur mir 2 bit

gibt es noch einen Anderen Weg für die 2 bit lösung

Hier noch der neue Code:

/*
  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo and Micro support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 */
#include <SoftwareSerial.h>
//#include <CustomSoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX

boolean lastState = false;
boolean manuallyState = false;

//Ab hier anpassen
long baudRate = 19200;    //BaudRate Serial-Kommunikation RS232 und PC

int pinRelais = 2;       //Pin fuer Relais
int pinManuell_On = 3;   //Pin fuer manueller Schalter <ON>
int pinManuell_Off = 4;  //Pin fuer manueller Schalter <OFF>
int repeate = 1;         //Wie viel mal soll das Kommando gesendet werden
long sleep = 1100;        //Wie lange soll zwischen den Wiederholungen gewartet werden

char commandOn[] = "POWER=ON\r";    //Was ueber RS232 gesendet wird, sobald Pin <Relais> geschlossen wird

char commandOff[] = "POWER=OFF\r";    //Was ueber RS232 gesendet wird, sobald Pin <Relais> geoeffnet wird
//Bis hier anpassen



void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(baudRate);
  mySerial.begin(baudRate);
  
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  Serial.println("Good morning!");

  //PinMode
  pinMode(pinRelais, INPUT_PULLUP);
  pinMode(pinManuell_On, INPUT_PULLUP);
  pinMode(pinManuell_Off, INPUT_PULLUP);
}

void loop() {
  //Hat sich etwas veraendert?
  if(!lastState && digitalRead(pinRelais) == LOW){ //Voher aus, nun an
    lastState = true;
    sendCommand(commandOn, sizeof(commandOn));
  }else if(lastState && digitalRead(pinRelais) == HIGH){ //Voher an, nun aus
    lastState = false;
    sendCommand(commandOff, sizeof(commandOff));
  }


  if(!manuallyState &&  digitalRead(pinManuell_On) == LOW){
    manuallyState = true;
    sendCommand(commandOn, sizeof(commandOn));
  }else if(!manuallyState &&  digitalRead(pinManuell_Off) == LOW){
    manuallyState = true;
    sendCommand(commandOff, sizeof(commandOff));
  }else if(digitalRead(pinManuell_On) == HIGH &&  digitalRead(pinManuell_Off) == HIGH){
    manuallyState = false;
  }


  //Kommunikation zwischen Serial Pc und Serial Beamer
  if (mySerial.available()) {
    Serial.write(mySerial.read());
  }
  if (Serial.available()) {
    mySerial.write(Serial.read());
  }
}

//Send command to mySerial
void sendCommand(char command[], int command_size){
  for(int j=0; j<repeate; j++){
       
    mySerial.print(command);  
    Serial.println(command);  

  // Notfallweise auskommentieren CR  
  //  mySerial.print(13, HEX);  
 //   Serial.println(13, HEX);  

     
    delay(sleep);
  }

}

aber jetzt komme ich nicht mer weiter...

Weil es ein Problem mit der Lib gibt" ist ja auch eine völlig untaugliche Fehlerbeschreibung. Was sollen wir (außer den Kopf zu schütteln) damit anfangen?

Gruß Tommy