Espero que esté redactando esto correctamente, pero aquí va. He estado creando un servicio para MSRDS para ejecutar mi prototype board . La gente probablemente me ha visto hacer preguntas sobre esto antes. He tenido bastante éxito con él y tengo una interfaz que me permite escribir y leer, pero no estoy seguro de cómo tratar con direcciones como 0x53-0x54, donde usan los 8 bits de 53H y luego 2 más de 0x54.
Por ejemplo, puedo configurar la dirección 0x4D (que controla si los puertos digitales son de entrada o salida) en 0x01 y luego configurar 0x4E en 0x01 y el LED que he enchufado en la placa de pan se enciende; eso es fácil porque en En ambos casos, solo trato con una única dirección de 8 bits. Mi problema surge cuando intento configurar el voltaje en la salida analógica O0. Pensé que solo podía enviar dos comandos, el primero configuraba la dirección de 0x55 a 0xFF y luego configuraba 0x56 a 0xC0. He intentado varias combinaciones de esto, sin embargo, nunca puedo obtener el voltaje por encima de aproximadamente 1 voltio y creo que es porque no estoy configurando los valores correctamente.
Con suerte, he dejado esto suficientemente claro para que alguien pueda informarme sobre lo que se necesita hacer para comprender mejor lo que estoy haciendo.
Este es el código que realmente maneja el envío del mensaje a través del enlace serial USB al dispositivo I2C. Es algo complejo y no muy claro porque se está publicando en un servicio (el servicio de ladrillos), he pasado horas con él pero sospecho que no le dirá a nadie más lo que esté al tanto. Es de una versión modificada del código fuente de NXT incluido en las muestras de MSRDS. Dicho esto, puedo decirle que funciona bastante bien cuando trato con una sola dirección de 8 bits. Además, no se llama ReadFromI2cAddressHandler porque con el protocolo lego USB siempre obtiene una respuesta acolchada de 16 bits, en el caso de que simplemente escriba algunos datos, simplemente la ignore porque de todos modos es cero. Si desea ver más del código, está en mi cuenta github .
[ServiceHandler(ServiceHandlerBehavior.Exclusive)]
public virtual IEnumerator<ITask> ReadFromI2cAddressHandler(ReadFromI2cAddress readRequest)
{
var write = new LegoLSWrite
{
Port = _state.SensorPort,
TXData = readRequest.Body.TxData,
ExpectedI2CResponseSize = readRequest.Body.ExpectedResponseSize
};
Activate(Arbiter.Choice(_legoBrickPort.SendNxtCommand(write),
EmptyHandler,
f => LogInfo(f.ToException().InnerException + " " + f.ToException().Message)));
Activate(Arbiter.Receive(false, TimeoutPort(80), EmptyHandler));
var read = new LegoLSRead(_state.SensorPort);
Activate(Arbiter.Choice(_legoBrickPort.SendNxtCommand(read),
r => readRequest.ResponsePort.Post(new ReadResponse {Bytes = r.CommandData}),
f => readRequest.ResponsePort.Post(f)));
yield break;
}