Ето няколко отворени въпроса във въздуха, така че трябва да направя някои предположения, които може да са погрешни, но нека да видим.
Не знам каква библиотека за комуникационни портове използвате, така че предполагам, че е библиотеката CPort от SourceForge. Самият аз никога не съм го използвал, но прочетох, че е разпознат Unicode, така че можете да извиквате методите за запис с параметър unicodestring, който ще бъде преобразуван от библиотеката в ansistring преди изпращане. По подобен начин, когато получава ansistring от външния свят, библиотеката ще се преобразува в unicodestring за методите Read.
Поради асинхронния характер на серийната комуникация е важно да се разбере, че когато изпратите нещо, използвайки метода за запис, методът се връща незабавно, докато библиотеката и ОС изхвърлят символите един по един със скорост, определена от скоростта на предаване. В резултат на това вашият първи код никога не е получил нищо, защото вече сте се опитвали да четете от комуникационния порт, преди външното устройство дори да получи първия знак. Хубаво е да видите, че вече сте направили първата стъпка към успеха чрез внедряване на манипулатор на събития за (вероятно библиотечно събитие) OnRxChar.
OnRxChar вероятно се задейства за всеки знак (или няколко знака). Трябва да имате буфер, който е постоянен между тези събития. Локална променлива (каквато я имате сега и която е разпределена в стека) в манипулатора на събития не е постоянна, тя се губи всеки път, когато манипулаторът на събития излезе. Трябва да декларирате променливата Buffer като поле на TReaderProgrammer. Не знам защо дефинирахте буфера да бъде AnsiString, но ви предлагам да опитате с низ (реф. дискусия по-горе относно познаването на Unicode).
type
TReaderProgrammer = class
..
RxBuffer: string;
..
end;
Буферът трябва да бъде изчистен, когато изпратите нова команда към външното устройство, за да е готово да получи нови данни като отговор на вашата команда.
РЕДАКТИРАНЕ: Като алтернатива можете да изчистите RxBuffer незабавно, когато получите и обработите пълен отговор.
TReaderProgrammer.ComPort1RxChar трябва да изглежда така досега:
procedure TReaderProgrammer.ComPort1RxChar(Sender: TObject; Count: Integer);
var
RxData : string;
begin
(Sender as TComPort).ReadStr(RxData,Count);
RxBuffer := RxBuffer + Rxdata;
...
end;
Останалата част от манипулатора на събития е, предполагам, вероятно само за да видите напредъка на приемането, така че нищо повече за това.
person
Tom Brunberg
schedule
15.11.2014