|   |   | 
| 
 | Весы Тензо-м и свой драйвер для них | ☑ | ||
|---|---|---|---|---|
| 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; | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |