¿Cómo se pueden enviar bytes para arduino?

0

He desarrollado un cliente de aplicaciones que envía una cadena / comando por socket para otro servidor de aplicaciones para PC y el servidor de aplicaciones envía una cadena para el arduino a través del puerto serie.

El problema es: ¿cómo puedo enviar bytes para arduino?

Lo siento mi mal inglés

Actualización: El código, ¡funciona! ;)

Vea la explicación en el código.

El código de mi servidor de aplicaciones C # que envía una cadena a través del puerto serie:

using System;
using System.Windows.Forms;
//
using System.Threading;
using System.IO;
using System.IO.Ports;

pulic class senddata(){

private void Form1_Load(object sender, System.EventArgs e)
{
//Define a Porta Serial
    serialPort1.PortName = textBox2.Text;
    serialPort1.BaudRate = 9600;
    serialPort1.Open();
}
private void button1_Click(object sender, System.EventArgs e)
{
        int cmd = 1;
        byte[] b = BitConverter.GetBytes(cmd);
        serialPort1.Write(b, 0, 4);   
}

} 

El código C del arduino:

#include <Servo.h>

Servo servo;

void setup()
{
    servo.attach(9);
    Serial.begin(9600);
    servo.write(0);
}

void loop()
{
    if(Serial.available())
    {

     int cmd = Serial.read();

         if (cmd> 0) {

         servo.write(cmd);

        }
  }
}

Para que entiendas mejor mi problema, puse este código. Porque el valor del servo va de 0 a 180, y de esta manera no funciona.

    
pregunta FredVaz

3 respuestas

1

¿Por qué necesita que se envíe como una cadena?

Simplemente envíe un valor de byte y trátelo como tal en el Arduino. El método serialPort1.Write probablemente tendrá diferentes sobrecargas para varios formatos, incluido el byte.

Si necesita representar un valor > 255, puede enviarlo a través de varios bytes y concatenar en, por ejemplo. Un int en el arduino.

NOTA : parece que has cambiado el código en tu pregunta desde que se escribió lo siguiente, pero lo dejaré ahí porque el concepto sigue siendo válido.

EDIT

En este momento está enviando en formato ASCII desde la PC, por lo que 0 - 0x30, 1 = 0x31, etc. Para enviar en binario simple, verifique las sobrecargas del método.

Intenta poner algo como:

private void button1_Click(object sender, System.EventArgs e)
{
     // Say we want to send 23456 (0x5BA0)
     //serialPort1.Write(200);  // 200 is "send value" command    
     //serialPort1.Write(91);  // 100 (0x5B) is your upper byte value 
     //serialPort1.Write(160);  // 160 (0xA0) is your lower byte value 

     // this uses the serialPort1.write overload correctly
     // 1st byte is command, 2nd and 3rd are upper and lower bytes of int
     byte[] data = new byte[] {200, 91, 160}; 
     serialPort1.Write(data, 0, 3);  // 0 is the offset and 3 is the size of array    

}

y vea si se recibe correctamente en el Arduino (no lo lea como una cadena, por ejemplo, si el byte entrante es == 200)
Algo como lo que se muestra a continuación debería funcionar. Deberá ajustarse en consecuencia para que haga lo que sea que esté tratando de hacer. Este es solo un ejemplo de transferencia de bytes:

    if (incomingByte == 200) {

       upper_byte = (unsigned char)Serial.read();
       lower_byte = (unsigned char)Serial.read();
       // full_value should be 23456 
       int full_value = (upper_byte << 8) + lower_byte; // reconstruct int
    }

Notas:
Puede escribir código para dividir un int en los dos bytes (acabo de poner un ejemplo de "valor de prueba")
Una vez más, puede haber sobrecargas para esto. También puede usar cualquier capacidad de recepción de múltiples bytes en la rutina Serial.read.

    
respondido por el Oli Glaser
0

La respuesta de Oli podría ser la mejor solución para su problema general, pero para responder la pregunta, cómo generar la representación de cadena de un int en C, consulte la función sprintf() .

    
respondido por el The Photon
0

Es difícil entender exactamente lo que estás preguntando debido al mal inglés y la naturaleza compleja del problema. Tampoco estoy 100% seguro de que electronics.stackexchange sea a donde pertenece esta pregunta. Aun así, aquí va ...

Para convertir un solo carácter ASCII en un valor entero, haga lo siguiente:

char c = lo que sea; int i; i = c - '0'; // C es un valor ASCII entre '0' y '9'.
              // Seré un valor entero entre 0 y 9.

Para hacer lo contrario:

c = '0' + i;

Si estas cosas simples no le funcionan, mire las funciones estándar de: atoi () , itoa () , sprintf () , y otros.

    
respondido por el user3624

Lea otras preguntas en las etiquetas