Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
Въпрос за Настройка на Сериен порт под стар Линукс 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Въпрос за Настройка на Сериен порт под стар Линукс
Имам следните настройки на сериен порт под стар Линукс. Сега ми трябва под уиндоус...
Мисля че са настройки на стандартен порт. С ехото ще се оправя. Не познавам добре линукса и не съм сигурен дали има нещо специфично.


Код:
        #include <termios.h>
.................................................
................................................
        cfsetispeed(&options, B9600);
        cfsetospeed(&options, B9600);
        options.c_cflag &= ~(HUPCL | CSIZE | PARENB | CRTSCTS);
        options.c_cflag |= CLOCAL | CREAD | CS8 | CSTOPB;
        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
        options.c_iflag &= ~(IXON | IXOFF | IXANY);
        options.c_oflag &= ~OPOST;
        options.c_cc[VMIN] = 0;
        options.c_cc[VTIME] = 1;
.........................



Тук има съкратено описание на- data structure containing terminal information https://www.mkssoftware.com/docs/man5/struct_termios.5.asp
Има ли нещо различно от нормалните настройки на ком порта под уиндоус ???

Този код е по разбран ... но не той ми трябва.


Код:

/* control options (c_cflag) &
     input baud (c_ispeed)        */
  options.c_cflag |= B9600 ;
 
  /* set baud rates */
  cfsetispeed( &options, B9600 );
  cfsetospeed( &options, B9600 );

  /* set character size */
  options.c_cflag &= ~CSIZE ;
  options.c_cflag |= CS8 ; /* character size 7bits */

  /* set parity checking */
  /*   options.c_cflag |= PARENB ;   */
  options.c_cflag &= ~PARENB ;
  /*   options.c_cflag |= PARODD ; */ /* parity odd */
  /* set stop bit */
  options.c_cflag &= ~CSTOPB ; /* stop bit 1 */


  /* enable the reciever and set local mode */
  options.c_cflag |= ( CLOCAL | CREAD );

  /* local options (c_lflag)       */

  /* canoncal input */
  options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
  /* options.c_lflag |= (ICANON | ECHO | ECHOE );*/

  /* input options (c_iflag) */
   
  /* enable input parity check */
    options.c_iflag |= ( INPCK | ISTRIP );
  /* options.c_iflag |= ( IGNPAR ) ;*/

  /* enable software flow control */
  options.c_iflag |= ( IXON | IXOFF );
  /* options.c_iflag &= ~( IXON | IXOFF | IXANY ); */
  /* ignore CR (for Lakeshore model 330) */
  /* options.c_iflag |= IGNCR ;*/

  /* output options (c_oflag) */

  /* not raw or raw output */
  /* options.c_oflag |= OPOST; */ /* not raw */
  options.c_oflag &= ~OPOST;  /* raw */
  /* Map NL to CR-NL(for Lakeshore model 330) */
/*  options.c_oflag |= ONLCR ; */

  /* control options (c_cc) */

  /* set read timeouts () available when noncanonical mode*/
  /*options.c_cc[4] = VEOF;
    options.c_cc[5] = VEOL;*/
  options.c_cc[VMIN] = 0;
  options.c_cc[VTIME] = 1;  /* 0.1 sec unit*/

  /* set the new options for the port */





Възможност за настройки под уиндоудс са ми такива:
Код:


Active:boolean;
ComPort:ComPort;
ComPortNo:word;
Terminal:CustomEdit;
TerminalUsage:TerminalUsage;
TerminalEcho:boolean;
MonitorCTS:Control;
MonitorDSR:Control;
MonitorRLSD:Control;
MonitorRing:Control;
TraceStates:TraceStates;
BaudRate:cardinal;
Parity:Parity;
StopBits:StopBits;
ByteSize:byte
EventChar:char
StreamProtocol:StreamProtocol
Timeouts:Timeouts;
DataProcessor:DataProcessor;
EnumPorts:ЕnumPorts;
Handle:Handle; {read only}
ModemSignals:ModemSignals; {read only}
CommProp:CommProp; {read only}
TotalReceived:cardinal; {read only}

TotalSent:cardinal; {read only}
ReadyForRead:cardinal; {read only}
NotYetSend:cardinal; {read only}
DeviceName:string; {read only}
BufferInSize:word;
BufferOutSize:word;
TimeoutRead:cardinal;
TimeoutWrite:cardinal;







