Текущий архив: 2002.12.12;
Скачать: CL | DM;
Вниз
ComPort Найти похожие ветки
← →
Alek_1 © (2002-09-30 23:04) [0]Через ком порт передаются дынные и в конце каждой строки нужно добавлять контрольную сумму
есть алгоритм вычисления этой суммы вот он:
Алгopитм oбpaзoвaния CRC пpи пepeдaчe:
Изпoльзуютcя 3 paбoчиx бaйтa.
S1 S0 TR
S1 - cтapший бaйт CRC (пepeдaeтcя cpaзупocлe END),
S0 - млaдший бaйт CRC,
TR - тeкущий пepeдaвaeмый бaйт в блoкe (нaчинaeтcя oт пepвoгo
бaйтa пocлe BEG и зaвepшaeтcя END).
1. Hулиpуютcя S1 и S0.
2. Зapeжaeтcя TR c тeкущим пepeдaвaeмым бaйтoм и бaйт выcылaeтcя
пo линии.
3. Toчки 3.1 и 3.2 выпoлняютcя 8 paз:
3.1. S1 S0 TR cвязaнныe штифтиpуютcя нaлeвo 1 бит.
3.2. Ecли пepeнoc oт cтapшeгo битa S1 - 1,
инвepтиpуютcя cтapший бит S1 и млaдший бит S0.
4. Зapeжaeтcя TR c 0 и выпoлняeтcя тoчкa 3.
5. Зapeжaeтcя TR c 0 и выпoлняeтcя тoчкa 3.
6. Бaйт S1 выcылaeтcя пo линии.
7. Бaйт S0 выcылaeтcя пo линии.
и есть код на с++ Builder
void CRCcount(int zero, char nextn)
{
if(zero==1)
{
CRCH1=0;
CRCL1=0;
return;
}
register unsigned char AL=nextn;
register unsigned char AH=CRCH1;
register unsigned char DH=CRCH1;
register unsigned char DL=CRCL1;
for (int i=0; i<7; i++)
{DH = (DH >> 1) ^ AH;}
CRCL1 = AL ^ DH;
DH = (DH << 7) | (DH >> 1);
DH = DH & 0x80;
CRCH1 = DH ^ DL;
return;
}
как мне зделать тоже самое на паскале у мя ничего не выходит.
и вообще правильный это код вычисления контролдьной сумы или нет
я си незнаю поэтому мучаюсь
Помогите кто знает. Зарание спасибо.
← →
Alek_1 © (2002-10-02 17:44) [1]Так что никто не знает???
← →
Jeer © (2002-10-02 22:01) [2]Видишь ли..
Разбираться в чужих алгоритмах и программах, тем более на Си на сайте Дельфи вряд ли кто будет.
Мой тебе совет - начни с нуля и поизучай что есть контрольная сумма.
Как будет понятна матем.основа - созреет алгоритм, ну а кодировать кто не может ?
Для справки:
Контрольная сумма(в последующем появился и устоялся термин CRC) применяется для контроля целостности исходного сообщения.
Основная идея - представление сообщения в виде большого числа делимого на число поменьше, остаток от деления (называемый также сигнатурой)собственно и является контрольной суммой.
Мат.аппарат на котором базируются вычисления CRC - полиномиальная алгебра.
Важным моментом при выборе того или иного алгоритма CRC являтся требуемая вероятность обнаружения ошибок. Она, в свою очередь, зависит от качество канала передачи.
Для протокола X-Modem, арх.LHA, использовался 16-битный делитель, что дает вероятность ошибки 1/65535.
Для сети Ethernet, арх. PKZIP используется уже 32-битный.
Что же касается твоих "Hулиpуютcя.., Зapeжaeтcя..,cвязaнныe штифтиpуютcя нaлeвo " - знаешь, слыхал я бред и почище этого.
Извини уж.
← →
REA (2002-10-03 16:53) [3]У меня так CRC считается на пакет. Может пригодится.
Procedure AddCRC(pData: PByteArray; Len: Integer);
Var
i : Integer;
Sum: Byte;
Begin
Sum:= 0;
For i:=0 To Len-1 Do
Begin
Sum:= Sum Xor Byte(pData[i]);
Sum:= ((Sum And 1) Shl 7) Or ((Sum Shr 1) And $7F); {ROR}
If (Sum And $80)<>0 Then Sum:=Sum Xor $3C;
End;
pData[Len] := Sum;
End;
← →
Alek_1 © (2002-10-03 22:50) [4]Cпасибо за ответы.
Jeer то что это бред я и сам снаю, но эту контрольную сумму желательно вычислить а то без нее апарат ничего не пришлет в ответ.
← →
Aleks1 (2002-10-04 04:26) [5]> Alek_1
Понятно, что "эту контрольную сумму желательно вычилить", но как я понимаю это не твоя идея. Так может быть у тебя есть некая документация, и может ты ее приведешь здесь, вместо того, чтобы рассказывать все это СВОИМИ СЛОВАМИ, в которых никто ничего не может понять!
← →
Странник © (2002-10-04 11:24) [6]да уж, к этому вопросу еще словарь терминов нужен.
потому как "штифтируются" я понял только из С-кода, на "зарежаются" смеху не хватило.
Это ж надо так вопрос задать, чтобы объяснение на русском понимать через приведенный исходник!!!!!
Супер!
ЗЫ
Код, кстати, не С++, а просто С.
← →
Alek_1 © (2002-10-06 02:27) [7]Проблема в том что єто и есть выдержка из документации слово в слово.
Я сам не понял вот и решил вопрос задать.
К этой доке прилагается код на с++.
← →
Одессит (2002-10-07 12:49) [8]Как я понял, это есть расчет контрольной суммы для кассовых аппаратов Samsung и Datecs или я, возможно, ошибаюсь.
Вот так у меня это происходит на этих кассовых аппаратах.
long crc=0L;
void __fastcall TForm1::CRC(char ch)
{ char i;
(crc)+=ch;
for(i=0;i<8;i++)
{ crc<<=1;
if((crc&0x1000000)!=0)
{ crc^=0x800100;
crc&=0xffffff;
}
}
}
void __fastcall TForm1::CRC(char *ch1,char *ch2)
{ long te=crc;
te>>=8;
*ch2=(char)(te&0xff);
*ch1=(char)((te&0xff00)>>8);
}
ch1 и ch2 есть контрольные числа
← →
Alek_1 © (2002-10-08 01:31) [9]Одессит єто точно подсчет контрольной суммдля самсунга и датекса и даже крохи. Спасибо за код но как его перевести на паскаль?
Я в си почти не шарю.
← →
Одессит (2002-10-08 13:48) [10]Держи (лет пять назад писал на паскале, сейчас в основном С, но помню что-то)
longint crc=0;
Procedure CRC(ch:byte)
var
i:byte;
begin
crc=crc+ch;
for i=1 to 8 do
begin
crc=crc shl 1;
if (crc and $1000000)<>0 then
begin
crc=crc xor $800100;
crc=crc and $ffffff;
end;
end;
end
...в теле программы...
ch1,ch2: byte;
t : longint;
t=crc shr 8;
ch2=t and $ff;
ch1=(t and $ff00) shr 8;
Не помню, делает ли Паскаль явное преобразование типов? всё остальное должно работать.
Если у тебя есть что-то интересное о этих кассовых аппаратах, я бы не отказался получить это в подарок :) как бы услуга, за услугу. (особенно если есть документация в электронном виде и особенно про протокол). Я все эти вещи понял, дизасемблируя прогу одних из писащильков досовского ПО для Samsung, а часть методом тыка.
← →
Одессит (2002-10-08 14:41) [11]Забыл :) вместо `=` надо `:=` (отвык)
← →
Alek_1 © (2002-10-09 01:12) [12]Одессит большое тебе спасибо.
Протокол апаратов вышлю на мыло.
Правда он у меня 5 ти летней давности.
← →
Одессит (2002-10-09 10:46) [13]И за это спасибо. У меня бумажное описание было, но не соответствующее теперешнему. Теперь и эту бумажку посеяли.
Не забудь надо рассчитать контрольную сумму по всем байтам данным без начального байта блока (код 10).
.....СRC(байтики данных).....СRC(байтики данных)
.....СRC(байтики данных).....
А в конце надо сделать такое: CRC(13); CRC(0);CRC(0);
и потом получить два байта контрольной суммы
← →
Alek_1 © (2002-10-10 01:11) [14]to Одессит
тоесть вот так?
ks1:="01;1;0;100;КОЛБАСА;10.00;1.000;1;1;1;0;0;";
CRC:=0;
for i:=1 to Length(ks1) do
begin
CRCCount(Byte(ks1[i]));
end;
CRCCount(13));
CRCCount(0);
CRCCount(0);
t:=crc shr 8;
ch2:=t and $ff;
ch1:=(t and $ff00) shr 8;
кстати отсылать данные надо в одной строке? или побайтово?
← →
Одессит (2002-10-10 11:57) [15]Как я знаю первые три секции, которые ты указал, разделенные ";", сейчас нету.
А завершаться должно 1;1; а не 0;0;
ks1:="100;КОЛБАСА;10.00;1.000;1;1;1;1;1;"
А так правильно.
Отправлять можешь одной строкой (будет быстрее). Не забудь что Винда коварная штука. А кассовый аппарат имеет жесткие ограничения по таймауту между байтами. В ДОСе работать должно, а в Винде по разному.
Я повозился очень сильно, когда писал компоненту. Раз 5 переделывал. Измерял промежутки.
← →
Alek_1 © (2002-10-11 09:11) [16]Попробовал я твой код. CRC подсчитавается нормально но каса не всегда овечает на мою строку наверное нада поиграться с таймаутами. И еще что-то не получается у меня завершить чек когда я отключаюсь от кассы он не завершается а какую команду нужно посылать я не нашел.
Что ж Одессит большое тебе спасибо а то я бы месяць или два возился.
← →
Одессит (2002-10-11 11:32) [17]Чтоб завершить надо отправить вот что
ks1:="100;КОЛБАСА;0.00;0.000;1;1;1;1;1;"
Нулевое количество и цену.
А вот главный секрет, с которым я возился. Надо сигнал RTS=0, а DTR=1. Тогда ЭККА отвечает, иначе он печатает, но не отвечает.
А вот таймауты обязательно. Надо чтоб как можно быстрее данные уходили из буфера в линию. Думай, ставь повышенный приоритет программе и найди нормальную компоненту для СОМ-порта.
← →
Alek_1 © (2002-10-11 22:18) [18]Насчет дтр єто уж точно пока я не протестировал сигналі которіе идет с тестовой програмы я бы и незнал что его нужно выставлять в 1.
← →
Одессит (2002-10-14 10:38) [19]Дерзай ;)
Страницы: 1 вся ветка
Текущий архив: 2002.12.12;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.018 c