Przesyłanie wiadomości
Ostatnia zmiana:
Funkcja przesyła wiadomości za pomocą protokołu diagnostycznego. Kolejka nadawcza adaptera jest przeznaczona na 50 wiadomości w jednej kolejce dla jednego kanału i dysponuje 64 KB wolnej pamięci dla wszystkich kolejek. Po zapełnieniu kolejki lub całej wolnej pamięci przyjmowanie wiadomości do kolejki nadawczej zostaje wstrzymane.
long PassThruWriteMsg(unsigned long ChannelID, PASSTHRU_MSG *pMsg, unsigned long *pNumMsgs, unsigned long Timeout)
PassThruStartMsgFilter. Bez niego funkcja zwróci błąd ERR_NO_FLOW_CONTROL.
PassThruConnect.ERR_TIMEOUT. Jeżeli limit czasu wynosi
0, wiadomości są umieszczane w kolejce nadawczej bez oczekiwania na fizyczne przesłanie, a funkcja zwraca sterowanie natychmiast. W tym przypadku błąd ERR_TIMEOUT nie jest generowany.| Kod | Opis | Możliwe przyczyny i rozwiązania |
|---|---|---|
| STATUS_NOERROR | Funkcja wykonana pomyślnie | — |
| ERR_DEVICE_NOT_CONNECTED | Brak połączenia z adapterem |
|
| ERR_INVALID_CHANNEL_ID | Podano nieistniejący identyfikator kanału ChannelID |
|
| ERR_NULL_PARAMETER | Nie podano wskaźnika pMsg lub pNumMsgs |
|
| ERR_TIMEOUT | W zadanym czasie nie udało się przesłać wszystkich wiadomości |
|
| ERR_INVALID_MSG | Nieprawidłowa struktura wiadomości w pMsg |
|
| ERR_MSG_PROTOCOL_ID | Protokół w wiadomości nie zgadza się z protokołem kanału |
|
| ERR_NO_FLOW_CONTROL | Dla protokołu ISO 15765 nie ustawiono filtra Flow Control |
|
| ERR_BUFFER_FULL | Kolejka nadawcza jest przepełniona |
|
| ERR_FAILED | Wewnętrzny błąd biblioteki lub adaptera |
|
#include "j2534_dll.hpp"
// ChannelID uzyskany wcześniej od PassThruConnect
unsigned long ChannelID;
PASSTHRU_MSG Msg;
unsigned long NumMsgs = 1;
unsigned long Timeout = 200;
// Tworzenie wiadomości ISO 15765 (żądanie SID 0x22, PID 0xF190)
Msg.ProtocolID = ISO15765;
Msg.TxFlags = ISO15765_FRAME_PAD;
Msg.Data[0] = 0x00;
Msg.Data[1] = 0x00;
Msg.Data[2] = 0x07;
Msg.Data[3] = 0xDF;
Msg.Data[4] = 0x22;
Msg.Data[5] = 0xF1;
Msg.Data[6] = 0x90;
Msg.DataSize = 7;
long ret = PassThruWriteMsg(ChannelID, &Msg, &NumMsgs, Timeout);
if (ret != STATUS_NOERROR) {
char error[256];
PassThruGetLastError(error);
// Obsługa błędu
}
// channelID uzyskany wcześniej od ptConnect
val msg = PassThruMsg(
protocolID = ISO15765,
dataSize = 7,
txFlags = ISO15765_FRAME_PAD,
// Żądanie VIN (SID 0x22, PID 0xF190)
data = byteArrayOf(0x00, 0x00, 0x07, 0xDF.toByte(), 0x22, 0xF1.toByte(), 0x90.toByte())
)
val messages = arrayOf(msg)
val timeout = 200 // ms
val result = j2534.ptWriteMsgs(channelID, messages, timeout)
if (result.status == STATUS_NOERROR) {
Log.i("J2534", "Wysłano wiadomości: ${result.numMsgs}")
} else {
Log.e("J2534", "Błąd wysyłania: ${result.status}")
}
# channel_id uzyskany wcześniej od PassThruConnect
msg = PassThruMsg()
msg.ProtocolID = ISO15765
msg.TxFlags = ISO15765_FRAME_PAD
msg.Data = bytes([0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90])
msg.DataSize = 7
num_msgs = ctypes.c_ulong(1)
timeout = 200 # ms
ret = j2534.PassThruWriteMsg(channel_id, ctypes.byref(msg), ctypes.byref(num_msgs), timeout)
if ret == 0: # STATUS_NOERROR
print(f"Wysłano wiadomości: {num_msgs.value}")
else:
print(f"Błąd wysyłania: {ret}")
// channelId uzyskany wcześniej od PassThruConnect
var msg = new PassThruMsg {
ProtocolID = ISO15765,
TxFlags = ISO15765_FRAME_PAD,
Data = new byte[] { 0x00, 0x00, 0x07, 0xDF, 0x22, 0xF1, 0x90 },
DataSize = 7
};
uint numMsgs = 1;
uint timeout = 200; // ms
int ret = J2534.PassThruWriteMsg(channelId, ref msg, ref numMsgs, timeout);
if (ret == 0) {
Console.WriteLine($"Wysłano wiadomości: {numMsgs}");
} else {
Console.WriteLine($"Błąd wysyłania: {ret}");
}