Hi Leutz,
bin 1. neu hier, 2. eine elektronische NULL und 3. funzt mein ASURO nicht so ganz (dazu in einem anderen Thread mehr).
Habe zum Testen (nachdem mir das mitgelieferte Testprg. nicht gefallen hat) ein eigenes Prog. geschrieben.
Zuerst das Steuerprogramm für den PC (Console unter Windows):
Code:
//*****************************************************************************
//*
//*
//* ComDemo.cpp
//*
//*
//*****************************************************************************
//
// Mit deisem Programm kann man eine Konsolenverbindung über die serielle
// Schnittstelle mit einem Null-Modem-Kabel herstellen.
//
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include "ComTools.h"
#define COM1 0
#define COM2 1
#define COM3 2
#define COM4 3
#define ESC 27
//*****************************************************************************
//*
//* main
//*
//*****************************************************************************
int main(int argc, char* argv[])
{
int iLen,iKey,iWait;
char inBuffer[65];
char outBuffer[65];
ComInit();
if(!ComOpen(COM1,2400,P_NONE,S_1BIT,D_8BIT))
{
printf("\nKann die Schnittstelle nicht oeffnen !\n\n");
return -1;
}
while(1)
{
if(kbhit()) // Wurde eine Taste gedrückt
{
iKey = getch();
if(iKey == ESC)
break;
if(iKey != 'f' && iKey != 'r' && iKey != 'l' && iKey != 'x' && iKey != 'o'
&& iKey != 'k' && iKey != '+' && iKey != '-') // kein 1-Zeichen-Befehl
{
while(_kbhit());
outBuffer[0] = iKey;
outBuffer[1] = getch();
}
else
{
outBuffer[0] = iKey;
outBuffer[1] = ' ';
}
printf("%c%c\n",outBuffer[0],outBuffer[1]);
ComWrite(COM1,outBuffer,2);
}
memset(inBuffer,0,65);
iLen = ComRead(COM1,inBuffer,64); // Zeichen einlesen
if(iLen > 0)
{
inBuffer[iLen] = '\0';
if(inBuffer[2] == 'f') // vordere Fototransistoren
{
int val_Links = (inBuffer[3] << 8) | inBuffer[4];
int val_Rechts = (inBuffer[5] << 8) | inBuffer[6];
printf("\nFoto L: %d R: %d\n",val_Links, val_Rechts);
}
else if(inBuffer[2] == 'o') // Odometrie
{
int val_Links = (inBuffer[3] << 8) | inBuffer[4];
int val_Rechts = (inBuffer[5] << 8) | inBuffer[6];
printf("\nOdo L: %d R: %d\n",val_Links, val_Rechts);
}
else if(inBuffer[2] == 'p') // Schalter
{
int value = inBuffer[3];
char ausgabe[7] = { '-','-','-','-','-','-','\0' };
if(value & 1)
ausgabe[5] = 'X';
if(value & 2)
ausgabe[4] = 'X';
if(value & 4)
ausgabe[3] = 'X';
if(value & 8)
ausgabe[2] = 'X';
if(value & 16)
ausgabe[1] = 'X';
if(value & 32)
ausgabe[0] = 'X';
printf("Schalter: %s\n",ausgabe);
}
else
printf("%s\n",&inBuffer[2]);
}
else
{
Sleep(50); // Wenn keine Zeichen im Buffer sind dann warten
}
}
ComClose(COM1);
ComExit();
return 0;
}
..und das ASURO-Progrämmsche:
Code:
#include "asuro.h"
int main(void)
{
Init();
StatusLED(GREEN);
unsigned char data[65];
unsigned char frontLED = 0;
unsigned int lD[2];
unsigned char send[12];
unsigned char speed = 200;
unsigned char Motors[2];
while(1)
{
SerRead(data,2,0); // auf 2 Zeichen warten
switch(data[0])
{
case 's': // StatusLED
if(data[1] == 'g')
{
StatusLED(GREEN);
SerWrite("Set StatusLED to Green\0",23);
}
if(data[1] == 'r')
{
StatusLED(RED);
SerWrite("Set StatusLED to Red\0",21);
}
if(data[1] == 'y')
{
StatusLED(YELLOW);
SerWrite("Set StatusLED to Yellow\0",24);
}
if(data[1] == 'o')
{
StatusLED(OFF);
SerWrite("Set StatusLED Off\0",18);
}
break;
case 'l': // Front-LED
if(frontLED == 0)
{
SerWrite("Set FrontLED On\0",16);
FrontLED(ON);
}
else
{
SerWrite("Set FrontLED Off\0",17);
FrontLED(OFF);
}
frontLED = !frontLED;
break;
case 'f': // vorwärts
SerWrite("Set Motordirection FORWARD\0",27);
MotorDir(FWD, FWD);
break;
case 'r': // rückwärts
SerWrite("Set Motordirection REVERSE\0",27);
MotorDir(RWD, RWD);
break;
case 'g':
speed = data[1];
break;
case '+':
if(speed < 255)
speed += 10;
if(Motors[0])
MotorSpeed(speed,0);
if(Motors[1])
MotorSpeed(0,speed);
break;
case '-':
if(speed > 0)
speed -= 10;
if(Motors[0])
MotorSpeed(speed,0);
if(Motors[1])
MotorSpeed(0,speed);
break;
case 'm': // Motoren
if(data[1] == 'l')
{
SerWrite("Set left Motor\0",15);
MotorSpeed(speed,0);
Motors[0] = 1;
Motors[1] = 0;
}
if(data[1] == 'r')
{
SerWrite("Set right Motor\0",16);
MotorSpeed(0,speed);
Motors[0] = 0;
Motors[1] = 1;
}
if(data[1] == 'o')
{
SerWrite("Set Motors OFF\0",15);
MotorSpeed(0,0);
Motors[0] = 0;
Motors[1] = 0;
}
break;
case 'b': // Rück-LED's
if(data[1] == 'l')
{
SerWrite("Set left BackLED ON\0",20);
BackLED(ON,OFF);
}
if(data[1] == 'r')
{
SerWrite("Set right BackLED ON\0",21);
BackLED(OFF,ON);
}
if(data[1] == 'o')
{
SerWrite("Set BackLEDs OFF\0",17);
BackLED(OFF,OFF);
}
break;
case 'k':
send[0] = 'p';
send[1] = PollSwitch();
send[5] = '\0';
SerWrite(send,3);
break;
case 'x':
// Zustände senden
LineData(lD); // Zustände der vorderen Fototransistoren holen
send[0] = 'f';
send[1] = lD[0] >> 8; // HighByte
send[2] = lD[0] & 0xFF; // LowByte
send[3] = lD[1] >> 8; // HighByte
send[4] = lD[1] & 0xFF; // LowByte
send[5] = '\0';
SerWrite(send,5);
break;
case 'o': // Odometriedaten
// Zustände senden
OdometrieData(lD); // Zustände der vorderen Fototransistoren holen
send[0] = 'o';
send[1] = lD[0] >> 8; // HighByte
send[2] = lD[0] & 0xFF; // LowByte
send[3] = lD[1] >> 8; // HighByte
send[4] = lD[1] & 0xFF; // LowByte
send[5] = '\0';
SerWrite(send,5);
break;
}
}
StatusLED(RED);
while(1);
return 0;
}
Es werden auch noch die ComTools von http://members.inode.at/anton.zechner/az/Seriell.htm Anton Zechner benötigt (sind angehängt).
Die Console reagiert auf folgende Tasten(kombinationen):
f = MotorDir(FWD,FWD)
l = FrontLED(ON/OFF) 'als Switch
r = MotorDir(RWD,RWD)
+ = MotorSpeed(+10,+10)
- = MotorSpeed(-10,-10)
o = OdometrieData()
x = LineData()
k = PollSwitch()
mo = MotorSpeed(0,0)
ml = MotorSpeed(n,0)
mr = MotorSpeed(0,n)
bo = BackLED(OFF,OFF)
bl = BackLED(ON,OFF)
br = BackLED(OFF,ON)
so = StatusLED(OFF)
sr = StatusLED(RED)
sy = StatusLED(YELLOW)
sg = StatusLED(GREEN)
Daher auch eine Frage: Wie regelt ihr eine abgestimmte Kommunikation zwischen Robbie & PC???
Viel Spass damit (auch wenn's recht popelig ist)
Banzai
Lesezeichen