Stránka 1 z 2

presmervanie dát v počítači z COM do súboru

Napsal: 06 bře 2021, 12:02
od samec
Data posielané z Arduina do počítača som presmeroval pomocou skriptu do súboru.
skript.bat

Kód: Vybrat vše

MODE COM5: BAUD=9600
type COM5: >> data.log
pause

Otázka je, ako prenos a presmerovanie korektne ukončiť.
Ak po skončení vysielania dát Arduinom odpojím USB kábel, alebo ak zavriem okno so skriptom, tak časť dát sa neuloží.

Napsal: 06 bře 2021, 13:33
od PotPalo
Ctrl-C nefunguje? Tie neuložené dáta ale môžu čakať na strane vysielača v bufferi, takže to by sa muselo riešiť na druhej strane.

Napsal: 06 bře 2021, 14:39
od Zaky
Místo skriptu si napiš prográmek, co otevře port a bude ukládat do souboru, testuj si přijatá data a před ukončením si z Arduina pošli nějaký unikátní řetězec, že se má příjem dat ukončit, ten si dekóduješ a uzavřeš a uložíš soubor. Napsat commandlinový prográmek tohoto typu je i zcela bez zkušeností s přístupem ke Google záležitost řádu hodin a posuneš si možnosti té PC strany úplně někam jinam. Můžeš použít třeba Visual Studio, nebo cokoli jiného.

Napsal: 06 bře 2021, 14:54
od rnbw
Prikaz type skonci po prijati ASCII znaku EOF (0x1a).

Napsal: 06 bře 2021, 17:56
od samec
Hej, celý orloj si nainštalujem do počítča kvôli pár bajtom zo seriovej linky.

Potrebujem skopirovať do počítača pamäť 93C66C.
Malo by to byť 256 16-bitových hodnôt.
Zatiaľ som len skúsil poslať nejaké generované hodnoty do počítača.

Kód: Vybrat vše

unsigned int i = 0;

void setup() {
  Serial.begin(9600);
  pinMode(6, INPUT_PULLUP);  //tlacidlo start zapojene medzi pin 6 a zem
  while(HIGH == digitalRead(6)){};  //cakanie na start
  i = 256;
}

void loop() {
  if(i){
    i--;
    Serial.println(i,HEX);
    delay(10);
  }
  else{
    Serial.end();
  }
}

Súbor s prijatými dátami má 512 bajtov. V prvom riadku je FF v poslednom 80. Každý riadok má 4 bajty - 2 znaky FF až 80 a 0x0D0A (nový riadok).
Druhá polovica dát zostala kdesi v buffri. Ale určite nie na strane Arduina. Tam sa toľko nezmestí.

Ak zvýšim počiatočnú hodnotu i=512, tak súbor má 2048 bajtov. V prvom riadku je 1FF, v poslednom 40.

Napsal: 06 bře 2021, 17:58
od Zaky
Tak to máš říct hned. Stáhni si hercules setup utility a tam si to do toho souboru z portu odchyť.

Napsal: 06 bře 2021, 19:46
od samec
Herkules nejde ani toľko čo skript cez prikazovy riadok. Ani len Arduino nechce posielať dáta.
Mám tu Herkules Version 3.2.8, nastavené Name COM5, Baud 9600, Data size 8, Parity none, Handshake OFF, Mode Free. Kliknem na open, na Arduine blikne LED. Ale keď spustím posielanie dát z Arduina, tak ani len neblika LED na Arduine. Nič sa neposiela. Cekom nič. Len zabité dve hodiny zo života.

Napsal: 06 bře 2021, 20:02
od Zaky
Herkules mám ověřený, pouze je třeba při rychlém sypání velkého objemu dat logovat do souboru a ne zobrazovat do okna, což jsem ti psal. Tzn. tvé dvě ztracené hodiny jsou způsobené problémem mezi židlí a klávesnicí :-) Při přenosu přes UART je přece vysílací straně úplně putna, jestli někdo poslouchá, nebo ne, takže jestli ti to neposílá, tak máš problém na straně Arduina.

Napsal: 06 bře 2021, 20:18
od rnbw
Zaky píše:Při přenosu přes UART je přece vysílací straně úplně putna, jestli někdo poslouchá, nebo ne

Plati za predpokladu, ze je vypnuty flow control.

Napsal: 06 bře 2021, 20:41
od samec
Tak ešte pre úplnosť dodám, že používam Arduino Leonardo, presnejšie jeho minimalisticku neoficiálnu verziu Arduino pro micro z eBay. Podstatný je čip MEGA 23U4. A ešte dodám, že mám Windows 10. A týmto, spolu s predchádzajúcim výpisom programu, je popis môjho problému dúfam úplný.

Stále tvrdím, že problém je nejaký windowsový buffer sériového portu, v ktorom zostanú vsieť neuložené dáta. Očakávam riešenie vo forme vyprázdnenia tohto buffera pred ukončením presmerovania, nejakým korektným zatvorením portu. Alebo nejako zakázať buffering.

Bez toho to samozrejme viem obsrať poslaním nadbytočných dát, aby sa tie podstatné dostali z buffera do súboru. Ale krajšie sa tento spôsob pomenovať nedá.

Napsal: 06 bře 2021, 20:47
od Zaky
Popis není úplný, chybí v něm právě to zmíněné řízení toku, je vypnuté? Používáš pouze jednosměrný přenos z Arduina do PC, opačně nic? Herkulesem jsem nalogoval do souborů při jednom projektu řekněme několik desítek MB dat a nikdy nic nechybělo. Pokud máš pochybnosti, tak ti nezbývá, než data odchytit osciloskopem a porovnat, zda se chybějící data skutečně neodvysílala, nebo odvysílala, ale nepřijala. Pokud pořád řešíš tu paměť, tak ještě můžeš ubastlit primitivní HW a použít SW Ponyprog.

Napsal: 06 bře 2021, 20:49
od PotPalo
Čo si pamätám, tak niekde v správcovi zariadení sa dalo zakázať FIFO, či medzipamäť, či ako to bolo nazvané. Ale pod XP. Ako to majú novšie Winy neviem, treba pohľadať.

edit: Je to pod nastavením portu pod tlačítkom "Upresniť...". Tam sa dá celá FIFO vypnúť.

Napsal: 06 bře 2021, 20:55
od lesana87
Zjevně nekomunikuje s PC přes sériák ale přes USB, tomu samozřejmě chybějící / neodpovídající druhá strana vadit bude. Jak si ten Hekules poradí s virtuálním sériákem na USB?

Napsal: 06 bře 2021, 20:58
od Zaky
Herkulesu virtuální sériák nevadí, používám s ním běžně různé konvertory sériák/USB. Ovšem jestli je nějak doprasený VCP driver k tomu Arduinu, to je ve hvězdách a bez fyzického přístupu k UART linkám těžko něco radit.

Napsal: 06 bře 2021, 21:03
od samec
Zaky píše:Popis není úplný, chybí v něm právě to zmíněné řízení toku, je vypnuté? Používáš pouze jednosměrný přenos z Arduina do PC, opačně nic?
To je snáď jasné z výpisu programu.
Zaky píše:Pokud máš pochybnosti, tak ti nezbývá, než data odchytit osciloskopem a porovnat, zda se chybějící data skutečně neodvysílala, nebo odvysílala, ale nepřijala.
A kam mám ten osciloskop pripojiť na USB kábel?
Zaky píše:Pokud pořád řešíš tu paměť, tak ještě můžeš ubastlit primitivní HW a použít SW Ponyprog.
Načo mám bastliť HW, keď mám Arduino?