Jetzt möchte ich mal zeigen wie man sich mit dem AutoMower unterhalten kann.
Der AutoMower hat ja eine Diagschnittstelle. Das ist eine RS232 aber mit 3.3 Volt. Den Schaltplan für den Pegelwandler findet man Hier: https://www.roboternetz.de/phpBB2/vi...?p=97409#97409

Es geht aber auch anders. Die FM-Transceiver-Modul (RT868F4) von www.robotikhardware.de arbeiten ebenfalls mit 3.3 Volt. Es spricht nichts gegen eine direkten Anschluss. Auf der PC-Seit benutze ich das gleiche Transceiver-Modul auf der RN-Funk Platine.

Das Protokoll des AutoMower ist:
Anfrage an den AM:
----------------------------
Byte 1: 0F Hex ; ist immer so.
Byte 2 und 3: die Adresse der AM-Variable.
Byte 4 und 5: sind normalerweise 0, bei einigen StringVariablen als Index.
----------------------------
Der AM antwortet dann:
Byte 1: 0F Hex
Byte 2 und 3: die angefragte Adresse.
Byte 4 und 5: Die gelesenen Daten.
----------------------------

Hier mal ein Beispiel:
-----------------------------------
Connected to "Kommunikationsanschluss (COM1)"
Request: 18.05.2006 10:52:04.46664
0F 46 50 00 00 .FP..
Answer: 18.05.2006 10:52:04.48264 (+0.0156 seconds)
0F 46 50 E8 03 .FPè.
Request: 18.05.2006 10:52:04.48264 (+0.0000 seconds)
0F 46 52 00 00 .FR..
Answer: 18.05.2006 10:52:04.49764 (+0.0156 seconds)
0F 46 52 29 5C .FR)\
Request: 18.05.2006 10:52:04.49764 (+0.0000 seconds)
0F 46 54 00 00 .FT..
Answer: 18.05.2006 10:52:04.51364 (+0.0000 seconds)
0F 46 54 00 00 .FT..
Request: 18.05.2006 10:52:04.51364 (+0.0000 seconds)
0F 46 56 00 00 .FV..
Answer: 18.05.2006 10:52:04.52964 (+0.0156 seconds)
0F 46 56 0B 00 .FV..
Request: 18.05.2006 10:52:04.52964 (+0.0000 seconds)
0F 46 58 00 00 .FX..
Answer: 18.05.2006 10:52:04.54464 (+0.0156 seconds)
0F 46 58 E1 10 .FXá.
-----------------------------------

Mein Test-Programm in Visual-Basic
Code:
Option Explicit

Dim a, b, dtr, rts, LogNum, PrStat, iEingabe As Integer
Dim iFileNumber As Integer
Dim sPath As String

Private Sub Ch_Bat_Click()
If Ch_Bat.Value Then
    Bat_I.BackColor = vbWhite
    Bat_U.BackColor = vbWhite
Else
    Bat_I.BackColor = &H8000000F
    Bat_U.BackColor = &H8000000F
End If
End Sub

Private Sub Ch_Cutt_Click()
If Ch_Cutt.Value Then
    Cutt_Sp.BackColor = vbWhite
    Cutt_I.BackColor = vbWhite
Else
    Cutt_Sp.BackColor = &H8000000F
    Cutt_I.BackColor = &H8000000F
End If
End Sub

Private Sub Ch_Logfile_Click()
If Ch_Logfile.Value Then
    Ch_Logfile.ForeColor = vbRed
    LogNum = LogNum + 1
    sPath = App.path & "\" & "Log_" & Trim(Str(LogNum)) & ".txt"
    Open sPath For Output As #iFileNumber
'    Print #iFileNumber,
'    Print #iFileNumber, "Text1.Text"
Else
    Ch_Logfile.ForeColor = vbBlack
    Close #iFileNumber
End If
End Sub

Private Sub Ch_Motor_Click()
If Ch_Motor.Value Then
    Mot_Li.BackColor = vbWhite
    Mot_Re.BackColor = vbWhite
Else
    Mot_Li.BackColor = &H8000000F
    Mot_Re.BackColor = &H8000000F
End If
End Sub

