Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.13;
Скачать: CL | DM;

Вниз

Com-порт   Найти похожие ветки 

 
mihos   (2009-07-07 10:13) [0]

Подскажите, может кто знает...
Имеются автомобильные весы подключенные через COM-порт. Пытаюсь снять с них текущий вес. Скачал компоненту cport. Выдает примерно вот такие строчки (неточно конечно, по памяти):

"T"#$10#2#4#e

Вопрос: Как мне их в человеческий вид привести?

Заранее спасибо!


 
Сергей М. ©   (2009-07-07 10:17) [1]

Что такое "человеческий вид" ?
Что ты вообще ожидал увидеть ?


 
Anatoly Podgoretsky ©   (2009-07-07 12:17) [2]

> mihos  (07.07.2009 10:13:00)  [0]

А что каждый символ значит ты знаешь? В соответствии с документацией или методом научного втыка?


 
tesseract ©   (2009-07-07 21:04) [3]

Масса-К напоминает протокол. Первое - режим на весах - остальное режим индикации с байтами младшим вперёд.  Есть в инструкции к весам.


 
Германн ©   (2009-07-08 01:04) [4]

Инструкцию к весам и нужно читать. Либо обращаться к производителю весов.


 
KilkennyCat ©   (2009-07-08 02:13) [5]

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


 
mihos ©   (2009-07-08 08:45) [6]

Я с COM портами не сталкивался никогда... В Delphi я больше по базам данных.

Единственная инструкция к весам
http://www.baltves.ru/index.php?module=articles&id=94

А производитель отмазался, типа, мы не знаем. А тот кто знает уволился...

>либо брать гирьки разного весу и вперед, к тайнам племени майя.
Гирьки которые я смогу на эти весы поднести, погоды не сделают, а племя Майя написали единственный документ к данному девайсу
http://www.baltves.ru/index.php?module=articles&id=94


 
Anatoly Podgoretsky ©   (2009-07-08 09:05) [7]

Хорошая подробная документация.


 
brother ©   (2009-07-08 09:09) [8]

> Хорошая подробная документация.

согласен на 100%, ты видимо с делфи не оч. дружишь) тут один совет: читаем умные книги и учимся на примерах...


 
mihos ©   (2009-07-08 11:18) [9]

Да, хорошая подробная документация.

Ещё раз вопрос:
Весы возвращают строчку примерно такого содержания
"T"#$10#2#4#e
В документации сказано следующее:
"При выполнении всех условий ведущий посылает ответ, состоящий из 8 байт:
1. сетевой адрес ведомого устройства;
2. три байта значения веса (первый байт – младший), целое число со знаком, отрицательные значения представлены в дополнительном коде, т.е. –1 = 0FFFFFFh.
3. байт служебной информации b1;
4. байт служебной информации b2;
5. два байта контрольной суммы CRC16."

Вопрос следующий: Как мне выдернуть отсюда вес?


 
Сергей М. ©   (2009-07-08 11:57) [10]


> Как мне выдернуть отсюда вес?


Никак.

Ибо в док-ции нет ни слова про то что ответ возвращается в строковом виде. А у тебя "строчка". А в док-ции ни слова про "строчку".

Ошибка у тебя в программе, в 17-й строке)


 
Anatoly Podgoretsky ©   (2009-07-08 12:18) [11]

Еще один Zheksonz


 
Сергей М. ©   (2009-07-08 12:19) [12]


> Anatoly Podgoretsky ©   (08.07.09 12:18) [11]


Интересно, марафонец или спринтер ?


 
Anatoly Podgoretsky ©   (2009-07-08 12:20) [13]


> Сергей М. ©   (08.07.09 11:57) [10]

У него не строчка, он в отладчике смотрит.


 
Сергей М. ©   (2009-07-08 12:22) [14]


> Anatoly Podgoretsky ©   (08.07.09 12:20) [13]
>
>


