verzweifle an RS232

JoeA

JoeA

Jungspund
Hi,

seit einiger Zeit verzweifle ich bei dem Versuch das RS232 Messmodul (M232) von ELV unter Linux anzusprechen. Unter C bin ich allerdings auch noch nicht der Erfahrenste.
Bisher habe ich solche Sachen immer mit PowerBasic unter DOS gemacht.

Vielleicht kennt ja jemand das Messmodul und kann mir ein Beispiel zukommen lassen.

Folgendes steht in der Anleitung zum M232:
Die Datenübertragung zwichen dem PC und dem M232-Messmodul erfolgt mit einer Datenrate von 2400 Baud, einem Stoppbit und ohne Parität.
Vom PC aus wird die Datenübertragung gesteuert, indem der PC einen Befehl an das Messmodul sendet, das daraufhin eine Antwort zurückgibt.
Ein Befehl begint immer mit dem SOH-Zeichen (ASCII 1), die denAnfang eines Befehls darstellen und endet mit einem CR-Zeichen (ASCII 13), woraufhin das Modul den Befehl auswertet.
Jeder Befehl wird vom Messmodul mit einem "ACK" (ASCII 6) bestätigt oder durch ein "NAK" (ASCII 21) wird angezeigt, dass der Befehl nicht erkannt wurde.

Mein Testprogramm sieht wie folgt aus:
Teile des Codes habe ich einem Beispiel für ein Terminalprogramm entnommen.
Das Modul braucht lt. Anleitung 100ms um die Werte zu lesen. Deshalb das sleep.
Irgendwie blockiert das Programm nachdem Senden der Daten und macht erst weiter wenn ich eine Taste drücke.
Seltsamerweise steht im ersten Byte der Antwort der ASCII Wert der Taste die ich drücke.

Irgendwie scheien ich auf das Keyboard anzusprechen.

Andererseits kann ich auf ttyS0 mein Multimeter mit fast den gleichen Einstellugnen abfragen.

Code:
# include <stdio.h>
# include <unistd.h>
# include <fcntl.h>
# include <termios.h>

# define TERM_DEVICE "/dev/ttyS0"       /* = COM1 */
# define TERM_SPEED B2400               /* Bit/Sek */

int main()
 {
  printf("start...\n");
  int fd, old_flags;
  ssize_t length;
  char buffer[16];
  struct termios term_attr;
  fd_set input_fdset;
  printf("versuche zu oeffen...\n");

// pruefen existenz schnittstelle
  if (fd = open(TERM_DEVICE, O_RDWR) == -1)
   {
    perror("terminal: Can't open device " TERM_DEVICE);
    return(1);
   }
  printf("geoeffnet...\n");
//-----------------------------------------------------
  printf("portpruefung ueberstanden...\n");
                        /* RS232 konfigurieren */
  if (tcgetattr(fd, &term_attr) != 0)
   {
    perror("terminal: tcgetattr() failed");
    return(1);
   }


  printf("attribute gelesen...\n");

  term_attr.c_cflag = TERM_SPEED | CS8 | CREAD;
  term_attr.c_iflag = 0;
  term_attr.c_oflag = 0;
  term_attr.c_lflag = 0;
  if (tcsetattr(fd, TCSAFLUSH, &term_attr) != 0)
  {
      perror("terminal: tcsetattr() failed");
  }
  printf("attribute gesetzt...\n");
  buffer[0]=0x01;
  buffer[1]=0x62; //61
  buffer[2]=0x31;
  buffer[3]=0x0D;
  printf("%d",write(fd,buffer,4));
  printf("-geschrieben...\n");
  sleep(1L);
  printf("%d",read(fd,buffer,3));
  printf("-gelesen...\n");
  printf("<%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d|%d>\n",buffer[0],buffer[1],
           buffer[2],buffer[3],buffer[4],buffer[5],buffer[6],buffer[7],buffer[8],buffer[9],buffer[10],
           buffer[11],buffer[12],buffer[13],buffer[14],buffer[15]);
  printf("<%c|%c|%c|%c|%c|%c|%c|%c|%c|%c|%c|%c|%c|%c|%c|%c>\n",buffer[0],buffer[1],
           buffer[2],buffer[3],buffer[4],buffer[5],buffer[6],buffer[7],buffer[8],buffer[9],buffer[10],
           buffer[11],buffer[12],buffer[13],buffer[14],buffer[15]);

  close(fd);
  return(0);
 }


