Ahoj, u jsem to zde kdysi okrajově řešil, ale teď je to trochu v jiné situaci (bohužel ani tehdy to nebylo uspokojivě vyřešeno, ale snad nyní...). Už jsem nad tím strávil mnoho večerů, ale bez úspěšně. O co jde. Mám MCU, který mi přes sériovou linku do počítače posílá nějaká data - zprávy v průměru dlouhé cca 70 bajtů, několikrát do minuty, někdy velmi rychle za sebou, někdy s prodlevou minuta. A tato data potřebuji uložit do mysql, každou zprávu samostatně.
Pokud použiji v terminálu cat /dev/ttyS0, vše je v pořádku a žádná data se nikdy neztratila. Pokud je chci jakkoli zpracovávat, počítač nestíhá data ze sériového portu číst a dochází k jejich ztrátám. I třeba jen v situaci, kdy to echem zpětně vypisuji (tedy vůbec nedochází ještě k zápisu do db). S stty jsem už tak zžitý, že jej znám snad do detailu, ale ani to řešení nepřineslo. Co jsem už zkusil:
1. různé nastavení přenosové rychlosti
2. různé stopbity a počet bitů včetně parity
3. zpracování v shellu stylem while read /dev/ttyS0 i cat /dev/ttyS0|while read apod.
4. využití logtty
5. využití céčka, kde jsem v prg nastavil buffer od 256 až po 1024, ale také to nepomohlo (kód viz níže), zkoušel jsem od výpisu do souboru až po výpis na terminál
6. různé kombinace rour s využitím mkfifo
Nemáte někdo nějaké řešení? Už nevím kudy kam, nemyslím si, že je to HW problém, protože těch dat zase tak moc přeneseno není a tohle přece počítače zvládat musí... Jsem si vědom, že dělám někde chybu, ale už nevím kde:( Na Google jsem našel pár podobných dotazů, ale uspokojivé řešení nikde. UART podle mne data přijme, jádro taky, ale aplikačka je nestihne načíst, tak se začnou v bufferu jádra přepisovat či ztrácet.. Podstatnou indicií je, že při pouhém cat do terminálu je vše zcela OK.
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions *///Spousta includů
#define BUFSIZE 512
char buf[BUFSIZE];
int main(int argc, char ** argv) {
int count;
int port = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
int log = open("/serial.log",O_CREAT | O_WRONLY | O_APPEND);
while (1) {
count = read(port,buf,BUFSIZE);
write(log,buf,count);
}
return 0;
}