Soy nuevo en este sitio, pero tengo un problema y es posible que pueda ayudarme. Tengo un clúster de automóvil que habla y escucha una línea serial de 0V/+12V. Mi objetivo es enviar algunos comandos adicionales al grupo de instrumentos. Estoy usando 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/silencio 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 adecuadas de 0V/+12V.
simular este circuito : esquema creado con CircuitLab
Estoy usando optos 4N35 y un 2N3904 como Q1
He notado una cosa mientras trabajaba con esto. El Arduino no envía los ceros iniciales, como 0x08 sale como> 8, ¿entonces tal vez el extremo receptor no lo reconozca?
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 el cruce entre los dos optos y la línea GND arreglada.
No estoy seguro de la forma en que tiene conectado el diodo de opto1; creo que debería tener su unión con el emisor de opto2 conectado a tierra.
Si rastrea el circuito, tiene bus-> R5-> diodo-> transistor-> bus; esto no puede hacer nada sensato; no puede pasar corriente a través de ese circuito porque no hay una tercera conexión a tierra o energía.
Tal vez lo hayas dibujado mal, pero tal como está, es probable que nadie te ayude a menos que esté arreglado porque nadie puede saber realmente lo que estás tratando de lograr. ¿Puede ser que esté equivocado?
Creo que su código y circuito están enviando la cadena correcta. Donde está su código de recepción está eliminando los ceros acolchados iniciales (como lo indica el comentario de Andy)
Como estás enviando
D0 08 BF 5B 20 00 04 00 00 18
y declara que está recibiendo D08BF5B20040018, donde si organiza los mismos datos de la siguiente manera, 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 destacando cada carácter recibido.
Tenga en cuenta que el byte recibido sigue siendo un número entero independientemente de que se elimine la visualización de la impresión del cero inicial. Para ver ambos nibbles, incluidos los ceros iniciales, puede usar la función printf.
#include <stdio.h>
...
sprintf(charVal, "%02X", Kdata);
Serial.println(charVal);
Recogí otras piezas del sistema k-bus (ibus), por lo que parece que me faltaba algo en una línea interna. Estoy usando ~el mismo código (ha sido portado a un duemilanove) y ahora funciona de maravilla. Si alguien necesita ayuda con proyectos relacionados con k-bus (ibus), comuníquese conmigo.
mpflaga
mpflaga
Zoszko
Andy alias
Zoszko