Разчетох го така ... дано не съм объркал нещата.
Код:
options.c_cflag &= ~(HUPCL | CSIZE | PARENB | CRTSCTS); //   Hang up connection on last close, ??????? ,No_Parity , Disable hardware flow control,
        options.c_cflag |= CLOCAL | CREAD | CS8 | CSTOPB;    //,Local line - do not change 'owner' of port,Enable receiver,8bit, 2 stop bits (1 otherwise) ,
        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);// row,Disable echoing of input characters,~Echo erase character as BS-SP-BS,Disable SIGINTR, SIGSUSP, SIGDSUSP, and SIGQUIT signals,
        options.c_iflag &= ~(IXON | IXOFF | IXANY);//Disable software flow control-out,Disable software flow control-inc,Deny any character to start flow again
        options.c_oflag &= ~OPOST;   //ROW

_________________
Вниманиене съмвишист....ИЙ.


Вто Апр 26, 2022 6:38 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Имам още един въпрос.
Изпращане на команда setbreak се дъни с някой усб конвертори. Ползвал ли е някой изпращане на 0х00 с по нисък бод ???

_________________
Вниманиене съмвишист....ИЙ.


Вто Апр 26, 2022 10:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 8:59 pm
Мнения: 6019
Местоположение: София
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
"Изпращане на команда setbreak се дъни с някой усб конвертори. Ползвал ли е някой изпращане на 0х00 с по нисък бод ???"
Нормалните usb2ttl приемат и изпращат на съответните пинове всички EscapeCommFunction: https://docs.microsoft.com/en-us/window ... mmfunction
Но както си забелязал има и такива, които са обикновен микроконтролер с хардуерен ROM който само изпълнява Rx и Tx функциите и то не на всички бодове. Тоест при някой може даже да не можеш да изпратиш и "0х00 с по нисък бод", просто защото ROM-а не подържа напримерно бод 300. Аз даже имам преходник който не подържа USB CDC class: https://en.wikipedia.org/wiki/USB_commu ... vice_class ами информацията я прекарва през Low Speed HID: https://en.wikipedia.org/wiki/USB_human ... vice_class и от там драйвера прави "магията" да изглежда като COM port, но подържа съвсем ниски скорости и чат пат губи някой байт.
Та дали ще стане магията с "0х00 с по нисък бод" зависи и от устройството свързано към компютъра за колко милисекунди ниско ниво го отчита като setbreak.

"#include <termios.h>"
това доколкото виждам не е чист сериен порт, ами е библиотека, която WARP-ва част от функциите на сериния порт и има и собствени терминални функции (емулатор на терминал)

"BaudRate:cardinal;"
Това доколкото виждам също не е чист сериен порт, ами ми изглежда на компонент за Delphi който WARP-ва WinApi функциите на сериния порт.

Ето това е чист Windows COM PORT.
Communications Resources: https://docs.microsoft.com/en-us/window ... -resources
CommPort Example: https://docs.microsoft.com/en-us/window ... s-resource

Аз всъщност никъде не видях какво точно питаш т.е. какво имаш като SW и HW, и какво се опитваш да постигнеш.

_________________
Warriors of the Night, ASSEMBLER!!!


Сря Апр 27, 2022 12:41 am
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Ползвам една стара програма с връзка през сериен порт под линукс . Ще я пренапиша под уиндоус. Мисля че разбрах как са направени настройките на ком порта по линукса. 7,5 милисек. е setbreak-clrbreak-а и ще го направя с изпращане на нула.

_________________
Вниманиене съмвишист....ИЙ.


Сря Апр 27, 2022 2:11 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Съб Фев 06, 2016 7:29 pm
Мнения: 167
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Като алтернатива препоръчвам:
https://www.teuniz.net/RS-232/
https://gitlab.com/Teuniz/RS-232

Просто за изпозване и работи стабилно.


Сря Апр 27, 2022 7:51 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Имам проблеми с получаването и изпращането на данните . Трябват ми точно получени байтове с проверка. Всичко върви ОК когато броя байтовете съвпадат.
Но когато искам да се застраховам , от неочаквани проблеми нещата се омазват. Ако дойдат по малко на брой байтове ... функцията си ги чака и зависва докато не дойдат. Настройките на Кома TimeoutRead и TimeoutWrite в Борланда не мога да разбера как действат и по точно как да ги използвам.
Трябва ми някакво подобно решение ??? Има ли друг начин или по компактен код, без да ползвам таймер.


Код:
int ReadTimeOut=30;
TForm1::serial_read(void *buf, int len , int ReadTimeOut)
{
    int bytes_left = len,i;
    unsigned char *pbuf = (unsigned char*)buf;



    for(i=0;i<=30;i++)
                        {
    SleepEx(1,false);                                   // Търся през 1ms. получил ли съм точния брой байтове ... макс 35ms.
    if(len==.........->ReadyForRead) break;  //ReadyForRead  Дава ми текущия брой на приетите байтове ... и ако съвпада с точния брой излиза
    }
   if(i<30){
    ............->ReadSerialCom(pbuf,bytes_left);         // Проблема е че зависва докато не получи точния брой байтове, и само тогава ми отваря евънт 
                                                             //  ... ама вече тоя     евънт не ми                върши работа
    .................->Msg("Read was sucsesfully");
    return 1;
    }
    ...............->Msg("Read - TimeOUT");
return 0;
}


