2014-11-15 2 views
0

Im пытается отправить команду разработчику. доска, а затем получить ответНевозможно получить ответ vir com port

EG

(меня) набор ATTRIB = да

(Dev. Board) OK

или

(Dev.) ERR

Но это не отскакивает назад ничего ... не OK или ERR

в то время как плата загрузки эхо на .. поэтому, если я посылать команды в то время как плата загрузки его он будет отскакивать назад 'set attrib = yes' и после загрузки «ERR», потому что вы не можете отправлять команды во время загрузки.

Моя лучшая догадка заключается в том, что он не читает ответ вовремя или пытается его прочитать слишком рано.

procedure TReaderProgrammer.Button2Click(Sender: TObject); 
Var 
    Buffer: AnsiString; 
    RxData: string; 
    Count : integer; 
begin 
    if ComPort1.Connected then 
    begin 
    ComPort1.WriteStr(edtSendText.Text+#13); 
    comport1.ReadStr(RxData,Count); 
    Buffer := Buffer + Rxdata; 
    memoRxData.Text := memoRxData.Text+Buffer+#13+#10; 
    end; 
end; 
+1

Вы не можете прочитать ответ в своем методе отправки. Получите данные в событии приема (вы должны использовать глобальный буфер), и когда получено достаточное количество данных (или символ # 10), интерпретируйте ответ. Вы также можете добавить таймер, чтобы получить уведомление о тайм-ауте, если ответ не получен вовремя. –

+0

Привет, Lu Rd, спасибо за ответ. У меня уже есть событие Receive, но оно не отображает данные, поэтому идентификатор мысли должен читать снова, но теперь я вижу, что это был метод, который я использовал для отправки данных. @LU RD –

ответ

3

Вот несколько открытых вопросов в воздухе, поэтому я должен сделать некоторые предположения, которые могут быть неправильными, но давайте посмотрим.

Я не знаю, какую библиотеку коммуникационных портов вы используете, поэтому я предполагаю, что это библиотека CPort от SourceForge. Я никогда не использовал его сам, но я прочитал, что это сделано в Unicode, так что вы можете вызвать методы write с параметром unicodestring, который будет преобразован библиотекой в ​​ansistring перед отправкой. Аналогично, когда вы получаете передачу из внешнего мира, библиотека будет конвертировать в unicodestring для методов Read.

Из-за асинхронного характера последовательной связи важно понимать, что когда вы отправляете что-то с помощью метода write, метод возвращается немедленно, когда библиотека и ОС выплевывают символы по одному в то время в темпе, определяемом скорость передачи в бодах. В результате ваш первый код так и не получил ничего, потому что вы уже пытались прочитать из коммуникационного порта, прежде чем внешнее устройство даже получило первый символ. Хорошо видеть, что вы сделали первый шаг к успеху, выполнив обработчик событий (предположительно событие библиотеки) OnRxChar.

Возможно, OnRxChar срабатывает для каждого символа (или пары символов). У вас должен быть буфер, который является постоянным между этими событиями. Локальный var (как у вас есть сейчас и который выделен в стеке) в обработчике событий не является постоянным, он теряется каждый раз, когда обработчик событий выходит. Вы должны объявить переменную Buffer как поле TReaderProgrammer. Я не знаю, почему вы определили буфер как AnsiString, но я предлагаю вам попробовать со строкой (см. Обсуждение выше относительно осведомленности Unicode).

type 
    TReaderProgrammer = class 
    .. 
    RxBuffer: string; 
    .. 
    end; 

буфер должен быть очищен, когда вы отправляете команду на внешнее устройство, для того, чтобы быть готовым получить новые данные в ответ на вашу команду.

EDIT: В качестве альтернативы вы можете очистить RxBuffer сразу же после получения и обработки полного ответа.

TReaderProgrammer.ComPort1RxChar должен выглядеть следующим образом ГНФАР:

procedure TReaderProgrammer.ComPort1RxChar(Sender: TObject; Count: Integer); 
var 
    RxData : string; 
begin 
    (Sender as TComPort).ReadStr(RxData,Count); 
    RxBuffer := RxBuffer + Rxdata; 
    ... 
end; 

Остальная часть обработчика событий, я догадаться, наверное, просто увидеть прогресс приема, так что больше ничего об этом.

+1

+1. Предполагая, что вы являетесь туберкулезом из NGC Borland/CodeGear/[...], здорово видеть ваши вдумчивые/разумные и читаемые материалы, которые появляются здесь. – MartynA

+0

@MartynA Спасибо вам за добро пожаловать! –

+1

Я вижу благодарность, но какая разница между вашим RxBuffer и моим буфером, кроме вашего, глобальным и моим AnsiString. жаль, что я очень новичок в программировании, поэтому я хочу понять, почему я делаю изменения. какая доза (отправитель как Tcomport) против ComPort1. изменение ? спасибо, что нашли время, чтобы ответить на мой предыдущий вопрос. вы правы, это библиотека CPort от SourceForge, и это был потрясающий ответ. Проголосуйте от меня, но у меня нет 15 rep ... @TomBrunberg –