Möchte eine Laborwaage mit RS232-Schnittstelle mit einem Arduino Uno verbinden und in weiterer Folge die gewogenen Messwerte auswerten.
Laut Beschreibung werden 14 Byte für die Datenübertragung eines Messwertes verwendet.
Leider habe ich meine Waage noch nicht erhalten. Ist es möglich, so einen Datentransfer zwischen Waage und Arduino zu simulieren? Soweit ich jetzt aber nachgelesen habe geht das mit Hex-Werten aber nicht über den Seriellen Monitor.
Vielleicht kann mir hier ja jemand eine kleine Hilfestellung geben wie ich hier vorzugehen habe.
patrickk83:
Leider habe ich meine Waage noch nicht erhalten. Ist es möglich, so einen Datentransfer zwischen Waage und Arduino zu simulieren?
Vielleicht kann mir hier ja jemand eine kleine Hilfestellung geben wie ich hier vorzugehen habe.
Mit einem zweiten Arduino ist das kein Problem. Du musst auf diesem lediglich die serielle Schnittstelle entsprechend der Schnittstelle der Waage konfigurieren. Wie Du dann Werte beliebiger Art darüber schickst, weiß ich nicht. Aber es gibt hier im Forum jemanden, der seinen Messschieber mit einem Arduino ausgelesen hat (AFAIR doc arduino). Wenn er wach ist, meldet er sich vermutlich eh.
Gruß
Gregor
PS: Ich würde wohl warten, bis die Waage vor mir liegt. In der Praxis sind die Dinge manchmal nicht ganz genau so wie in einem Datenblatt. Das Leben kann manchmal echt beschissen sein.
Habe leider nur einen Arduino hier rumliegen...
Hab auf einem Blog ein paar Beispiele gefunden, mit denen zwischen der IDE Processing und dem Arduino kommuniziert wird. Werde damit mal mein Glück versuchen.
patrickk83:
Möchte eine Laborwaage mit RS232-Schnittstelle mit einem Arduino Uno verbinden und in weiterer Folge die gewogenen Messwerte auswerten.
Denke daran, dass der Arduino für RS232 einen Konverter braucht. Der Arduino hat TTL-Seriel, was zwar im Datenprotokoll gleich RS232 ist, aber RS232 arbeitet mit anderen Spannungspegeln (nagtive, bis 15V), die sogar den UNO beschädigen können. Deshalb braucht man einen Konverter z.B. auf MAX232-Basis. Nicht dass du die Waage zwar da hast, aber trotzdem nichts mit ihr anfangen kannst, da du sie nicht mit dem Uno verbinden kannst.
Wenn du nach MAX232 googlest, dann findest du eine Menge Angebote, wo du dir das passende aussuchen kannst.
Dein Projekt ist allerdings ein Mega oder Leonardo besser als der UNO geeignet. Beim UNO ist die Hardware-Seriell-Schnittstelle durch den USB-Port blockiert. Man braucht dann Software-Seriell, was etwas eingeschränkt ist. Beim Leonardo ist USB und Seriell getrennt, der Mega hat mehrere serielle Schnittstellen.
const byte anzBytes = 14;
char empfBytes[anzBytes];
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
Serial.println("<Arduino ready>");
}
void loop() {
// put your main code here, to run repeatedly:
while (Serial.available() > 0)
{
for (int i=0; i<anzBytes; i++)
{
empfBytes[i] = Serial.read();
Serial.println(empfBytes[i]);
}
}
}
Im Terminal habe ich dann diese Zeichenfolge innerhalb der " " eingegeben:
" 12.345 kg\r\n"
Als Ergebnis habe ich dann dies erhalten:
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
1
2
.
3
4
5
k
g
C
L
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
ÿ
Würde gerne die empfangenen Daten mit Switch-Case auswerten...
Die Variante mit dem end-marker gefällt mir mal ganz gut. Die Waage wird in weiterer Folge mit dem Hex-Code 1B 70 zur Übertragung aufgefordert. Wenn ich das jetzt richtig verstehe, so müsste diese Variante ja genau passen da ich ohnehin keinen start-marker benötige. Bitte korrigiert mich wenn ich jetzt falsch liegen sollte.
Ich werde also diesen Code verwenden:
const byte numChars = 14;
char receivedChars[numChars]; // an array to store the received data
boolean newData = false;
void setup() {
Serial.begin(9600);
}
void loop() {
recvWithEndMarker();
showNewData();
}
void recvWithEndMarker() {
static byte ndx = 0;
char endMarker = '\n';
char rc;
// if (Serial.available() > 0) {
while (Serial.available() > 0 && newData == false) {
rc = Serial.read();
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // terminate the string
ndx = 0;
newData = true;
}
}
}
void showNewData()
{
if (newData == true)
{
Serial.println(receivedChars);
newData = false;
}
}
Ich halte von der Emulation der Waage wenig da Du weder 100% das Protokoll bzw die übertragenen Daten kennst noch die Waage zur Kontrolle der Daten zu Verfügung hast. Warte auf die Waage und arbeite mir ihr.
Grüße Uwe