_________________
Вниманиене съмвишист....ИЙ.


Вто Май 03, 2022 2:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Това https://docs.microsoft.com/en-us/window ... ronous-i-o ще ти помогне.

п.п.
Винаги съм пускал комуникациите в отделна(и) нишка(и).

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Вто Май 03, 2022 3:56 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
syscop написа:
Това https://docs.microsoft.com/en-us/window ... ronous-i-o ще ти помогне.

п.п.
Винаги съм пускал комуникациите в отделна(и) нишка(и).


Няма шанс ... така ще се омотам!!!
Не им разбирам на Tread.

_________________
Вниманиене съмвишист....ИЙ.


Вто Май 03, 2022 4:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Не е толкова сложно. Представи една нишка като една цяла програма. Пускаш един цикъл вътре да следи комуникацията и чакаш да ти се съберат необходимите данни. През това време основната програма си работи и не се усеща, че някъде нещо е в blocking state. Ето съвсем елементарен псевдокод:
Код:
while(нишката_е_стартирана)
{
        ако_са_дошли_достатъчно_данни_от_rs232
        {
            копирай_или_обработи_данните
        }
}

Ако няма достатъчно данни основната ти програма няма да висне.

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Вто Май 03, 2022 5:03 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Имам един проблем компилатора на Borland с който ударих на камък.
TForm::Serial_send_cmd( int cmd, const void *data, int len_ght)
{

unsigned char buf[len+5]; //Трябва ми точно така за да мога да си подредя след това командата
buf[0] = BEL; / 0x07
buf[1] = (len_ght + 1) & 0xFFU;
buf[2] = cmd;
........
}

const void *data - *data трябва да сочи към / const unsigned char / навсякъде съм дефинирал data като const void. data не трябва да се променя.
вътре при всяко извикване на Serial_send_cmd си правя unsigned char buf[]; Трябва да си подредя синтаксиса на командата и да я пратя.

Но така не иска ... unsigned char buf[len_ght+7]; компилатора търси buf[] да бъде const

... приема само unsigned char buf[10];

Успявам да предефинирам data[]; така unsigned char *pbuf = (unsigned char*)data;
И така мога да се обръщам към data[]; само през указателя *pbuf .

Как да накарам да приеме unsigned char buf[len_ght+7]; да не иска да е тип константа а да е unsigned char (така изглежда че няма проблем- но не става???).
Не знам каква е връзката между това data да е constanta и условието вътрешно създаден unsigned char buf[]; да трябва да бъде константа ...
или в случая да няма променлива дължина на масива ... Ако имам представа за проблема вероятно бих до дефинирал по добре.

_________________
Вниманиене съмвишист....ИЙ.


Сря Май 04, 2022 11:13 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 8:39 pm
Мнения: 1954
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
https://stackoverflow.com/questions/983 ... const-char

_________________
Определянето стойността на дадена величина се нарича ИЗМЕРВАНЕ!


Сря Май 04, 2022 12:43 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Проблема е само от стария ми компилатора ... винаги иска при дефиниране масива да е с константа индекс.

_________________
Вниманиене съмвишист....ИЙ.


Сря Май 04, 2022 2:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 9:16 am
Мнения: 1705
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Защо не си заделиш динамично нужната памет за масива? А защо пък не и с std::vector или някой дериват на борланд.


Сря Май 04, 2022 2:16 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
По принцип стана така unsigned char *buf=new unsigned char[len+5];

и след това трия новия масив delete []buf;

не съм писал от години и сега ми е трудно ... не че съм знаел много :) ... Забравил съм му магариите ... Даже ми връща sizeof(buf) индекс а не бройя елементи .
Много е останало от паскала.

_________________
Вниманиене съмвишист....ИЙ.


Сря Май 04, 2022 3:21 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Нед Окт 19, 2008 6:26 pm
Мнения: 607
Мнение Re: Въпрос за Настройка на Сериен порт под стар Линукс
Отделих обработката на данните и серийната комуникация на отделен tread. Работи по добре , но не мога да се справя с едни 1mS забавяния по време на предаването на пакетите данни. Вървят по някакви подобни на кермит правила ... примерно данните се разделят по 1024 байта на групи те съответно по 256 байта пакети с данни.
През пакет от 256 байта се случват забавяния по време на предаването с около 1mS. По принцип не е фатално, но как да разбера къде е забавянето ... Другия софтуер под линукс върви гладко :( , но нямаше нужда да го казвам това.


Изображение

_________________
Вниманиене съмвишист....ИЙ.


Пет Май 20, 2022 5:44 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 8 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни