🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #72842

Re: Czekanie na wolny bufor portu szeregowego - co robię źle?!?

#72842
From: Bogdan (bogdro)
Date: Sat, 07 Jul 2018 13:41
64 lines
3717 bytes
W dniu 05.07.2018 o 10:11, spryciarzsprytny7@gmail.com pisze:
> Witam
> Piszę obsługę portu szeregowego w C++ z użyciem Linux Api. 2 obiekty klasy PortSzeregowy mają równolegle zapisywać i odczytywać ten port. Odczyt i zapis generalnie działa. Jednak chcę zapewnić działanie tej kasy (PortSzeregowy) w warunkach ekstremalnych (pod dużym obciążeniem). Dlatego nie robię tej komunikacji na timerach tylko na blokadzie pselect. Ta blokada działa w przypadku odczytu z portu, jednak analogiczny kod nie działa w przypadku zapisu.
> 
> Po prostu pselect (funkcja SerialPort::send()) nie zatrzymuje się w momencie gdy bufor wyjściowy portu jest pełen (gdy jest wywoływana przed odczytem). Poniżej zamieszczam funkcje zapisu i odczytu z portu szeregowego. Jeśli to możliwe to proszę o pomoc w zdiagnozowaniu powodu nie zatrzymywania się pselect (funkcja SerialPort::send()) w przypadku gdy bufor wyjściowy portu szeregowego jest pełen.
> 
> z góry dzięki i pozdro
> Jacek


 Funkcja select() i pochodne usuwają deskryptory ze zbiorów.
Przypuszczam, że po pierwszym "trafieniu" kolejne wywołania sprawdzają
już puste zbiory. Musisz robić FD_SET (a najlepiej też FD_ZERO) w
każdej iteracji pętli, przed wywołaniem pselect().


> void SerialPort::receive()
> {

[...]

>     FD_ZERO(&lFileDescriptorSet);
>     FD_SET(mPortDescriptor, &lFileDescriptorSet);
> 
>     while(true)
>     {
>         int lRes = pselect(mPortDescriptor + 1, &lFileDescriptorSet, NULL, NULL, &timeout, &orig_mask);

[...]

> 
> void SerialPort::send()
> {

[...]

>     FD_ZERO(&lFileDescriptorSet);
>     FD_SET(mPortDescriptor, &lFileDescriptorSet);
> 
>     int lNumberToAquire(0);
>     while(true)
>     {
>         lNumberToAquire = 0;
>         if(mBufferEnd > mBufferStart)
>             lNumberToAquire = mBufferEnd - mBufferStart;
>         else if(mBufferEnd < mBufferStart)
>             lNumberToAquire = mSendBuffer.size() - mBufferStart;
>         if(lNumberToAquire <= 0)
>             lNumberToAquire = 1;
> 
>         int lFreeSpaceSize = 0;
>         ioctl(mPortDescriptor, TIOCOUTQ, &lFreeSpaceSize);
>         if(lFreeSpaceSize <= 0) // we must wait for serial port
>         {
>             int lRes = pselect(mPortDescriptor + 1, NULL, &lFileDescriptorSet, NULL, &timeout, &orig_mask);

[...]


-- 
Pozdrawiam/Regards - Bogdan                     (GNU/Linux & FreeDOS)
Kurs asemblera x86 (DOS, GNU/Linux):            http://bogdro.evai.pl
Grupy dyskusyjne o asm:  pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32
www.Xiph.org www.TorProject.org  Soft(EN): http://bogdro.evai.pl/soft
Technical Details
Message-ID: <5b40c2ff$0$602$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <691200d3-8311-4c65-a7a5-f3f0820760c6@googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-02.news.neostrada.pl!unt-spo-b-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
Subject: Re: Czekanie na wolny bufor portu szeregowego - co
 robię źle?!?
Newsgroups: pl.comp.os.linux.programowanie
References: <691200d3-8311-4c65-a7a5-f3f0820760c6@googlegroups.com>
From: "Bogdan (bogdro)" <bogdan@poczta.gazeta.pl>
Date: Sat, 7 Jul 2018 15:41:18 +0200
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:45.0) Gecko/20100101 Thunderbird/45.8.0
MIME-Version: 1.0
In-Reply-To: <691200d3-8311-4c65-a7a5-f3f0820760c6@googlegroups.com>
Lines: 64
Message-ID: <5b40c2ff$0$602$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 89.64.61.137
X-Trace: 1530970879 unt-rea-a-02.news.neostrada.pl 602 89.64.61.137:47610
X-Complaints-To: abuse@news.neostrada.pl
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit