|
Весы Тензо-м и свой драйвер для них
|
Я
|
|
lEvGl 03.07.18 - 17:56 | Доброго всем
Есть весы Тензо-м ТВ-014
есть описание протокола
есть готовая компонента
Но хочется свой драйвер, потому что весов этого производителя много(до 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 }; |
lEvGl 1 - 03.07.18 - 17:58 | mySerialPort.Open();
mySerialPort.Write(Result, 0, Result.Length);
Thread.Sleep( 100);
textBox1.Text = mySerialPort.ReadExisting();
получаю абракадабру
??
как это разобрать и привести к человеческому виду, пожалуйста. ? |
lEvGl 2 - 03.07.18 - 17:59 | абракадабра даже не вставляется, еще раз
?? |
lEvGl 3 - 03.07.18 - 19:52 | драйвер использовать хочется в учетной 1сной конфе, просто в тру программировании не силен, постольку поскольку - делал несколько подобных вариантов, но там устройства отдавали строку ascii, а тут лажа какая то |
lEvGl 4 - 04.07.18 - 08:37 | никто не предположит, что может быть не так ? |
Кирпич 5 - 04.07.18 - 09:15 | Ну в протоколе же описано, что, какая абракадабра значит. Вот и читай. |
lEvGl 6 - 04.07.18 - 09:27 | ReadExisting() возвращает строку, которая представляет из себя абракадабру, надо брать байт за байтом что ли.. ладно, вопрос видимо ламерский, будем разбираться, спасибо что откликнулся |
spectre1978 7 - 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; Рекламное место пустует |