-
Notifications
You must be signed in to change notification settings - Fork 2
Dokumentace: Společné funkce
- Verze a sériové číslo
- Status zařízení
- Adresování - nastavení adresy a komunikační rychlosti (pro zařízení se sériovým portem)
Funkce popsané na této stránce jsou společné pro téměř všechna zařízení, která komunikují protokolem Spinel. Mohou nastat určité výjimky, ale spíše jen u zakázkových aplikací nebo úzce specializovaných zařízení.
Níže uvedené příklady používají objekt MyDevice
tak, jak je definován v Základním příkladu použití. Funkce, které nejsou v knihovně implementovány můžete snadno sestavit pomocí této funkce SendAndReceive()
.
public bool CmdGetInfo(out SpinelDeviceVersion version);
if (MyDevice.CmdGetInfo(out SpinelDeviceVersion ver))
Console.WriteLine($"Description: {ver.Description}\nProductId: {ver.ProductId}\nHardwareId: {ver.HardwareId}\nFirmwareId: {ver.SoftwareId}");
else
Console.WriteLine("CmdGetInfo: Error");
Description: Quido ETH 4/4
ProductId: 254
HardwareId: 3
SoftwareId: 35
public bool CmdGetSN(out SpinelDeviceSN dev_sn);
if (MyDevice.CmdGetSN(out SpinelDeviceSN sn) && sn.Valid)
Console.WriteLine($"S/N: {sn.SerialNumber}\nType: {sn.DeviceType}\nFactory data: {sn.FactoryData}");
else
Console.WriteLine("CmdGetSN: Error");
S/N: 254
Type: 3569
Factory data: 538444585
Status je uživatelsky definované číslo, které lze využít k zjištění stavu přístroje. Po zapnutí přístroje, nebo po resetu (i softwarovém) je automaticky nastaven status 0x00. Pokud je instrukcí CmdSetStatus
přestaven na jinou
hodnotu, lze později snadno identifikovat, v jakém stavu se přístroj nachází.
public Boolean CmdGetStatus(out int dev_status)
dev_status
Int s platným rozsahem 0 až 255. Pokud je -1, čtení se nepodařilo a i výstupem instrukce je false.
if (MyDevice.CmdGetStatus(out int sts))
Console.WriteLine($"Status is {sts}");
else
MessageBox.Show("Error");
Status is 42
public Boolean CmdSetStatus(byte dev_status)
if (MyDevice.CmdSetStatus(42))
Console.WriteLine("Ok");
else
MessageBox.Show("Error");
Ok
Adresování je využitelné většinou jen u zařízeních připojených přes sériové rozhraní (sériový port RS232, RS485, RS422). Použití některých funkcí z této části není u Ethernetových zařízení dovoleno. Ethernetová zařízení je vhodné vždy adresovat univerzální adresou 0xFE.
(Funkce má význam jen u zařízení komunikujících po sériovém rozhraní.)
public Boolean CmdGetCommParams(out byte addr, out int baudrate)
addr
Adresa.
baudrate
Komunikační rychlost v Baudech. Pokud je číslo menší než 110, jde o neznámý kód komunikační rychlosti.
if (MyDevice.CmdGetCommParams(out byte adr, out int baudrate))
Console.WriteLine($"Address is {adr} (0x{adr.ToString("X2")}), Baudrate is {baudrate}");
else
Console.WriteLine("Error");
Address is 51 (0x33), Baudrate is 9600
Povoluje provedení konfigurace. Musí předcházet bezprostředně před voláním funkce pro nastavení komunikačních parametrů CmdSetCommParams
. Po jakémkoli následujícím volání funkce (i neplatném) je konfigurace automaticky zakázána. (U této funkce není možné použít univerzální adresu 0xFE.)
public Boolean CmdAllowConfiguration()
Kompletní příklad použití je u funkce CmdSetCommParams
.
Bezprostředně před voláním této funkce musí být povolena konfugurace pomocí funkce CmdAllowConfiguration
. Po vykonání instrukce již zařízení komunikuje s novou adresou a komunikační rychlostí. (Funkce má význam jen u zařízení komunikujících po sériovém rozhraní.)
public ResponseACK CmdSetCommParams(byte newaddr, int newbaudrate)
newaddr
Nová adresa. Musí být z rozsahu 0 až 253.
newbaudrate
Nová komunikační rychlost v Baudech. Musí být jednou ze standardních komunikačních rychlostí jak jsou uvedeny v poli MyDevice.Baudrates
(110, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400 Bd). Pokud jde o jinou nestandardní rychlost, uveďte přímo kód rychlosti. Rychlosti použitelné pro konkrétní zařízení jsou uvedeny v jeho dokumentaci. Obecně se dá uvést, že většinou zařízení umí rychlosti od 4800 do 115200 Bd.
ResponseACK
Výčet kódů Potvrzení dotazu (ACK). Byte ACK informuje nadřazené zařízení jak dopadlo zpracování přijaté instrukce.
Před změnou adresy nebo komunikační rychlosti touto instrukcí je potřeba používat aktuální adresu zařízení a ne univerzální adresu (0xFE). Adresa 0x31 je definována v duchu ukázkového příkladu například takto:
MyDevice = new Papouch.Spinel.Spinel97.Device.Quido.Quido(ci, 0x31);
Příklad nastaví adresu 0x74 a rychlost 57 600 Bd.
if (MyDevice.CmdAllowConfiguration())
Console.WriteLine("Configuration allowed");
else
Console.WriteLine("Configuration not allowed!");
ResponseACK resp = MyDevice.CmdSetCommParams(0x74, 57600);
if (resp == ResponseACK.AllIsOk)
Console.WriteLine("Ok");
else
Console.WriteLine($"Error code is {resp}.");
Configuration allowed
Ok
Instrukce umožňuje nastavit adresu podle unikátního sériového čísla zařízení. Tato instrukce je praktická v případě, že nadřazený systém nebo obsluha ztratí adresu zařízení, které je na stejné komunikační lince s dalšími zařízeními.
public Boolean CmdSetAddressBySerialNumber(byte newaddr, UInt16 devicenumber, UInt16 serialnumber)
newaddr
Nová adresa. Musí být z rozsahu 0 až 253.
devicenumber
Typ zařízení. Kompletní S/N zařízení má tvar 1234/5678. Typ zařízení je číslo před lomítkem.
serialnumber
Sériové číslo. Kompletní S/N zařízení má tvar 1234/5678. Sériové číslo je číslo za lomítkem.
Nastavení adresy 0x33 do zařízení se S/N 1255/1234:
if (MyDevice.CmdSetAddressBySerialNumber(0x33, 1255, 1234))
Console.WriteLine("Ok");
else
Console.WriteLine("Error");
Ok