Red COM en serie + Arduino

1

Soy nuevo en este sitio, pero tengo un problema y es posible que pueda ayudarme. Tengo un grupo de autos que habla y escucha una línea serial de 0V / + 12V. Mi objetivo es enviar algunos comandos adicionales al grupo de instrumentos. Estoy usando el Serial2 de MEGA para esto y Serial para monitorear toda la red.

El problema es que tengo que esperar que la línea quede inactiva / silenciosa para que mi mensaje no interrumpa ninguna otra línea enviada por otros dispositivos en la red.

Tengo esto hasta ahora:

#define Kbus Serial2
#define get_Kbus_data serialEvent2
#define Kbus_rx 17  
#define Kbus_tx 16
byte Kdata; 
uint8_t left_blinker[10]={0xD0, 0x08, 0xBF, 0x5B, 0x20, 0x00, 0x04, 0x00, 0x00, 0x18};
int time_Kbus;
void setup()
{
  pinMode(Kbus_rx,INPUT_PULLUP); 
  pinMode(Kbus_tx,OUTPUT);
  Serial.begin(9600, SERIAL_8E1); 
  Kbus.begin(9600, SERIAL_8E1);

}
void loop()
{

if(millis()- time_Kbus > 1 ) Kbus.write(left_blinker, sizeof(left_blinker));     

}
void get_Kbus_data()
{
  Kdata = Kbus.read(); 
  Serial.println(Kdata,HEX); 
//  Serial.write(Kdata); 
  time_Kbus = millis();  
}

Estoy usando dos optoaisladores para obtener las señales correctas de 0V / + 12V.

simular este circuito : esquema creado usando CircuitLab

Estoy usando 4N35 optos y un 2N3904 como Q1

He notado una cosa al trabajar con esto. El Arduino no envía los ceros iniciales de, como 0x08 sale como > 8 así que tal vez el extremo receptor no lo reconoce ?!

Puedo leer la línea usando este circuito y otro código, pero no he probado el lado del "remitente".

Creo que esto es todo lo que tengo.

ACTUALIZACIÓN # 1 = Falta la unión entre los dos optos y la línea GND corregida.

    
pregunta Zoszko

3 respuestas

1

He recogido otras piezas del sistema k-bus (ibus), por lo que parece que me faltaba algo en la línea de un pullup interno. Estoy usando el mismo código (se ha portado a un duemilanove) y ahora funciona como un encanto. Si alguien necesita ayuda con proyectos relacionados con k-bus (ibus), contácteme.

    
respondido por el Zoszko
2

No estoy seguro de la forma en que se ha conectado el diodo de opto1. Creo que debería tener su conexión con el emisor de opto2 conectado a tierra.

Si recorres el circuito, tienes bus- > R5- > diode- > transistor- > bus - esto no puede hacer nada sensible, no puede pasar corriente a través de ese circuito porque no hay una tercera conexión a tierra o poder.

Tal vez lo hayas hecho mal, pero tal como está, es probable que nadie ayude a menos que se solucione, porque nadie puede saber realmente lo que estás tratando de lograr. Tal vez estoy equivocado?

    
respondido por el Andy aka
2

Creo que su código y circuito están enviando la cadena correcta. Donde está su código de recepción es eliminar los cero acolchados iniciales (como se indica en el comentario de Andy)

Como estás enviando

D0 08 BF 5B 20 00 04 00 00 18

y usted declara que está recibiendo D08BF5B20040018, donde si organiza los mismos datos como sigue, parece ser correcto.

D0  8 BF 5B 20  0  4  0  0 18

Veo tu código usando:

Serial.println(Kdata,HEX); 

y pensaría que esto sería obvio en la salida, el salto de línea que remarca cada carácter recibido.

Tenga en cuenta que el byte recibido sigue siendo un entero entero, independientemente de la visualización de la impresión del cero inicial que se está eliminando. Para ver ambos nibbles, incluidos los cero iniciales, puede utilizar la función printf.

#include <stdio.h>
...
sprintf(charVal, "%02X", Kdata);
Serial.println(charVal);
    
respondido por el mpflaga

Lea otras preguntas en las etiquetas