Erbitte dringend Hlfe !

Vielen Dank & Grüße
Joe
 
Zuletzt bearbeitet:
... immer noch keine Antwort ?

Wenn meine Frage zu bescheuert ist seit schonungslos !
Sagt's mir ins Gesicht. Nur so kann ich's lernen.

Oder sagt mir wenigstens das ihrs auch nicht wißt - aber BITTE sagt irgendwas.

Viele Grüße

Joe
 
Ne die Frage iss net bescheuert - mir iss sie nur zu hoch :)
 
Ich denke mal, das wenn keiner Antwortet, es keiner weis...

Ich kann dir leider auch nicht helfen :-(
sorry...
 
Es könnte mit dem sleep zusammenhängen.
Es scheint mir zu kurz. Hast Du es mal länger eingestellt?
(Habe den Quellcode blos mal kurz überflogen, aber wenn Dein Multimeter geht, scheint es nur an Parametern zu liegen, nicht am Programm selbst)
 
Hallo,

hats du zwischendurch schon eine Lösung gefunden?
Ich habe mir das Messmodul auch kürzlich zugelegt zwecks Langzeitmessungen.
Meine c-Kenntnisse sind nicht so überragen, eher würde ich es in Perl probieren.
Damit wird der oll 386er , der als Datensammler abgestellt werden soll, aber überlastet sein. Also brauche ich auch eine C-Lösung.
Allzuviel Infos scheint es allerdings nicht zu geben, zumindest Google ist recht einsilbig.
Dein Proggie bringt bei mir den selben Effekt, wie von dir beschrieben.
Wäre Klasse, wenn du schon was rausgefunden hast.
 
Hi,

ne, bin leider noch nicht weiter.
Hab das ganze mal auf Eis gelegt, da ich im Moment dafür eh keine Zeit habe.

Ich will mir aber demnächst eh mal eine IO-Karte kaufen, da die irgendwe immer teurer werden und ich im nächsten Rechner wohl gar keine mehr haben werde.

Dann werde ich es mal an COM2 versuchen.

Ich denke es hängt wohl auch von der Art des angeschlossenen Gerätes ab.

Bei mir soll später ein alter P160 die Blumen gießen, wenn der Feuchtesensor am AD-Wandler sagt es wäre soweit. Blumenzustandsbericht hab ich dann per Internet :)
Um ehrlich zu sein, die Sensoren habe ich seit 4 Jahren und fange jedes Jahr 3 Monate vor dem Urlaub an zu Probieren.

Grüße
Joe
 
Hast du viellciht noch irgendwelche Quellen im Netz gefunden, wo man ein paar Infos herbekommt? Google schweigt sich aus und dein Eintrag hier war das einzig verwertbare, was ich gefunden habe.
Die mitgelieferte DOS-Software funzt bei mir auch nicht, das mag aber auch am win200 in VMware liegen.
Ich mache mich mal auf die Suche nach 'er DOS-Bootdiskette und versuchs noch mal..
 
Hi,

also das Demoprogramm unter DOS funzt bei mir.

Ich finde leider auch nichts in Google, ich weis nur das ich irgendwann mal irgendwo den Tip gelesen habe COM1/ttys0 nicht zu verwenden weil es zu Problemen mit dem Keyboard kommen kann.

Und genau das ist ja auch das Problem bei mir. Nur leider weis ich nicht mehr wo ich das gelesen habe.

Ich denke ich habe irgend einen Falschen Parameter. Das seltsame ist halt, dass ich wenn ich das M232 nicht angeschlossen habe, auch einen entsprechenden Fehler bekomme.

Grüße
Joe
 
Hi,

hey das ist aber ein geiles Projekt !

sobald ich mehr Zeit habe werde ich mal versuchen ob ich mir das was abgucken kann.
Und wenn nicht, so könnte ich zumindest mal das Thermometer nachbauen...

Danke dafür !

@pummel:
Frage: Hast Du das M232 an einem 25 Poligen Anschluss ?
Ich habe leider nur noch einen 9er am Rechner, und daher das Gerät per Adapter angeschlossen.

Grüße
Joe
 
Ist wohl im A...

Ich werde das Teil wohl zurückschicken. Alle IO-Ports sind komplette auf 0Volt (sollt High im Ruhezustand sein), auch die +5 und -7 Ports führen keine Spannung. Das kann ich wohl versuchen das Ding anzusprechen, wie ich will.

Die Belegung meines 9 - 25 Kabel ist aber Ok, das habe ich gecheckt.
 
Hallo alle zusammen,

ich habe das Teil mit Perl laufen.
Das folgende Programm setzt Tastaureingaben in Befehle um und gibt die Ausgaben auf den BS. Einfach starten und dei Befehle links in der ersten Spalte der Bedienungsanleitung Seite 12/13 eingeben .
Mist, Zeilenumbrueche sind hier leider schiefgegangen.

Hast Du auch Betriebsspannung an die Buchse an der Seite gelegt? Ohne geht nichts. Im Zweifel kann ich auch mit Schaltplan helfen.

Gruss Matth

#!/usr/bin/perl -w
use English;
use IO::Handle; #needed for autoflush
use strict;
my ($answer,$command,$einnr,$lfd);

use constant SOH => chr 1; #first character to send
use constant ACK => chr 6; #last character to receive for OK
use constant CR => chr 13;
use constant NAK => chr 21; #answer for command unknown

sub schreibe{
my $command = $_[0];
print BOX SOH,"$command",CR; #send to M232
};

system "stty 2400 -cstopb raw -echo < /dev/ttyS5\n"; #set port to 2400,8,N,1 no conversions
open(BOX, "+</dev/ttyS5") or die "can't connect to >/dev/ttyS5 $!";

BOX->autoflush(1); #write everything immediate out
STDOUT->autoflush(1); # " " " "

while(1){
$command = <STDIN>; #read command from keyboard
chop($command); #strip last character
if ($command eq "q") {goto ende} #if q goto ende
schreibe ("$command"); #send to M232

for ($lfd = 1; $lfd < 12; $lfd++) { #read max 12 characters from M232
$einnr=sysread BOX,$answer,1; #read 1 byte
if ($answer eq NAK) {print "unknown command: $command\n"; goto endfor} #error
if ($answer eq ACK) {goto endfor} #ACK is endchar of record from M232
print STDOUT "$answer"; #print answer on the screen
}
endfor:
print STDOUT "\n";
}
ende: #label for programend
close BOX; #close channnel
print "ende\n";
 
Hi nitpilot,

schön wenn es bei dir klappt.
Ich habe das teil erst mal zurückgeschuickt und warte auf Ersatz.
Ja, die Stromversorgung habe ich angeschlossen und überprüft. Auch mein Adapterkabel habe ich überprüft. (9 -> 25). Das Teil nutzt ja echt nur 2/3/7, daran kann es also nicht liegen.
Dein kleines Perl werde ich ausprobieren, wenn ich das Gerät wiederhabe. Danke!
 
Fehler gefunden

Hallo,

die ELVler haben mir das Gerät zurückgeschickt und meinen, es geht doch prima. Hmm, bin ich zu doof?
Also in die Firma damit, alles an 25-9poligen Adaptern und Kabeln rausgekramt, was es so gab und durchprobiert. Nix. Verzeiflung.

Dann spiele ich so aus Langerweile mit der Schachtel des von ELV als Zubehör angebotetenen Universal-Netztteiles rum und werde stutzig. Polarität! Man kann durch drehen des Adapterstecker die Polarität vertauschen! Ja und - promt klappt es!!!


Je, je, je. Soviel Aufregung wegen ein klein wenig Verwirrung. Künftig werde ich auch bei einem Steckernetzteil die Anleitung lesen ......
 
Als Mikrocontrollerboard benutzen

Zuerst mal: besorg die Profilab für Windows, da ist alles sehr gut einstell und testbar.

@µC
Was denkt ihr darüber den AT89C2051 auszutauschen und die Platine direkt als µC zu nutzen , wäre preislich unschlagbar!! 25EUR und 6 Analog,8 Digital und Zähler! die AT89Cxx51 chips sind billig und überall zu bekommen!!
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Verschlüsseltes Backup-Script mit rsync

Samba 4 Schema erweitern per LDIF - Server is unwilling to perform (53)

Prozesskommunikation mit PIPES - wie funktioniert das?

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Zurück
Oben