RS232
5 отговора
0 прегледа
RS232
имам периферно устройство което подава ТХ сигнал от време на време.
ако сложа readfile в таймер то когато устройството не подава имам 0 което си е и нормално но е дразнещо.
та въпросът ми е има ли механизъм с който да резбера че RS буферът ми е пълен и тогава да го чета.
всяко четене на буфера изтрива ли го
ако сложа readfile в таймер то когато устройството не подава имам 0 което си е и нормално но е дразнещо.
та въпросът ми е има ли механизъм с който да резбера че RS буферът ми е пълен и тогава да го чета.
всяко четене на буфера изтрива ли го
Re: RS232
Извинявай, Светльо, може би ще кажа нещо, което няма да ти хареса, но очевидно ти не си много наясно нито с COM портовете, нито с програмирането под Windows / Delphi. Препоръчвам ти да използваш някой готов компонент за работа с COM портове. Избери си от тук някой безплатен и с отворен код.
А иначе на твоя въпрос - вместо да се въртиш като пумпал и да четеш на сляпо от порта дали е дошло нещо, трябва да чакаш да те извести системата, че има получени данни. Виж функцията WaitCommEvent. За да става това както трябва, трябва да си наясно с многонишковото програмиране и overlaped i/o. Ако ще си пишеш сам нещата - запознай се добре с тия две работи. Също така ти трябват и малко познания за това що е то COM порт (UART) и как работи. "Подаване на ТХ сигнал" е странно понятие. Устройството или подава данните директно, или пък подава заявка (изясни си за RTS, DTR, CTS, DSR, Xon, Xoff, hardware и software flow control). COM порта има буфер (той има хардуерен от например 16 байта, който операционната система ти разширява). Когато четеш без вътре да са постъпили данни нищо няма да ти се запише в буфера. Ако той преди това ти е бил нулиран - пак ще си е нулиран. А функцията ще ти върне код на грешка, който ти трябва да си проверяваш. Когато прочетеш постъпили в буфера данни, те се махат от там. Когато буферът се препълни - губиш непрочетени данни.
Успех с ученето!
Linux isn't free, it's worthless.
А иначе на твоя въпрос - вместо да се въртиш като пумпал и да четеш на сляпо от порта дали е дошло нещо, трябва да чакаш да те извести системата, че има получени данни. Виж функцията WaitCommEvent. За да става това както трябва, трябва да си наясно с многонишковото програмиране и overlaped i/o. Ако ще си пишеш сам нещата - запознай се добре с тия две работи. Също така ти трябват и малко познания за това що е то COM порт (UART) и как работи. "Подаване на ТХ сигнал" е странно понятие. Устройството или подава данните директно, или пък подава заявка (изясни си за RTS, DTR, CTS, DSR, Xon, Xoff, hardware и software flow control). COM порта има буфер (той има хардуерен от например 16 байта, който операционната система ти разширява). Когато четеш без вътре да са постъпили данни нищо няма да ти се запише в буфера. Ако той преди това ти е бил нулиран - пак ще си е нулиран. А функцията ще ти върне код на грешка, който ти трябва да си проверяваш. Когато прочетеш постъпили в буфера данни, те се махат от там. Когато буферът се препълни - губиш непрочетени данни.
Успех с ученето!
Linux isn't free, it's worthless.
Re: RS232
с COM съм напълно наясно а с делфито се справям добре
Но проблемът е " че се въртиш като пумпал и да четеш на сляпо от порта ".
Програмирам матрица на Xillinx и ми трябва тази връзка. намерих подходящата функция в ComStat
procedure TF_SerAPI.Timer1Timer(Sender: TObject);
var
InBuf, OutBuf : Integer;
ComStat : TComStat;
e : DWord;
begin
if ClearCommError(Cid,e,@ComStat) then
begin
if(ComStat.cbInQue>0) then button6.Click;;
end;
тя ми дава колко непрочетен байта имам в буфера
а във button6 ми е кодът readfile
В този кит на Xillinx не се използват RTS, DTR, CTS, DSR а само RXD TXD
Необходимо е да се чете шибаната документация.
благодаря
Но проблемът е " че се въртиш като пумпал и да четеш на сляпо от порта ".
Програмирам матрица на Xillinx и ми трябва тази връзка. намерих подходящата функция в ComStat
procedure TF_SerAPI.Timer1Timer(Sender: TObject);
var
InBuf, OutBuf : Integer;
ComStat : TComStat;
e : DWord;
begin
if ClearCommError(Cid,e,@ComStat) then
begin
if(ComStat.cbInQue>0) then button6.Click;;
end;
тя ми дава колко непрочетен байта имам в буфера
а във button6 ми е кодът readfile
В този кит на Xillinx не се използват RTS, DTR, CTS, DSR а само RXD TXD
Необходимо е да се чете шибаната документация.
благодаря
Re: Сори
за нищо, въпросът ми бе некоректно зададен.
правя дипломна работа - електронен осцилоскоп на базата FPGA Spartan 3a на Cillinx.
В самия кит има вградено 14 битово 2-канално АЦП на 3Msps и 4 канален 12 битов ЦАП, RS232, VGA, PS2
но всичко се синтезира софтуерно а при компилирането се превръща в хардуерна схема /не съм фен на готовите кодове , обичам сам да си ги пиша/
Между другото съм системен инженер на една Linux система за промишлено управление в АЕЦ и невороятното е че 6 години работи безотказно и без изключване. Но незнам защо през 1месец трябва да ярестартирам профилактично иначе блокира. Сименсци ми обясниха че имало вграден брояч на часове- нормално ли е това
Поздрави
правя дипломна работа - електронен осцилоскоп на базата FPGA Spartan 3a на Cillinx.
В самия кит има вградено 14 битово 2-канално АЦП на 3Msps и 4 канален 12 битов ЦАП, RS232, VGA, PS2
но всичко се синтезира софтуерно а при компилирането се превръща в хардуерна схема /не съм фен на готовите кодове , обичам сам да си ги пиша/
Между другото съм системен инженер на една Linux система за промишлено управление в АЕЦ и невороятното е че 6 години работи безотказно и без изключване. Но незнам защо през 1месец трябва да ярестартирам профилактично иначе блокира. Сименсци ми обясниха че имало вграден брояч на часове- нормално ли е това
Поздрави
Re: Сори
Знае ли човек... Изглежда странно. Ако рестартирането се налага заради този "брояч на часове", значи нещо не е наред още с дизайна на системата. Може да се е налагало заради някакви хардуерни ограничения на платформата, ако е нещо различно от PC?! Иначе подобна практика за регулярно рестартиране на сървъри наистина се практикува (най-очебийният пример, за който се сещам е Гугъл), когато имаш множество сървъри и load balancing между тях. Тъй като софтуерът не е перфектен (дори и този на Гугъл) с рестартирането на машините се елиминират разни resource и memory leaks. Абе "нормално" е едно доста условно понятие 
Linux isn't free, it's worthless.
Linux isn't free, it's worthless.