Private Sub Ch_Protokoll_Click()
If Ch_Protokoll.Value Then
    Log_Dez.BackColor = vbWhite
    Log_Hex.BackColor = vbWhite
Else
    Log_Dez.BackColor = &H8000000F
    Log_Hex.BackColor = &H8000000F
End If
' Debug.Print "bLog:="; bLog
End Sub

Private Sub Ch_Start_Click()
Timer1.Interval = 5000
If Ch_Start.Value Then
    Ch_Start.ForeColor = vbRed
    Ch_Start.Caption = "Stop"
    Timer1.Enabled = True
Else
    Ch_Start.ForeColor = vbBlack
    Ch_Start.Caption = "Start"
    Timer1.Enabled = False
End If
End Sub

Private Sub Ch_Uhr_Click()
If Ch_Uhr.Value Then
    Ch_Uhr.ForeColor = vbRed
    Ch_Uhr.Caption = "Uhr Stop"
Else
    Ch_Uhr.Caption = "Uhr Start"
    Ch_Uhr.ForeColor = vbBlack
End If
End Sub

Private Sub Eingabe_Click()
   iEingabe = Val(Eingabe.Text)
    Form1.Eingabe.Visible = True         'Antwortfeld anzeigen
    Form1.Eingabe.SetFocus          'Cursor ins Textfeld setzen
    Me.KeyPreview = True
End Sub

Private Sub Lehrmachen_Click()
    Log_Dez.Text = ""
    Log_Hex.Text = ""
End Sub

Private Sub Cmd_ComSetup_Click()
    Load Form2
    Form2.Show
End Sub

Private Sub Form_Load()

    ' Einstellungen aus der Datei laden
    Me.Left = GetPrivateProfileInt("Fenster", "linkerRand", 200, App.path & "\" & "optionen.ini")
    Me.Top = GetPrivateProfileInt("Fenster", "obererRand", 100, App.path & "\" & "optionen.ini")
    LogNum = GetPrivateProfileInt("Log", "LogNum", 0, App.path & "\" & "optionen.ini")
    a = GetPrivateProfileInt("Comm", "Settings", 9600, App.path & "\" & "optionen.ini")
    b = GetPrivateProfileInt("Comm", "PortNr", 1, App.path & "\" & "optionen.ini")
    Form2.Combo4.ListIndex = b
    rts = GetPrivateProfileInt("Comm", "RTSEnable", 1, App.path & "\" & "optionen.ini")
    dtr = GetPrivateProfileInt("Comm", "DTREnable", 1, App.path & "\" & "optionen.ini")
    
    If b <> 0 Then
If MSComm1.PortOpen = False Then     'if comport is disabled....
'    ComSetup.Caption = "COM " & b & "    " & a
    MSComm1.CommPort = b
    MSComm1.Settings = a
    MSComm1.RThreshold = 1
    MSComm1.DTREnable = dtr
    MSComm1.RTSEnable = rts
    MSComm1.PortOpen = True           ' enable it.
Form1.Cmd_ComSetup.Caption = "COM" & Trim(Str$(Form1.MSComm1.CommPort)) & ", " & Form1.MSComm1.Settings
    End If
End If
iFileNumber = FreeFile
'sPath = App.path & "\" & "LogFile.txt"
End Sub

Private Sub Form_Unload(Cancel As Integer)
    WritePrivateProfileString "Fenster", "linkerRand", Str$(Me.Left), App.path & "\" & "optionen.ini"
    WritePrivateProfileString "Fenster", "obererRand", Str$(Me.Top), App.path & "\" & "optionen.ini"
    WritePrivateProfileString "Log", "LogNum", Str$(LogNum), App.path & "\" & "optionen.ini"
'If MSComm1.PortOpen = True Then
    WritePrivateProfileString "Comm", "Settings", MSComm1.Settings, App.path & "\" & "optionen.ini"
    WritePrivateProfileString "Comm", "PortNr", Str$(MSComm1.CommPort), App.path & "\" & "optionen.ini"
    WritePrivateProfileString "Comm", "DTREnable", Str$(dtr), App.path & "\" & "optionen.ini"
    WritePrivateProfileString "Comm", "RTSEnable", Str$(rts), App.path & "\" & "optionen.ini"
    If Form1.MSComm1.PortOpen Then Form1.MSComm1.PortOpen = False
'End If
    If Ch_Logfile.Value Then Close #iFileNumber
    Unload Form2
End Sub

Private Sub Timer1_Timer()
Dim iTemp As Integer
Dim sTemp As String

If Ch_Logfile.Value Then Print #iFileNumber, Date & " " & Time();
If iEingabe > 0 Or iEingabe > 50000 Then
     If SendBefehl(iEingabe, 0, 3, iTemp) Then Ergebnis = Str$(iTemp) & " - " & Hex$(iTemp)
End If

If Ch_Uhr.Value Then
    If SendBefehl(14013, 0, 1, iTemp) Then sTemp = Right$(Str$(100 + iTemp), 2) & "."
    If SendBefehl(14009, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2) & "."
    If SendBefehl(14007, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2) & " "
    If SendBefehl(14005, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2) & ":"
    If SendBefehl(14003, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2) & ":"
    If SendBefehl(14001, 0, 1, iTemp) Then sTemp = sTemp & Right$(Str$(100 + iTemp), 2)
    Uhrzeit = sTemp
End If
If Ch_Bat.Value Then
    If SendBefehl(491, 0, 3, iTemp) Then Bat_I = Str$(iTemp)
    If SendBefehl(12020, 0, 3, iTemp) Then Bat_U = Str$(iTemp)
    If SendBefehl(12030, 0, 3, iTemp) Then Bat_U = Bat_U & " - " & Str$(iTemp)
    If SendBefehl(12000, 0, 3, iTemp) Then Bat_AH = Str$(iTemp)
    If SendBefehl(495, 0, 3, iTemp) Then Bat_AH = Bat_AH & " - " & Str$(iTemp)
    If SendBefehl(563, 0, 3, iTemp) Then Bat_Temp = Str$(iTemp)
    If SendBefehl(565, 0, 3, iTemp) Then Bat_TempL = Str$(iTemp)
End If
If Ch_Cutt.Value Then
    If SendBefehl(12010, 0, 3, iTemp) Then Cutt_Sp = Str$(iTemp)
    If SendBefehl(4750, 0, 1, iTemp) Then Cutt_I = Str$(iTemp)
    If SendBefehl(557, 0, 1, iTemp) Then Cutt_I = Cutt_I & " - " & Str$(iTemp)
End If
If Ch_Motor.Value Then
    If SendBefehl(9408, 0, 1, iTemp) Then Mot_Li = Str$(iTemp)
    If SendBefehl(410, 0, 1, iTemp) Then Mot_Li = Mot_Li & " - " & Str$(iTemp)
    If SendBefehl(9407, 0, 1, iTemp) Then Mot_Re = Str$(iTemp)
    If SendBefehl(409, 0, 1, iTemp) Then Mot_Re = Mot_Re & " - " & Str$(iTemp)
End If

If SendBefehl(497, 0, 3, iTemp) Then Status = Right$("0000" & Hex$(iTemp), 8)
If Ch_Logfile.Value Then Print #iFileNumber,

End Sub

Public Function SendBefehl(Adresse As Integer, SubAdr As Integer, typ As Byte, ByRef Daten As Integer) As Boolean
Dim i, j, n As Long
Dim dat, adr As Long
Dim sData() As Byte

SendBefehl = False
For j = 1 To 10
PrStat = 0
adr = 0
dat = 0

MSComm1.Output = Chr$(&HF) _
    & Chr$(HiByte(Adresse)) _
    & Chr$(LoByte(Adresse)) _
    & Chr$(HiByte(SubAdr)) _
    & Chr$(LoByte(SubAdr))
    
    DoEvents
    n = 0
    Do
        n = n + 1
        If n > 50000 Then
            Exit Do
        End If
 
        sData = MSComm1.Input
        For i = 0 To UBound(sData())
' Debug.Print "i:="; i; j; n; PrStat; sData(i); adr; dat
        Select Case PrStat
        Case 4
            If (typ And &H2) Then dat = Bytes2Word(sData(i), dat)
            PrStat = 5
        Case 3
            If (typ And &H1) Then dat = sData(i)
            PrStat = 4
        Case 2
            adr = (adr * CLng(256)) + sData(i)
            PrStat = 3
        Case 1
            adr = sData(i)
            PrStat = 2
        Case 0
            If sData(i) = &HF Then PrStat = 1
        Case Else
            PrStat = 0
            adr = 0
            dat = 0
        End Select
    Next i
    Loop Until PrStat = 5
    
    If adr = Adresse Then
        SendBefehl = True
        Exit For
    Else
        Beep
    End If
Next j
   
Daten = dat
' Debug.Print "n:="; n; Adresse; Daten; typ
If Ch_Protokoll.Value Then
   Log_Dez.Text = Log_Dez.Text & Str$(Adresse) & "," & Str$(Daten) & Chr(13) & Chr(10)
   Log_Hex.Text = Log_Hex.Text & Hex$(Adresse) & "," & Hex$(Daten) & Chr(13) & Chr(10)
End If
If Ch_Logfile.Value Then Print #iFileNumber, "," & Str$(Daten);

End Function
Oder, für mich noch besser, ein Testprogramm in PocketC um mit dem Pocket-PC sich das anzuschauen.

Code:
#include "/pocketc/pcheader.h"
int wind_event, ret;
int Status, Rx_Stat = 0;
char zz, cc;

int SendBefehl(int a, int sa, char typ, int &d) {
	int i,j;
	int t;
	int dat =0, adr =0;

  t = (typ & 0x3);
//putsl("a  :"+ (int)a +" hi:" + ((int)a>>8) + " lo:" + (int)(a & 0xff));
//putsl("sa :"+ (int)sa +" hi:" + ((int)sa>>8) + " lo:" + (int)(sa & 0xff));
	
	for (i = 0; i < 2; i++) {
		writebyte(ret, (char)0xf);
		writebyte(ret, (char)a>>8);
		writebyte(ret, (char)a);
		writebyte(ret, (char)sa>>8);
		writebyte(ret, (char)sa);

	  	j = 3;
		Rx_Stat = 0;
		do{
		  commwait(ret,0);
		  wind_event = event(1);
		  sleep(0);

		  switch(wind_event) {
		  case PM_COMMEVENT: {	// Serial Port
			     do {
			     cc = readbyte(ret);
// putsl("1 Rx_Stat:"+ Rx_Stat +" j:"+j +" cc:"+(int)cc);

			     switch(Rx_Stat) {
			     case 0: {
				       if ((int)cc == 0x0f) Rx_Stat = 1;						
       			       break;
				       }
			     case 1: {
				       Rx_Stat = 2;						
				       adr = ((int)cc)	<<8  ;
		       	   break;
				       }
			     case 2: {
				       Rx_Stat = 3;						
				       adr = (adr & 0xff00)|(int)cc;
			         break;
				      }
			     case 3: {
				       Rx_Stat = 4; 
				        if (t & 0x1) dat = (int)cc;
			         break;
				      }
			     case 4: {
				        Rx_Stat = 5;
				       if (t == 0x3){
								dat =  cc << 8 | dat;
                }      
                if (t == 0x2) dat = cc;
			          break;
				        }
			     default: {
				        Rx_Stat = 0;						
	            	 	adr = 0;
		             	dat = 0;
      			      break;
				        }
			     } // switch(Rx_Stat)
		    }while(Rx_Stat !=5)
		    break;
        }	
		   case PM_CHAR:{ // Keyboard
			    zz = key();
			    puts((int)zz);
			    break;
			    }
		   case PM_NONE: break;
		   case PM_TIMER: {
             j--; 
          	  break;
			    }
	     } // switch(wind_event)
     } while ((j > 0) && (Rx_Stat != 5))

// putsl("1 adr:"+(int)adr+" dat:"+(int)dat);
// putsl("2 Rx_Stat:"+ Rx_Stat +" j:"+j +" cc:"+(int)cc);

	if (a == adr) {
	  if (dat > 32768) d = ( dat | 0xffff0000) ;
    else d = dat;
    if (j) return 1;
	}

  } // for i
// putsl("fehler j:"+(int)j+" Rx_Stat:"+(int)Rx_Stat);
 	return 0;
}

main() {
	int i,iTmp;
	int Daten;
	int nTimerID;
  int Cur_x =0;
  int BIalt[2] = {0,170};

	clear();	// Bildschirm löschen
//	showconsole();
	nTimerID = settimer(1,200);	// 200ms Timer
	putsl("AutoMower Comm");
	ret = seropen(9600,"8N1N",1000);
	putsl("seropen:" + ret);
 	if (!ret) {
			alert("Fehler beim öffnen von COM1:");
			quit();
	}

  commsetmask(ret,EV_RXCHAR);

/* ein test für das typ Flag 
 ausgabe auf der Console */

  SendBefehl(497,0,0,Daten) ;// Status
  puts("0-NUL:"+Daten+ ", ");
  SendBefehl(497,0,1,Daten) ;// Status
	puts("1--lo:"+Daten+ ", ");
  SendBefehl(497,0,2,Daten) ;// Status
	puts("2--hi:"+Daten+ ", ");
  SendBefehl(497,0,3,Daten) ;// Status
	putsl("3-int:"+Daten);

  rect(0,70,240,270);
  rect(1,1,239,68);

/* Akkuwerte */
 text(4,2,"Status:");
 text(150,2,"Bat_mAh:");
 text(4,18,"Bat_T:");
 text(80,18,"Bat_I:"); 
 text(160,18,"Bat_U:");
 
/* Induktions-Schleife */
 text(4,34,"L_A0:");
 text(85,34,"L_N7:");
 text(165,34,"L_F9:");

/* Motoren */
 text(4,50,"M_Mä:");
 text(85,50,"M_Ml:");
 text(165,50,"M_Mr:");

for (i = 0;i < 5000; i++) {
  Cur_x = (i/5) % 240;

/* Akku-Strom laden/entladen */
  settextcolor(0,255,255);
  setpenattr(0,1,0,255,255);
  if (SendBefehl(491,0,3,Daten)) { // Bat I
		text(120,18,Daten+ "  ");
		iTmp = 170-(Daten/25);
//  iTmp=170;
     line(BIalt[0],BIalt[1],Cur_x,iTmp);
     BIalt[0] = Cur_x;
     BIalt[1] = iTmp;
  }

/* Akku-Spannung in mVolt */
  settextcolor(0,255,0);
  setpixelattr(0,255,0);
  if (SendBefehl(12030,0,3,Daten)){ // Bat U
    text(200,18,Daten+ " ");
    setpixel(Cur_x,265-((Daten-1500)/125));
  }

/* Akku-ladung in mAh */
  settextcolor(0,0,255);
  setpixelattr(0,0,255);
  if (SendBefehl(12000,0,3,Daten)){ // mAh
		text(205,2,Daten+ "  ");
     setpixel(Cur_x,265-(Daten/15));
  }

/* Akku-Temperatur */
  settextcolor(255,0,0);
  setpixelattr(255,0,0);
  if (SendBefehl(563,0,3,Daten)) {// Temperatur 
    text(45,18,Daten+ "  ");
    setpixel(Cur_x,265-(Daten*3));
  }

  setpixelattr(0,0,0);
  settextcolor(0,0,0);

/* Mäher-Status */
  if (SendBefehl(497,0,3,Daten)) // Status
		text(45,2,Daten+ ", ");

/* BegrenzungsSchleife */
  if (SendBefehl(424,0,3,Daten)) // A0
		text(40,34,Daten+ " ");
/* Ladestation Nah-Signal */
  if (SendBefehl(426,0,3,Daten)) //N7
		text(120,34,Daten+ "  ");
/* Ladestation Fern-Signal */
  if (SendBefehl(427,0,3,Daten)) // F9
		text(195,34,Daten+ " ");

/* Motor- Mähwerk in rpm */
  if (SendBefehl(12010,0,3,Daten))
		text(40,50,Daten+ "  ");
/* Motor- Links in rpm */
  if (SendBefehl(9408,0,3,Daten))
		text(120,50,Daten+ "  ");
/* Motor- Rechts */
  if (SendBefehl(9407,0,3,Daten))
		text(195,50,Daten+ "  ");

  sleep(1); 
} // for 

	killtimer(nTimerID);
	fileclose(ret);
//	return 0;
  alert("is fetich");
		quit();
}