Он в отладчике смотрит содержимое переменной строкового типа.


 
Anatoly Podgoretsky ©   (2009-07-08 12:25) [15]

> Сергей М.  (08.07.2009 12:22:14)  [14]

Ну это нормально, не важно какого типа переменная, важно уметь использовать и смотреть, понимая что делаешь.


 
Dennis I. Komarov ©   (2009-07-08 12:35) [16]


> "T"#$10#2#4#e

А это как?


 
Сергей М. ©   (2009-07-08 12:43) [17]


> А это как?


Это, наверно, у отладчика амнезия)


 
Dennis I. Komarov ©   (2009-07-08 12:45) [18]


> Сергей М. ©   (08.07.09 12:19) [12]
>
> Интересно, марафонец или спринтер ?

Троеборец...


 
Anatoly Podgoretsky ©   (2009-07-08 12:45) [19]

> Сергей М.  (08.07.2009 12:43:17)  [17]

Шизофрения!


 
brother ©   (2009-07-08 13:10) [20]

> [9] mihos ©   (08.07.09 11:18)
> Да, хорошая подробная документация.
>
> Ещё раз вопрос:
> Весы возвращают строчку примерно такого содержания
> "T"#$10#2#4#e
> В документации сказано следующее:
> "При выполнении всех условий ведущий посылает ответ, состоящий
> из 8 байт:
> 1. сетевой адрес ведомого устройства;
> 2. три байта значения веса (первый байт – младший), целое
> число со знаком, отрицательные значения представлены в дополнительном
> коде, т.е. –1 = 0FFFFFFh.
> 3. байт служебной информации b1;
> 4. байт служебной информации b2;
> 5. два байта контрольной суммы CRC16."
>
> Вопрос следующий: Как мне выдернуть отсюда вес?

1. читай не srting
2. проблемма потом байты вытащить?

> Шизофрения!

чет последнее время как-то сильно.


 
mihos ©   (2009-07-08 13:21) [21]

В отладчике смотрю...


 
brother ©   (2009-07-08 13:23) [22]

> В отладчике смотрю...

это понятно... эх, теперь снова: где код получения строки в [9]?


 
Zheksonz   (2009-07-08 13:28) [23]

Удалено модератором


 
brother ©   (2009-07-08 13:34) [24]

Удалено модератором


 
Сергей М. ©   (2009-07-08 13:34) [25]

Удалено модератором


 
Dennis I. Komarov ©   (2009-07-08 13:36) [26]

Удалено модератором


 
Zheksonz   (2009-07-08 13:42) [27]

Удалено модератором


 
brother ©   (2009-07-08 13:45) [28]

Удалено модератором


 
Сергей М. ©   (2009-07-08 13:45) [29]

Удалено модератором
Примечание: Не превращай в филиал своих мегаветок


 
Zheksonz   (2009-07-08 13:49) [30]

Удалено модератором


 
Dennis I. Komarov ©   (2009-07-08 13:51) [31]

Удалено модератором


 
mihos ©   (2009-07-09 19:34) [32]



procedure TForm1.Button1Click(Sender: TObject);
var
   hCom, Errors, Bytes: Cardinal;
   DCB:TDCB;
   TheStruct:TCOMSTAT;
   buffer:string;
   buff4: array [0..3] of Byte;
   buff8: array [0..7] of Byte;
   pch : pchar;
   s : string;
