forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Hex данные через com port (http://forum.boolean.name/showthread.php?t=16304)

S_007 07.02.2012 19:19

Hex данные через com port
 
Помогите кто знает, существует ли функция в MidletPaskel что бы в com port отпрвить данные в формате Hex, например 0x31,0x10 и тд.?
Встречал только такую, в формате ASCII.

text:= 'AD123';
s := comm_write_string(text);

ProgrammerForever 08.02.2012 16:40

Ответ: 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;


S_007 09.02.2012 10:14

Ответ: Hex данные через com port
 
ProgrammerForever огромное спасибо! Буду пробовать...

ViNT 09.02.2012 12:42

Ответ: Hex данные через com port
 
Есть Lib_hex, которая может преобразовывать числа в HEX.

Phantom 09.02.2012 18:34

Ответ: Hex данные через com port
 
А может человеку просто нужно не строку а бинарные данные передавать?

S_007 09.02.2012 19:41

Ответ: 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:46

Ответ: Hex данные через com port
 
Вложений: 1
Есть два варианта, одна только в hex преобразует, другая может и обратно.

Только не совсем понятно, в чем проблема. Если отправлять строку '10', то и должно приходить '10'. Правильно я понимаю, что вместо 10 приходит 1_0 (т.е. $49$20$48), или как? Может терминал просто криво отображает?

S_007 10.02.2012 23:58

Ответ: 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, если есть хоть какой-то пример к твоей либе, скинь пожалуйста!

ProgrammerForever 11.02.2012 15:04

Ответ: Hex данные через com port
 
Чтобы отправить последовательность $10,$41,$0С, используй функцию chr().
Код:

s := comm_write_string(chr(16)+chr(65)+chr(12));
должно сработать, в принципе, если тут chr() делает ту же работу, что и в "классическом" Паскале.
[16,65,12 = $10,$41,$0С]

ViNT 13.02.2012 01:02

Ответ: Hex данные через com port
 
ProgrammerForever прав, нужно использовать chr(), подставлять можно сразу в hex, т.е. chr($10).

S_007 13.02.2012 21:35

Ответ: Hex данные через com port
 
Да, ProgrammerForever прав, сработало! Спасибо! Упёрся теперь в другое, всё таки не получается избежать МК, между телефоном и машиной, так как микросхема K_Line байт который получает от телефона сразу отправляет обратно т.е. делает эхо и при этом программа сразу зависает потому что либа com порта, как я понял, даже если делать прием в отдельном потоке, не умеет отправлять и сразу принимать байты. Но тем не менее Спасибо Всем кто учавствовал! Надеюсь, что на будущее это может пригодиться не только мне! Спасибо!

ViNT 14.02.2012 23:12

Ответ: Hex данные через com port
 
А что за микросхема? Неужели нельзя эхо отключить?

S_007 16.02.2012 13:03

Ответ: Hex данные через com port
 
Вложений: 2
ViNT, эта микросхема, простой адаптер-преобразователь, для сопряжения ПК или МК. K_Linia 12 вольтовая, для наглядности вложил простую схему такого адаптера на транзисторах. В МК есть прерывания как на передачу так и на прием, програмно можно игнорировать эхо. Но мне пришла мысль, незнаю, может получится так, сильно завалило снегом, не могу пока добраться до машины чтоб поэкспериментировать

thread.stop; // останавливаю тред для чтения из порта

s := comm_write_string(chr(16)+chr(65)+chr(12)); //Передаю посылку

thread.init;
thread.start; // запускаю тред для чтения из порта и ожидаю ответа ЭБУ
после приема посылки, снова останавливаю тред и т.д.

ViNT 16.02.2012 18:18

Ответ: Hex данные через com port
 
Думаю, так не получится, эхо дойдет и повесит прогу быстрее, чем запустится поток. Впрочем, по идее можно проверить и без машины, просто замкнув TX и RX мобилы и выдав байт в порт.
Как вариант, можно поискать другой преобразователь, не дающий эхо.


Часовой пояс GMT +4, время: 21:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot