Автор Гілка: програмування СОМ-порта  (Прочитано 7662 раз)

Відсутній vanessa

  • Графоман
  • ****
  • дописів: 468
  • Карма: +0/-0
Re: програмування СОМ-порта
« Відповідей #15 : 2008-09-03 22:25:45 »
Зробив я от таку обгортку для read
int myread(int fPort,void *buf,int len)
{
    int i,s;
    char *b;
    s=0;
    b=buf;
    do
    {
        i=read(fPort,b,len);
        len-=i;
        b  +=i;
        s+=i;
    } while(len && i);
    return s;

}
тепер думаю: заспокоїтися чи ще покопати ?
« Змінено: 2008-09-03 22:27:20 від vano_vvv »

maranoid

  • Гість
Re: програмування СОМ-порта
« Відповідей #16 : 2008-09-08 21:23:43 »
>пробував. тоді воно працює в неблокованому режимі і на VMIN та VTIME йому начхати. якщо я сам >витримую паузу 40мілісекунд після виклику write, а потім роблю read - все нормально, відповідь або вже >є або немає. тільки мені чомусь такий підхід неподобається. може тому що втрачається зайвих 5-10 >мілісекунд. Деколи цього часу може не вистасчити
Замість очікування 40 мс можна використовувати таймер. Таймери та неблокуючі операції - то є тру вей :)

Відсутній fen

  • Новачок
  • *
  • дописів: 3
  • Карма: +0/-0
  • Centos 7
Re: програмування СОМ-порта
« Відповідей #17 : 2008-10-02 09:39:35 »
Ось подивись на цю программу я думаю це те що тобі треба
http://www.geocities.com/pbmcrae42/readregu.html

Відсутній vanessa

  • Графоман
  • ****
  • дописів: 468
  • Карма: +0/-0
Re: програмування СОМ-порта
« Відповідей #18 : 2008-10-02 10:46:00 »
      while(bytes_received < bytes_required)
       {        
         read(ttyfd,&rxchar,1);
        
         if (rxchar != -1)
         {
           recv[bytes_received] = rxchar;  
           printf("%s%d\n","char rx ",rxchar);
           bytes_received++;
           printf("%s%d\n","bytes received ",bytes_received);
         }  
        
        
                            
         time(&finish);
        
         diff_time = difftime(finish,start);
                      
         if(diff_time > timeout)
         {
           printf("timeout \n");
           error_flag = TRUE;
         }
       } /* end while */                              
як намене оцей фрагмент намертво завісить програму у випадку коли не буде відповіді. У мене переривання комунікацій - нормальна ситуація, нічого страшного тут немає. навіть більше, та документація, яка реграментує порядок обміну із моїм пристроєм говоротить що один збій в зв'язку на 8 годин неперевної роботи - це нормально. Це по-перше, а по-друге, ну це вже особливості мого протоколу обміну, у мене -1 нормальні дані. Це що до першого if, краще б було написати так
if(read(ttyfd,&rxchar,1))
і далі по тексту.


так що звісно дякую за лінк але воно мені слабо допоможе....
« Змінено: 2008-10-02 10:49:36 від vano_vvv »

Відсутній fen

  • Новачок
  • *
  • дописів: 3
  • Карма: +0/-0
  • Centos 7
Re: програмування СОМ-порта
« Відповідей #19 : 2008-10-03 11:35:24 »
Згоден але ця проблема досить просто вирішуеться або при перевірці отриманих байт
while((bytes_received < bytes_required) && (!error_flag))або при перевірці таймауту
 
if(diff_time > timeout)
{
     printf("timeout \n");
     error_flag = TRUE;
     break;

}


« Змінено: 2008-10-03 11:43:26 від fen »

Відсутній vanessa

  • Графоман
  • ****
  • дописів: 468
  • Карма: +0/-0
Re: програмування СОМ-порта
« Відповідей #20 : 2008-10-03 13:34:35 »
1) я не кажу як це вирішити, я звертаю увагу на те, як воно було.
2) це все те ж саме неблоковане читання, нічого принципово нового.

Дякую, Іван.