Serielle Schnittstelle (RS-485 Device) abfragen

raysprak hat gesagt.:
Aber ausgabe bleibt "0 Bytes gelesen, aber 1 Byte erwartet".
Zumindest ist das schon mal ein Unterschied zum letzten Posting, denn da wurde wenigstens 1 Byte (wenn auch mit dem Wert 0) gelesen. Das bedeutet, das mein letzter Änderungsvorschlag wohl eher was verschlimmbessert hat.

Der von dir angegebene Link zielt, glaube ich, mehr in Richtung Microntrollerprogrammierung, ist also wahrscheinlich für ein PC-Programm nicht so hilfreich.

Du müsstest dir folgende Infos beschaffen:
1. Die Parameter der Schnittstelle (Baudrate, Parität usw.), wobei ich denke, das die schon soweit passen.
2. Den Kommunikationsablauf mit dem Gerät. Ich kann mir nicht vorstellen, das eine einfache Leseschleife ausreicht. Man wird wahrscheinlich erst was senden müssen (Initialisierung oder Sendeaufforderung?) um das Gerät dazu zu bewegen, was über die serielle Schnittstelle auszugeben. Dann muss man wahrscheinlich auch (wie ich schon geschrieben hatte) ein bestimmtes Protokoll beachten.

Gruß
MCoder
 
Hallo MCoder!
Nochmals vielen dank, dass Du mich so intensiv verarztet hast, oder es versucht hast.
Ich habe gestern den Hersteller des Gerätes angeschrieben.
Dieser hat mir gesagt, dass das Gerät über eine SSI-Schnittstelle läuft.
Um dieses Gerät auszulesen, muss man an der Schnittstelle einen RS-232 Bus simulieren/emulieren und erst wenn das geschehen ist, kann man Werte von dem Gerät auslesen.
Der Hersteller riet mir, dass die Firma einen Schnittstellenkonverter kauft, durch den das dann relativ einfach laufen soll.
Ich warte nun auf die Entscheidung vom Chef, ob wir das Ding kaufen.
Falls Du noch ne Idee hast, ich bin für alles offen.
Trotz allem nochmals vielen Dank!
Viele Grüße
raysprak
 
Hallo MCoder!
Du hattest recht, mit der auslesen Geschichte....man muss zuerst etwas hinschicken und bekommt etwas zurück.
Mein Problem ist nun, dass ich nur 1 Byte zurückbekomme, obwohl ich mindestens2 zurückbekommen müsste....
Kannste weiterhelfen?
Gruß
 
Also:
Source Code:
#include <windows.h>
#include <stdio.h>


int main(int argc,char** argv)
{
DCB dcb;
COMMTIMEOUTS CTO;
COMMCONFIG CC;


ZeroMemory (&dcb, sizeof(dcb));



HANDLE hFile = NULL;
hFile = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,NULL);

if(hFile == NULL)
{
MessageBox(0,"Error CreateFile","Test",MB_OK);
}

if(!GetCommState(hFile, &dcb))
{
MessageBox(0,"Error GetCommState","Test",MB_OK);
}


dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = CBR_19200;
dcb.ByteSize = (BYTE)8;
dcb.StopBits = (BYTE)2;
dcb.fBinary = TRUE;
dcb.fParity = FALSE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fDsrSensitivity = FALSE;
dcb.fTXContinueOnXoff = TRUE;
dcb.fOutX = FALSE;
dcb.fInX = FALSE;
dcb.fErrorChar = FALSE;
dcb.fNull = FALSE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.wReserved = 0;

CTO.ReadIntervalTimeout = 500;
CTO.ReadTotalTimeoutConstant = 500;
CTO.ReadTotalTimeoutMultiplier = 500;
CTO.WriteTotalTimeoutConstant = 500;
CTO.WriteTotalTimeoutMultiplier = 500;

if(!SetCommTimeouts(hFile,&CTO))
{
MessageBox(0,"Error CommTimeouts","Test",MB_OK);
}

if(!SetCommState(hFile,&dcb))
{
DWORD error = GetLastError();
char cerr[64];
char cerr2[16];
itoa((int)error,cerr2,10);
strcpy(cerr,"Error SetCommState: ");
strcat(cerr,cerr2);
MessageBox(0,cerr,"Test",MB_OK);
}


if(!SetDefaultCommConfig("COM1",&CC,sizeof(CC)))
{
MessageBox(0,"Error SetDefaultCommConfig","Test",MB_OK);
}
if(hFile == INVALID_HANDLE_VALUE)
MessageBox(0, "Fehler 1", "", 0);

char helper[6];
// sprintf(helper,"%c%d%c%c%c",27,1,80,13,10);

strcpy(helper,"\27");
strcat(helper,"\3F8");
strcat(helper,"V");
strcat(helper,"\13");
strcat(helper,"\10");

int written;

WriteFile(hFile,&helper,strlen(helper),(LPDWORD)&written,NULL);


DWORD dlength = 0;
char sBuffer[1024];

do
{
ReadFile(hFile,&sBuffer,25,&dlength,NULL);
printf("%s %d\n",sBuffer,dlength);
}
while(dlength);


char c;
scanf("%c",&c);

return 0;
}


Ausgabe:
1
0
0
0
0
0
0
0
0
usw.
 
Hallo,

wenn ich deinen Code richtig interpretiere, schickst du einen 6 Byte großen Initialisierungs- oder Anforderungsblock zum Gerät und erwartest 25 Byte zurück? Ist dieser Block immer gleich bzw. weißt du was die einzelnen Bytes bedeuten?
Gibt es nicht irgendwelche weiteren Vorgaben für den Datenaustausch? Also z.B. welche Bytes denn den Anfang oder das Ende eines Datenblocks kennzeichnen?
Formal scheint dein Code schon richtig zu sein. Ich kann aber schlecht einschätzen, ob der Ablauf ok ist, wenn ich nicht die Protokollvorgaben kenne.

Gruß
MCoder
 
Die Zahlen in der Ausgabe sind die Anzahlen der gelesenen Bytes.
Es sendet also 1 Byte und dann nichts mehr.
Wenn ich das gelesene Byte als Zahl ausgebe, steht dort
1243580,
wenn ich als char ausgebe, steht da gar nischt.
Hier die Werte-/Kommandotabelle zu dem Ding
 

Anhänge

  • Datenblatt.JPG
    Datenblatt.JPG
    121,7 KB · Aufrufe: 185
Zurück