|
Основной форум Сюда все проблемы связанные с программированием. |
07.02.2012, 19:19
|
#1
|
Нуждающийся
Регистрация: 30.01.2011
Сообщений: 76
Написано одно полезное сообщение (для 7 участников)
|
Hex данные через com port
Помогите кто знает, существует ли функция в MidletPaskel что бы в com port отпрвить данные в формате Hex, например 0x31,0x10 и тд.?
Встречал только такую, в формате ASCII.
text:= 'AD123';
s := comm_write_string(text);
|
(Offline)
|
|
08.02.2012, 16:40
|
#2
|
AnyKey`щик
Регистрация: 08.01.2012
Адрес: Новосибирск
Сообщений: 8
Написано 3 полезных сообщений (для 4 пользователей)
|
Ответ: Hex данные через com port
Хочешь видеть гипертерминалом 16ричные цифры? Так и надо переводить число в HEX- сторку, что и есть ASCII, потом дописывать (при надобности) символы "0x" и отправлять этой же функцией.
Тебе только нужно найти (или написать) функцию преобразования числа типа byte в строку, содержащую его hex-код.
Как-то так:
function Byte2Hex(n:byte;ap:string) :string;
{Функция перевода байта в 16ричное число}
{n - число для перевода в HEX вид}
{ap - строка-префикс, например '0x'}
{ProgrammerForever (c) 2012}
var
L,H:byte;
retval:string;
begin
L:=n mod 16;
H:=n div 16;
Case L of
0: retval:='0';
1: retval:='1';
2: retval:='2';
3: retval:='3';
4: retval:='4';
5: retval:='5';
6: retval:='6';
7: retval:='7';
8: retval:='8';
9: retval:='9';
10: retval:='A';
11: retval:='B';
12: retval:='C';
13: retval:='D';
14: retval:='E';
15: retval:='F';
end;
Case H of
0: retval:='0'+retval;
1: retval:='1'+retval;
2: retval:='2'+retval;
3: retval:='3'+retval;
4: retval:='4'+retval;
5: retval:='5'+retval;
6: retval:='6'+retval;
7: retval:='7'+retval;
8: retval:='8'+retval;
9: retval:='9'+retval;
10: retval:='A'+retval;
11: retval:='B'+retval;
12: retval:='C'+retval;
13: retval:='D'+retval;
14: retval:='E'+retval;
15: retval:='F'+retval;
end;
Byte2Hex:=ap+retval;
end;
Последний раз редактировалось ProgrammerForever, 09.02.2012 в 07:06.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.02.2012, 10:14
|
#3
|
Нуждающийся
Регистрация: 30.01.2011
Сообщений: 76
Написано одно полезное сообщение (для 7 участников)
|
Ответ: Hex данные через com port
ProgrammerForever огромное спасибо! Буду пробовать...
|
(Offline)
|
|
09.02.2012, 12:42
|
#4
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Hex данные через com port
Есть Lib_hex, которая может преобразовывать числа в HEX.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.02.2012, 18:34
|
#5
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Hex данные через com port
А может человеку просто нужно не строку а бинарные данные передавать?
|
(Offline)
|
|
09.02.2012, 19:41
|
#6
|
Нуждающийся
Регистрация: 30.01.2011
Сообщений: 76
Написано одно полезное сообщение (для 7 участников)
|
Ответ: Hex данные через com port
ViNT, Phantom спасибо что включились в эту тему! Проблема такая:
если я передаю в порт к примеру цифру 10
text:= '10'; s := comm_write_string(text); то в терминале получаю 49, 48, или 1C в терминале 49, 67, а как добиться чтобы на выходе порта было именно 10 - 1С, а не раздельно 1 и 0, или 1 и С?
ViNT, а у тебя есть такая библиотека Lib_hex? Поделись пожалуйста!
Последний раз редактировалось ViNT, 10.02.2012 в 01:40.
|
(Offline)
|
|
10.02.2012, 01:46
|
#7
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Hex данные через com port
Есть два варианта, одна только в hex преобразует, другая может и обратно.
Только не совсем понятно, в чем проблема. Если отправлять строку '10', то и должно приходить '10'. Правильно я понимаю, что вместо 10 приходит 1_0 (т.е. $49$20$48), или как? Может терминал просто криво отображает?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.02.2012, 23:58
|
#8
|
Нуждающийся
Регистрация: 30.01.2011
Сообщений: 76
Написано одно полезное сообщение (для 7 участников)
|
Ответ: Hex данные через com port
ViNT, Спасибо огромное! Я извеняюсь, что ввел в заблуждение из-за того что не точно всё объяснил. Hyper Terminal принимает правильно если отправить - 10 то и будет - 10, если отправить символ - А то и будет отображаться - А. Ну вначале немного напишу суть моей задумки, сейчас почти на всех современных машинах стоят блоки управления двигателем, есть идея написать программу для диагностики двигателей телефоном, и точно знаю это реально, протокол блоков управления известен, есть опыт связи с ними, но только при помощи микроконтроллеров, собирал на них бортовые компьютеры для себя и для друзей, связь микроконтроллера и ЭБУ осуществляется через юсарт, на выходе юсарта сигналы TX-RX, (такие же как и у мобилы) при помощи специальной микросхемы объединяются в один выход и общение ЭБУ и контроллера происходит по одному проводу т.е. K_Line. Здесь многие могут спросить - вчем проблема - цепляеш к контроллеру дисплей, клаву и все дела... Но у мобилы больше ресурсов, скорость побольше, оперативки, да программу можно наворотить до беспредела. Так вот в чем сама проблема, чтобы связаться с ЭБУ нужно отправить посылку к примеру $10,$41,$0С после этого ждем ответа пробуждения ЭБУ и т.д, я подключал к мобиле контроллер, к контроллеру дисплей, вот этим text:= '10'; s := comm_write_string(text); отправил, контроллер из буфера юсарта выводит на экран, чистый без всяких преобразований каждый байт и вот что я увидел, первый байт был 49 - это десятичная 1 (в хэксе 31) а второй байт 48 - это десятичный 0 (в хэксе 30). А ведь надо чтобы было - по протоколу - первый байт в буфере должен быть $10 второй $41 и третий $0С. Получается мобила каждый символ из этой переменной text:= '10'; отправляет в порт по отдельности, причем в десятичном виде. Если кто знает как можно програмно выйти с положения, помогите, за ранее благодарен! ViNT, если есть хоть какой-то пример к твоей либе, скинь пожалуйста!
|
(Offline)
|
|
11.02.2012, 15:04
|
#9
|
AnyKey`щик
Регистрация: 08.01.2012
Адрес: Новосибирск
Сообщений: 8
Написано 3 полезных сообщений (для 4 пользователей)
|
Ответ: Hex данные через com port
Чтобы отправить последовательность $10, $41, $0С, используй функцию chr().
s := comm_write_string(chr(16)+chr(65)+chr(12));
должно сработать, в принципе, если тут chr() делает ту же работу, что и в "классическом" Паскале.
[16,65,12 = $10,$41,$0С]
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
13.02.2012, 01:02
|
#10
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Hex данные через com port
ProgrammerForever прав, нужно использовать chr(), подставлять можно сразу в hex, т.е. chr($10).
|
(Offline)
|
|
13.02.2012, 21:35
|
#11
|
Нуждающийся
Регистрация: 30.01.2011
Сообщений: 76
Написано одно полезное сообщение (для 7 участников)
|
Ответ: Hex данные через com port
Да, ProgrammerForever прав, сработало! Спасибо! Упёрся теперь в другое, всё таки не получается избежать МК, между телефоном и машиной, так как микросхема K_Line байт который получает от телефона сразу отправляет обратно т.е. делает эхо и при этом программа сразу зависает потому что либа com порта, как я понял, даже если делать прием в отдельном потоке, не умеет отправлять и сразу принимать байты. Но тем не менее Спасибо Всем кто учавствовал! Надеюсь, что на будущее это может пригодиться не только мне! Спасибо!
|
(Offline)
|
|
14.02.2012, 23:12
|
#12
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Hex данные через com port
А что за микросхема? Неужели нельзя эхо отключить?
|
(Offline)
|
|
16.02.2012, 13:03
|
#13
|
Нуждающийся
Регистрация: 30.01.2011
Сообщений: 76
Написано одно полезное сообщение (для 7 участников)
|
Ответ: Hex данные через com port
ViNT, эта микросхема, простой адаптер-преобразователь, для сопряжения ПК или МК. K_Linia 12 вольтовая, для наглядности вложил простую схему такого адаптера на транзисторах. В МК есть прерывания как на передачу так и на прием, програмно можно игнорировать эхо. Но мне пришла мысль, незнаю, может получится так, сильно завалило снегом, не могу пока добраться до машины чтоб поэкспериментировать
thread.stop; // останавливаю тред для чтения из порта
s := comm_write_string(chr(16)+chr(65)+chr(12)); //Передаю посылку
thread.init;
thread.start; // запускаю тред для чтения из порта и ожидаю ответа ЭБУ
после приема посылки, снова останавливаю тред и т.д.
|
(Offline)
|
|
16.02.2012, 18:18
|
#14
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Hex данные через com port
Думаю, так не получится, эхо дойдет и повесит прогу быстрее, чем запустится поток. Впрочем, по идее можно проверить и без машины, просто замкнув TX и RX мобилы и выдав байт в порт.
Как вариант, можно поискать другой преобразователь, не дающий эхо.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:19.
|