Diskuze: Raspberry Pi - TTL na USB
Člen
Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Nejsem si úplně jistý, ale myslím, že minimálně piny pro UART a I2C na GPIO u RPi jsou 3V3, takže bys teoreticky nepotřeboval žádný konvertor; jen bys na příslušná místa zapíchl kabely. Ale bylo by asi dobré to zkontrolovat.
Samozřejmě tu pak existuje kanón na vrabce ve smyslu
http://rpishop.cz/…hat-pro.html
Přesně tak. Piny na Raspberry Pi jsou na 3.3V a z TTL dostávám 5V a tím pádem by to Raspberry Pi nesneslo. Proto na to musí být redukce, ať už přímo na piny nebo rovnou na USB. Pro mne je samozřejmě lehčí koupit redukci na USB. Jen si nejsem úplně tak jist, zda bude tato redukce bez problému fungovat a emulovat v linuxu /dev/ sériové zařízení
Těžko říci, zda na ni mají v Raspbianu ovladače. Ono na tyhle USB-TTL redukce jsem občas potřeboval myslím i ovladač pro Windows.
No já právě doufám, že se to v linuxu bude tvářit jako klasický sériový port, stejně jako se to tváří ve druhém odkazu z prvního postu.
Zdravím,
pokud chceš rozchodit komunikaci mezi PC a RPi, tak nejlepším řešením je použít ten převodník USB -> UART, kterej ti už na výstup dá sériová data v 3.3V úrovni (např. nějaký modul s FT232R).
Osobně si nemyslím, že by ti systém evidoval převodník jako sériový port bez ovladačů. PC totiž při posílání dat po USB musí vědět, kam má jaká data zapsat (do jakých registrů apod.) a to OS sám od sebe nezjistí. Nejedná se přitom pouze o data, která mají dojít až k mikrokontroléru, ale i o konfiguraci UARTu apod.
Co se týče ovladačů, ty se dají stáhnout od výrobce konkrétního čipu a u Winů obvykle není problém. Vzhledem k tomu, že s Linuxem nemám zas tak moc zkušeností, tak jsi nejsem jistej, jak je to u různých distribucí, což by mohlo problém zkomplikovat. V případě FT232R lze na stránkách FTDI najít ovladač pro Ubuntu. Jakmile máš ovladač nainstalovaný, tak by se převodník měl tvářit jako sériový port.
Na straně OS v RPi by jinak neměl být problém, protože ten je připojený přes UART.
Snad to trochu pomůže.
Převodník přišel a funguje v pořádku. (windows i linux ho detekovali a tváří se, že s ním i komunikují). Problém ovšem je v samotné UART komunikaci. Koupil jsem si čtečku http://www.soselectronic.cz/?… (je tam i odkaz na PDF dokumentaci), připojil jí přes převodník do USB, ale nejsem si úplně jist, zda-li chápu způsob komunikace. Našel jsem java knihovnu https://github.com/…al-connector a napsal jednoduchý prográmek
public static void main(String[] args) {
SerialPort serialPort = new SerialPort("COM6");
try {
serialPort.openPort();
serialPort.setParams(9600, 8, 1, 0);
byte[] wr = new byte[2];
wr[0] = 0;
wr[1] = 0;
// dle dokumentace příkaz "Link"
serialPort.writeBytes(wr);
byte[] buffer = serialPort.readBytes(2);
serialPort.closePort();
for (byte el : buffer) {
System.out.print((char) el);
}
} catch (SerialPortException ex) {
System.out.println(ex);
}
}
Bohužel nedostávám žádnou odpověď. Chápu a dělám to správně ? Nebo nějaký jiný nápad, kde může být chyba ?
Zkouším s Docklightem a tváří se, že také nereaguje. Nástroj neznám, ale přijde mi dost jednoduchý. Nicméně raději přikládám screenshot nastavení a dotazů. Do send sequence jsem přidal nový požadavek na HEX 00 00 a poslal. Předpokládám, že hned na to, bych měl dostat RX o stejných hodnotách (dle dokumentace čtečky).
Co to tedy znamená ? Špatný kus ?
Zkus ještě zkontrolovat zapojení - počítám, že víš, že se propojuje RX na TX a opačně.
Taky zkus jestli to něco pošle po přiložení karty /čipu.
No a pak taky zkus ten USB převodník - propoj piny RX a TX - mělo by ti to na
Docklight vracet to, co z něj pošleš.
Teď se dívám, že máš špatný formát příkazu - poskládej ho podle
UART protocols/Command frame z toho pdf.
Mně bylo divné, že by ta komunikace byla tak "amatérská"
Přehození z RX na TX by snad mělo být řešené v přímo v redukci ne ? Alespoň já to tak chápu a připojoval jsem na RX vývod z redukce RX čtečky a na TX vývod z redukce TX čtečky. Nicméně zkusil jsem to přehodil a nepomohlo to. Také jsem zkoušel propojit piny na redukci a opravdu redukce fungovala.
A ten formát příkazu... je to tedy pokud to správně chápu to, co jsem nastavil jen s počátečním identifikátorem 0x02 a konečným 0x03 že ? Bohužel ani když pošlu 02 00 00 03, nedostanu žádnou odpověď.
Čip také zkouším, žádná reakce.
Alespoň já to tak chápu a připojoval jsem na RX vývod z redukce RX čtečky a na TX vývod z redukce TX čtečky
Chápeš to špatně
Tx - transmiter(vysílač)
Rx - receiver (přijímač)
takže vyslaný signál vysílačem jednoho zařízení přijímá
přijímač druhého
ty propojuješ přijímač s přijímačem a vysílač s vysílačem
je to tedy pokud to správně chápu to, co jsem nastavil jen s počátečním identifikátorem 0x02 a konečným 0x03 že ? Bohužel ani když pošlu 02 00 00 03, nedostanu žádnou odpověď.
zase jsi to nepochopil dobře - tak jednoduché to není
tvar bude konkrétně pro příkaz "Link" vypadat asi takto
0x02 0x01 0x00 0x00 0x?? 0x03
podrobně:
bajty zprávy jak jdou za sebou
0x03 (STX) - start frame
0x01 (ID )- adresa čtečky defaultně 0x01
0x00 (typ zprávy) zde "Link"
0x00 (data lenght) počet bajtů dat (pokud jsou - jinak 0)
zde by bylo n bajtů dat, kdyby data lenght nebyl nulový
0x?? (BCC) kontrolní součet - asi něco jako CRC
0x03 (ETX) end frame
bohužel ti neporadím, jak se počítá to BCC - nikde to nemůžu
najít,
ale zkus CRC - https://www.ghsi.de/CRC/
ale pozor CRC počítej jen z části STX-Data - tady konkrétně z 0x02 0x01 0x00 0x00
a ještě technická - používej tlačítko "odpovědět" - dostanu upozornění, jinak si to můžu přečíst třeba za týden
Dobrá, tak jsi měl ve všem pravdu Přehodil jsem TX/RX, přidal jsem defaultní adresu čtečky a XOR kontrolní součet a začal jsem dostávat odpovědi od čtečky.
Našel jsem si funkce, které mi vypočítají BCC (Block Check Character)
public static byte xor(byte[] data) {
String xorData = new String(data.clone());
return xor(xorData);
}
public static byte xor(String data) {
char[] chars = data.toCharArray();
return xor(chars);
}
public static byte xor(char[] data) {
char[] chars=Arrays.copyOf(data, data.length);
for (int i = 1; i < chars.length; i++) {
chars[0] ^= chars[i];
}
return (byte) chars[0];
}
Na link, reset a baudrate funguje vše v pořádku, Pro příkaz na Buzzer Control mají špatně příkladovou dokumentaci, nicméně po opravě funguje také. Request card mi nefunguje, ovšem to může být způsobeno tím, že tagy které u sebe mám mohou být S20 (Mifare mini), které nejspíš tato čtečka nepodporuje.
Každopádně díky za pomoc, bez ní bych se tu s tím mořil asi dalších pár dnů
Jinak ještě... proč to dělat jednoduše, když to jde složitě
public static byte xor(byte[] data) {
byte[] bytes=Arrays.copyOf(data, data.length);
for (int i = 1; i < bytes.length; i++) {
bytes[0] ^= bytes[i];
}
return (byte) bytes[0];
}
Zobrazeno 15 zpráv z 15.