begin

   hCom:=CreateFile("COM1",GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
   if hCom=INVALID_HANDLE_VALUE then begin
       //не удалось открыть
       ShowMessage("фиг");
       exit;
   end;

   SetupComm(hCom,1600,1600);

   GetCommState(hCom,DCB);

   with DCB do begin //настроить нужным образом
       BaudRate:=CBR_9600;
       ByteSize:=8;
       Parity:=NOPARITY;
       StopBits:=ONESTOPBIT;
   end;

   if not SetCommState(hCom,DCB) then begin
       //Порт не настроен. yнельзя работать
       ShowMessage("Порт не настроен");

       CloseHandle(hCom);
       exit;
   end;

   buff4[0]:=$0000;
   buff4[1]:=$0055;
   buff4[2]:=$0017;
   buff4[3]:=$005F;

  // buff:="000H 055H 017H 05FH";
   WriteFile(
       hCom,
       buff4,
       Length(buff4),
       Bytes,
       nil
       );

   ClearCommError(hCom,Errors,@TheStruct);

   if TheStruct.cbInQue>0 then begin //что-то пришло

       //SetLength(buffer,TheStruct.cbInQue);

       ReadFile(
           hCom,
           buff8,
           TheStruct.cbInQue,
           Bytes,
           nil
           );
      {
       Тут, если в отладчике посмотреть, buff8 имеет значение      (0,100,0,0,2,0,184,44)
       Это (я)уверен, что 1 тонна. Как в инструкции сказано, 2,3,4 байт - это вес. Как мне её в строку или integer вытащить?          
       }
 
end;
   CloseHandle(hCom);

end;



 
Сергей М. ©   (2009-07-09 20:06) [33]

Это что за откровение было ?


 
mihos ©   (2009-07-10 15:22) [34]

Это я пытаюсь в весов вес получить...


 
Сергей М. ©   (2009-07-10 17:16) [35]


> в инструкции сказано, 2,3,4 байт - это вес


Ну все правильно !

С учетом этого

Три младших бита b1.0, b1.1 и b1.2 байта b1 образуют целое число Dec. Значение Dec от 0 до 6 показы-вают количество десятичных знаков после запятой в показаниях индикатора, т.е. целое значение веса необ-ходимо разделить на 10 в степени Dec

как раз та самая тонна и получается:

100 / (10 в степени 2) = 1 тонна

Берешь со 2-го по 4-й байт и, рассматривая их как Integer-значение, делишь на Byte-значение, полученное AND-наложением маски со значением 3 на значение, взятое из байта b1.
Результат деления выводишь в строковом виде с помощью ф-ции FormatFloat()


 
Сергей М. ©   (2009-07-10 17:23) [36]


> маски со значением 3


Нагло вру)

Маска д.б. со значением 7.

Перед делением, как гласит инструкция, следует проверить, что (b1 and 7) < 7  (отсутсвует признак переполнения разрядной сетки), после чего расчитать делитель 10 ^ (b1 and 7)


 
Inovet ©   (2009-07-10 17:51) [37]

> [36] Сергей М. ©   (10.07.09 17:23)

"Папа, это ты с кем сейчас разговаривал?":)


 
Сергей М. ©   (2009-07-10 20:59) [38]

Да уж ..
С учетом того, что инструкция действительно хорошая и подробная, топикстарт выглядит действительно диким)


 
mihos ©   (2009-07-14 11:53) [39]

Извиняюсь, что развел такую тему.
Но больше всего извиняюсь за то, что не поблагодарил.
В запаре, извините Сергей М.


 
Inovet ©   (2009-07-14 17:45) [40]

> [39] mihos ©   (14.07.09 11:53)
> Извиняюсь, что развел такую тему.

Ну получилось, и слава Богу. Просто было заявлено об отсутствии документации, а ведь всё оказалось и несложно, и из порта правильные данные приходили.



Страницы: 1 2 вся ветка

Текущий архив: 2009.09.13;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.011 c
15-1247645444
TUser
2009-07-15 12:10
2009.09.13
Лиц. ПО в России


2-1247207187
Sw
2009-07-10 10:26
2009.09.13
WM_COPY WinApi


15-1247591897
Shyrick
2009-07-14 21:18
2009.09.13
Проблема с java-скриптовым редактором


2-1247490487
TStas
2009-07-13 17:08
2009.09.13
Какое сообщение послать чужому окну, чтобы оно развернулось?


1-1214553701
LonelyWolf
2008-06-27 12:01
2009.09.13
Delphi+WinAPI (threads) - синхронизация переменных