![]() |
|
Весы Тензо-м и свой драйвер для них | ☑ | ||
---|---|---|---|---|
0
lEvGl
гуру
03.07.18
✎
17:56
|
Доброго всем
Есть весы Тензо-м ТВ-014 https://www.tenso-m.ru/vesovye-terminaly/dlja-staticheskih-vesov/146/ есть описание протокола https://www.tenso-m.ru/pdf/re/re_tv_014_5_12.pdf есть готовая компонента https://www.tenso-m.ru/programmnoe-obespechenie/integracija-v-sistemy-ucheta-i-asu-tp/95/ Но хочется свой драйвер, потому что весов этого производителя много(до 5 разных моделей) и надо понимать как это работает. Помониторил СОМ порт Bus Hound`ом: на устройство подается ff 01 c3 e3 ff ff в ответ приходит ff ff ff 01 c3 94 01 00 12 24 Протокол описывает, что и где, вроде бы все понятно, но получить эти байты в своей программе (C#) в таком виде не могу SerialPort mySerialPort = new SerialPort("Com1", 9600, Parity.None, 8, StopBits.One); byte[] Result = new byte[] { 0xFF, 0x01, 0xC3, 0xE3, 0xFF, 0xFF }; |
|||
1
lEvGl
гуру
03.07.18
✎
17:58
|
mySerialPort.Open();
mySerialPort.Write(Result, 0, Result.Length); Thread.Sleep(100); textBox1.Text = mySerialPort.ReadExisting(); получаю абракадабру ?? как это разобрать и привести к человеческому виду, пожалуйста. ? |
|||
2
lEvGl
гуру
03.07.18
✎
17:59
|
абракадабра даже не вставляется, еще раз
?? |
|||
3
lEvGl
гуру
03.07.18
✎
19:52
|
драйвер использовать хочется в учетной 1сной конфе, просто в тру программировании не силен, постольку поскольку - делал несколько подобных вариантов, но там устройства отдавали строку ascii, а тут лажа какая то
|
|||
4
lEvGl
гуру
04.07.18
✎
08:37
|
никто не предположит, что может быть не так ?
|
|||
5
Кирпич
04.07.18
✎
09:15
|
Ну в протоколе же описано, что, какая абракадабра значит. Вот и читай.
|
|||
6
lEvGl
гуру
04.07.18
✎
09:27
|
ReadExisting() возвращает строку, которая представляет из себя абракадабру, надо брать байт за байтом что ли.. ладно, вопрос видимо ламерский, будем разбираться, спасибо что откликнулся
|
|||
7
spectre1978
04.07.18
✎
09:53
|
(6) просмотрите абракадабру в виде HEX и, возможно, все станет боль-менее понятно?
|
|||
8
Кирпич
04.07.18
✎
11:22
|
(6) Ты там задолбаешься разбираться. В принципе, всё в инструкции написано, но там для умных. Я когда то на паскале с такими весами работал, но я тупо из инструкции asm скопировал. Надо там к командам CRC вычеслять и возвращает оно там массив байт. Вес в формате BCD. Всё это тебе придется изучить.
|
|||
9
Кирпич
04.07.18
✎
11:36
|
вот эта галиматья переводит этот BCD с весов в текст. Может поможет :)
function mBCDToStr(B: pointer): string; var P: PmBCD; s: string; zn: byte; begin P := B; zn := P^.b4 shl 5; zn := zn shr 5; result := ''; s := IntToHex(P^.b3, 2); if s <> '00' then begin result := IntToStr(StrToInt(s[1])); result := result + IntToStr(StrToInt(s[2])); end; s := IntToHex(P^.b2, 2); if s <> '00' then begin result := result + IntToStr(StrToInt(s[1])); result := result + IntToStr(StrToInt(s[2])); end; s := IntToHex(P^.b1, 2); if s <> '00' then begin result := result + IntToStr(StrToInt(s[1])); result := result + IntToStr(StrToInt(s[2])); end; s := RightStr(result, zn); result := LeftStr(result, Length(result) - zn) + ',' + s; if (GetBit(P^.b4, 7) = 1) then result := '-' + result; end; |
|||
10
Кирпич
04.07.18
✎
11:38
|
А эта вычисляет CRC. Как это всё работает я давно забыл.
function MakeCRC(P: PByte; len: integer): byte; function CRCMaker(b_input: byte; b_CRC: byte): byte; label mod1, mod2; begin asm mov al,b_input mov ah,b_CRC mov cx,8 mod1: rol al,1 rcl ah,1 jnc mod2 xor ah,69h mod2: dec cx jnz mod1 mov b_CRC,ah end; result := b_CRC; end; var i: integer; b: byte; begin b := CRCMaker(P^, 0); inc(P); for i := 1 to len do begin b := CRCMaker(P^, b); end; result := b; end; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |