
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:
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.
Erbitte dringend Hlfe !
Vielen Dank & Grüße
Joe
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: