Article View: pl.comp.os.linux.programowanie
Article #72842Re: Czekanie na wolny bufor portu szeregowego - co robię źle?!?
From: Bogdan (bogdro)
Date: Sat, 07 Jul 2018 13:41
Date: Sat, 07 Jul 2018 13:41
64 lines
3717 bytes
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-mailReferences:
<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