Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Архив
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Проблема с COM-портом на Octagon’е

 Ответить Ответить
Автор
Сообщение
Nick_ Смотреть выпадающим
Новичок
Новичок


Присоединился: 28 Март 2006
Категория: Belarus
Online Status: Offline
Публикации: 8
Свойства публикации Свойства публикации   Ответить, цитируя автора - Nick_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Проблема с COM-портом на Octagon’е
    Опубликовано: 28 Март 2006 18:35
Есть проблемка с о связью через СОМ-порт на плате Octagon 5070. Может кто знает, какие там нюансы. На Fastwel CPU686E работает
Наверх
nick_user Смотреть выпадающим
Участник
Участник


Присоединился: 18 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - nick_user Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 30 Март 2006 08:23
Какого рода проблема? Какое ПО: на C++, SCADA или еще
на чем нибудь?

В некоторых BIOSах (мы сталкивались) по умолчанию не инициализируется буфер FIFO контроллера UART (задизаблен).
Нужно включить. Но это если вы мучаетесь на C++ и под DOS
(свои исходники для работы с COM-портом).
Наверх
Nick_ Смотреть выпадающим
Новичок
Новичок


Присоединился: 28 Март 2006
Категория: Belarus
Online Status: Offline
Публикации: 8
Свойства публикации Свойства публикации   Ответить, цитируя автора - Nick_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 31 Март 2006 09:48
Н...да. Именно на С++ и именно под DOS. А как этот буфер включить?
Наверх
nick_user Смотреть выпадающим
Участник
Участник


Присоединился: 18 Ноябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 54
Свойства публикации Свойства публикации   Ответить, цитируя автора - nick_user Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 31 Март 2006 10:02
Вот пример инициализации COM-порта:

#define PORT1       0x3F8
#define INTVECT1    0xC
#define PORT2       0x2F8
#define INTVECT2    0xB

void InstallCom1(long baud,int nbit,int parity,int stopbit)
{
   outp(PORT1+1,0);                      //запрещаем прерывания от UART
   oldvectCom1 = _dos_getvect(INTVECT1); //получаем старый вектор прерывания
   _dos_setvect(INTVECT1,SerialISR1);     //устанавливаем новый вектор прерывания
   outp(PORT1+3,0x80);                    //устанавливаем режим загрузки делителя
   //скорость передачи
   switch( baud )
   {
   case 110L:    baud = BR_110; break;
   case 150L:    baud = BR_150; break;
   case 300L:    baud = BR_300; break;
   case 600L:    baud = BR_600; break;
   case 1200L:   baud = BR_1200; break;
   case 2400L:   baud = BR_2400; break;
   case 4800L:   baud = BR_4800; break;
   case 9600L:   baud = BR_9600; break;
   case 19200L: baud = BR_19200; break;
   case 38400L: baud = BR_38400; break;
   case 57600L: baud = BR_57600; break;
   case 115200L: baud = BR_115200; break;
   default:      baud = BR_9600;
   }
   outp(PORT1+0, baud & 0xFF );           //загружаем младший байт делителя
   outp(PORT1+1,baud>>8);                 //загружаем старший байт делителя
   //кол-во бит
   switch( nbit )
   {
   case 5: nbit = bit_5; break;
   case 6: nbit = bit_6; break;
   case 7: nbit = bit_7; break;
   case 8: nbit = bit_8; break;
   default: nbit = bit_8;
   };
   //четность
   switch( parity )
   {
   case 0: parity = NoParity; break;
   case 1: parity = Odd;      break;
   case 2: parity = Even;     break;
   default: parity = NoParity;
   };
   //стоп-биты
   switch( stopbit )
   {
   case 1: stopbit = OneStopBit; break;
   case 2: stopbit = TwoStopBit; break;
   default: stopbit = OneStopBit;
   };
   outp(PORT1+3,nbit|parity|stopbit);     //настраиваем формат передачи: кол-во бит/паритет/стоп-бит
   outp(PORT1+2,0x07);                    //буфер FIFO - 1 байт, включаем буфер
   outp(PORT1+4,0x0B);                    //устанавливаем линии RTS, DTR, OUT1
   outp(0x21,inp(0x21)&0xEF);             //настраиваем регистр маски прерываний контроллера прер-й
   outp(PORT1+1,0x01);                    //разрешаем контроллеру UART прерывание по приему байта
};

Или второй вариант (не моё, идет на компашке вместе с I-7188):

#define Txbuf 0x00        /* tx buffer */
#define Rxbuf 0x00        /* rx buffer */
#define Dll      0x00        /* baud lsb */
#define Dlh      0x01        /* baud msb */
#define Ier      0x01        /* int enable reg */
#define Fcr      0x02        /* FIFO control register */
#define Iir   0x02      /* Interrupt Identification Register */
#define Lcr      0x03        /* line control reg */
#define Dfr      0x03        /* Data format reg */
#define Mcr      0x04        /* modem control reg */
#define Lsr      0x05        /* line status reg */

int InstallCom(int iPort,unsigned long lBaudRate,int iData,int iParity,int iStop)
{ int uart,i;
char ratehi,ratelo;
int cc;
int far *ComBase=(int far *)0x00400000L;
switch(iPort)     {
    case 1 :
      if(OldIntVect1) RestoreCom(1);
      iBase1=ComBase[0];
      return InstallCom1(lBaudRate,iData,iParity,iStop);
    case 2 :
      if(OldIntVect2) RestoreCom(2);
      iBase2=ComBase[1];
      return InstallCom2(lBaudRate,iData,iParity,iStop);
    default: printf("Error:PortError,(iPort=%d)",iPort); getch();
          return PortError;     /* port must 1/2 */
}
}

int InstallCom1(unsigned long baud, int data, int parity, int stop)
{ int cc;

err1=0;
cc=GetBaudData(baud,data,parity,stop);
if(cc) return cc;
/* _asm cli */          disable();
save232[0][2]=inp(iBase1+Lcr); /* format                 */
outp(iBase1+Lcr,0x80);      /* 1 set DLAB (baud rate)   */
save232[0][0]=inp(iBase1+Dll); /* baud rate              */
save232[0][1]=inp(iBase1+Dlh);
outp(iBase1+Dll,ratelo);
outp(iBase1+Dlh,ratehi);
outp(iBase1+Lcr,format);      /* 2. data format */
save232[0][3]=inp(iBase1+Ier); /* interrupt status*/

outp(iBase1+Fcr, 0x87);     /* 3. enable & clear FIFO */
outp(iBase1+Ier, 0x01);     /* 4. enable COM1 interrupt */
outp(iBase1+Mcr,0x0b);        /* set DTR line active      */

In_InIdx1=In_OutIdx1=Out_InIdx1=Out_OutIdx1=0; /* 5. init QUEUE */
OldIntVect1=IntVect[12];                      /* save old ISR */
IntVect[12]=(unsigned long)Serial1_Isr;        /* install new ISR */
outp(0x21,inp(0x21) & 0xef);    /* enable IRQ 4 for COM1 */
/*_asm sti */ enable();
return(NoError);
}


Если нужно, могу скинуть полные исходники по e-mail.
Наверх
Nick_ Смотреть выпадающим
Новичок
Новичок


Присоединился: 28 Март 2006
Категория: Belarus
Online Status: Offline
Публикации: 8
Свойства публикации Свойства публикации   Ответить, цитируя автора - Nick_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 31 Март 2006 12:01
скинь пожалуйста, заранее очень благодарен.
Nick.Klubnikov@tut.by
Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz