![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Надо прочитать данные из COM-port. [D7, WinXP]
MonZon © (2007-01-10 17:58:00)Пробовал разные компоненты- возвращают муть всякую. Источник сигнала микроконтроллер atmega. отсылает данные в формате [n][x0][x1][x2]. n - номер канала. х0, х1, х2 - сигнал с ацп(почему три байта? потому что не влезает по ширине в один.). Все это дело качается по стандартной аппаратной реализации USART(или UART). Комп принимает данные на ура, но только через ГиперТерминал. Из дельфы мусор. Может есть где исходник? ЗЫ. Еще я могу поменять формат отправления данных, если это упростит задачу. например можно посылать данные строкой. И на конце строки "\n". и пусть программка ловит данные построчно и складывает в МЕМО.
Всем Спасиб. Есть еще добрые люди =)
tesseract (2007-01-10 22:04:00) [1]
> MonZon (10.01.07 21:09) [10]
И чем тебя array of byte не устраивал?
MonZon (2007-01-10 21:09:00) [2]Допер наконец-то
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
ComPort.ReadStr(Str, Count);
memo.Lines.add(AnsiMidStr(str,0,1));
memo.Lines.add(AnsiMidStr(str,2,count));
end;
Если кому-то надо - то вот оно.
Всем спасибо.
MonZon (2007-01-10 18:50:00) [3]а байты в порядке слева направо: младший,средний, старший
(вроде не напутал)
MonZon (2007-01-10 18:49:00) [4]Мда че то я не допираю. значит мне бы получить номер канала в один интегер, а остальные три байта в другой. как это сделать подскажи плиз?
Есть вот такое дело:
comport.Read(var buffer; count:integer;)
tesseract (2007-01-10 18:40:00) [5]
> Да и как я потом байты в интегеры переведу? А очень надо
> именно интегер.
У тебя подаёться четыре байта, что равно одному целому, т .е ты можешь просто принять integer. НО неизвестно в каком пордя дке они следуют, могут навыверт - младшим вперёд и придёться колдовать над прерващением его в нормальный вид.
Может просто shr/shl слить array of byte в один интегер ? да и номер канала не придёться отделять. А в то что в компоненте нет ReadBuffer в жизни не поверю.
MonZon (2007-01-10 18:33:00) [6]Да и как я потом байты в интегеры переведу? А очень надо именно интегер.
MonZon (2007-01-10 18:31:00) [7]а разве ComPort.ReadStr(Str, Count); кроме стринга что-нить еще поддерживает?
tesseract (2007-01-10 18:21:00) [8]Почему стринг-то?
Нужно Array[0..3] of byte получать. Конечно муть придёт!
MonZon (2007-01-10 18:18:00) [9]для примера есть такой кусок
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
Str: String;
begin
ComPort.ReadStr(Str, Count);
Memo.Text := Memo.Text + Str;
end;
но приходит абракадабра.
еще там есть событие procedure TForm1.ComPortRxBuf(Sender: TObject; const Buffer; Count: Integer);
и как мне достать свои данные оттуда?
MonZon (2007-01-10 18:04:00) [10]а можно более развернутый кусок кода? в дельфях слабоват =(
tesseract (2007-01-10 18:00:00) [11]CreateFile('com1'
ReadFile/writefile
А мусор приходит скорее всего из-за неверных буферов приёма.