Soll ich den für eine frage nen neuen Thread aufmachen?
Les mal noch nen kleines Stück weiter.. da steht meine Empfehlung...
Okay habe das so erstmal geschaft, aber es gibt schon wieder ein neues problem.
Wenn ich es so mache:
Zappeln die Servos nur rum und die Sensordaten ändern sich nicht.Code:void task_befehle(void)
{
Eingabe();
long pos = atoi(Buffer);
if(pos < 180 && pos > 0)
{
servo1_position = pos;
}
else
if(pos < 360 && pos > 180)
{
servo2_position = pos - 180;
}
else
if(pos < 540 && pos > 360)
{
servo3_position = pos - 360;
}
else
if(pos == -1)
{
I2CTWI_transmitByte(PCF, 0);
}
else
if(pos == -2)
{
I2CTWI_transmitByte(PCF, 3);
}
}
void task_sensoren(void)
{
getAllSensors();
writeIntegerLength((((adcBat/102.4f)+0.1f)), DEC, 2);
writeString_P(".\n");
writeIntegerLength((((adcBat/1.024f)+10)), DEC, 2);
writeString_P("V\n");
writeIntegerLength(adcLSL,DEC,4);
writeString_P("L\n");
writeIntegerLength(adcLSR,DEC,4);
writeString_P("R\n");
}
uint32_t Eingabe(void){
static buffer_pos = 0;
if(getBufferLength())
{
Buffer[buffer_pos]=readChar();
if(Buffer[buffer_pos]=='\n')
{
Buffer[buffer_pos] = '\0';
buffer_pos = 0;
return 1;
}
else if(buffer_pos >= UART_RECEIVE_BUFFER_SIZE)
{
Buffer[UART_RECEIVE_BUFFER_SIZE] = '\0';
buffer_pos = 0;
return 2;
}
buffer_pos++;
}
return 0;
}
int main(void)
{
initRP6Control();
initLCD();
initSERVO(SERVO1 | SERVO2 | SERVO3);
WDT_setRequestHandler(watchDogRequest);
I2CTWI_initMaster(100);
I2CTWI_setRequestedDataReadyHandler(I2C_requestedDataReady);
I2CTWI_setTransmissionErrorHandler(I2C_transmissionError);
setLEDs(0b111111);
mSleep(500);
setLEDs(0b000000);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT, true);
I2CTWI_transmit3Bytes(I2C_RP6_BASE_ADR, 0, CMD_SET_WDT_RQ, true);
I2CTWI_transmitByte(PCF, 0);
while(true)
{
task_I2CTWI();
task_befehle();
task_sensoren();
task_SERVO();
}
return 0;
}
Empfangen mache ich in Visual C# so :
Hoffe ihr könnt mir nochmal helfen.Code:public void Daten_Empfangen()
{
string[] Volt = serialPort1.ReadLine().Split('.');
string[] LVolt = serialPort1.ReadLine().Split('V');
string[] Licht = serialPort1.ReadLine().Split('L');
string[] LLicht = serialPort1.ReadLine().Split('R');
string Akku = Volt[0] + LVolt[0];
string Licht_L = Licht[0];
string Licht_R = LLicht[0];
label9.Text = Volt[0].Replace("0", "") + "." + LVolt[0] + " Volt";
if (Convert.ToInt32(Akku) > progressBar1.Maximum)
{
progressBar1.Maximum = Convert.ToInt32(Akku);
}
else
progressBar1.Value = Convert.ToInt32(Akku);
if (Convert.ToInt32(Licht_R) > progressBar2.Maximum)
{
progressBar2.Maximum = Convert.ToInt32(Licht_R);
}
else
progressBar2.Value = Convert.ToInt32(Licht_R);
if (Convert.ToInt32(Licht_L) > progressBar3.Maximum)
{
progressBar3.Maximum = Convert.ToInt32(Licht_L);
}
else
progressBar3.Value = Convert.ToInt32(Licht_L);
}
private void timer2_Tick(object sender, EventArgs e)
{
if (checkBox1.Checked)
{
Daten_Empfangen();
}
}
mfG
Philip
Und was genau sendest du vom PC aus?
Senden tuhe ich das :
Code:private void trackBar2_Scroll(object sender, EventArgs e)
{
int servo2label = trackBar2.Value - 180;
label5.Text = servo2label.ToString();
serialPort1.Write(trackBar2.Value.ToString());
serialPort1.Write("\n\r");
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
label1.Text = trackBar1.Value.ToString();
serialPort1.Write(trackBar1.Value.ToString());
serialPort1.Write("\n\r");
}
private void trackBar3_Scroll(object sender, EventArgs e)
{
int servo3label = trackBar3.Value - 360;
label3.Text = servo3label.ToString();
serialPort1.Write(trackBar3.Value.ToString());
serialPort1.Write("\n\r");
}
Naja, bei jedem empfangenen Zeichen wird deine Buffer Position wieder auf Null gesetzt...
Das kann ja schonmal nicht klappen. Außerdem wertest du auch den Rückgabewert der "Eingabe"-Funktion nicht aus. Das dürfte auch dazu führen, dass das Ganze nicht klappt.
Das Senden der Werte sieht mir auch etwas seltsam aus, es sieht so aus als ob du denkst, dass die modifizierten TrackBar-Werte gesendet werden ("-360","-180").
Das werden sie aber sicherlich nicht.