Forum: PC-Programmierung String editieren und per Ethernet senden mit der NSLU2 und OpenWRT


von Marque (Gast)


Lesenswert?

Hallo,

ich bin sehr neu auf dem Gebiet Linux und OpenWRT Backfire.

Dennoch möchte ich folgendes realisieren:
Ein USB-ACM-Device ist an der NSLU2 angeschlossen und habe mit
1
stty -F /dev/ttyACM0 raw speed 9600
die Baudrate eingestellt.
Dieses USB-Device sendet nach einiger Zeit einige Bytes (HEX) als 
String.
Ein String könnte "AABBCCDDEEFF" sein.
Mit dem Befehl
1
cat /dev/ttyACM0
habe ich bereits überprüft, ob das USB-Device überhaupt arbeitet.
Bis hierhin alles bestens.

Allerdings möchte ich nun den String "AABBCCDDEEFF" zerlegen und einen 
neuen String daraus erstellen: "BBEE".
Dieser neu erstellte String soll per Ethernet (TCP) an einen Rechner an 
Port 2222 geschickt werden.

Am besten wäre ein kleines Script in der Shell, aber ich habe schon 
einige Beiträge gelesen, dass man dafür Bash benutzen muss.

Hat jemand einen Tipp für mich, wie ich das Vorhaben realisieren könnte?

Danke,
Marque

von Klaus W. (mfgkw)


Lesenswert?

Marque schrieb:
> Allerdings möchte ich nun den String "AABBCCDDEEFF" zerlegen und einen
> neuen String daraus erstellen: "BBEE".

Nach welchen Regeln? Einfach die 3.+4.+9.+10. Stellle extrahieren?

Hast du auf deinem Rechner sed oder awk?


> Dieser neu erstellte String soll per Ethernet (TCP) an einen Rechner an
> Port 2222 geschickt werden.

Hast du auf deinem Rechner netcat?

von Marque (Gast)


Lesenswert?

Hallo,

die Stringzerlegung habe ich nun mit Perl hinbekommen.
Perl kannte ich bis gestern "nur vom hören", aber in diese Sprache (wohl 
eher Slang) kann man sich echt schnell reinarbeiten!
Den neu zusammengewürfelten String habe ich mittels Perl-Modul 
IO::Socket::INET an den anderen Rechner schicken können.
Mit "zusammengewürfelt" meine ich in diesem Fall einen fest von Hand 
erstellten String!
Denn: Ich habe nun ein paar Probleme mit dem Einlesen der seriellen 
Daten, die vom USB-Device kommen:
Ich kann partout das Perl-Modul Device::SerialPort nicht installieren.
Die Forenbeiträge zu diesem Modul lesen sich sehr vielversprechend, aber 
es will einfach nicht.
Weder das *.ipk für OpenWRT noch für NSLU2 lassen sich installieren.

Ich habe eine NSLU2, auf der OpenWRT Backfire (sollte Big Endian sein) 
läuft.
Mit dem neu erstellen des Moduls habe ich Probleme, jedenfalls besitze 
ich keinen Linux-Rechner und habe noch nie etwas mit dem Crosscompiler 
zu tun gehabt. Denn anscheinend benutzt Device::SerialPort termios.h, 
das wohl angepasst werden muss.
SerialPort.pm habe ich per Hand in die NSLU2 kopiert (im richtigen 
Verzeichnis), auch ohne Erfolg.

Gibt es einen anderen Weg den SerialPort über die Systembefehle direkt 
in Perl einzulesen? Dann brauche ich gar kein Device::SerialPort von 
CPAN.

Das USB-Device spricht mit 9600,8N1 und... ich habe es in meinem 
Anfangspost vergessen, jeder komplette String vom USB-Device wird mit 
\r\n abgeschlossen.

In meinem Perl-Skript verwende ich folgenden Code:
1
while(1)
2
{
3
4
 my($count,$string) = $port->read(255);
5
 if($count > 0)
6
 {
7
8
  #split lines
9
  @rows=split(/\r\n/,$string);
10
  #reset buffer
11
  #$string="";
12
13
  foreach(@rows) {
14
15
usw...

Kann man diesen auf systemeigene Funktionen für die serielle 
Schnittstelle umbiegen?

Gruß,
Marque

von Peter II (Gast)


Lesenswert?

du kannst einfach das device uslesen

open(FH, "< /dev/ttyACM0" );

read( FH, $s, 1);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.