![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ComPort [D5, Win95/98, WinME, NT4, Win2k, WinXP]
Alek_1 © (2002-09-30 23:04:00)Через ком порт передаются дынные и в конце каждой строки нужно добавлять контрольную сумму
есть алгоритм вычисления этой суммы вот он:
Алг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> 1) ^ AH;}
CRCL1 = AL ^ DH;
DH = (DH > 1);
DH = DH & 0x80;
CRCH1 = DH ^ DL;
return;
}
как мне зделать тоже самое на паскале у мя ничего не выходит.
и вообще правильный это код вычисления контролдьной сумы или нет
я си незнаю поэтому мучаюсь
Помогите кто знает. Зарание спасибо.
Одессит (2002-10-14 10:38:00) [1]Дерзай ;)
Alek_1 (2002-10-11 22:18:00) [2]Насчет дтр єто уж точно пока я не протестировал сигналі которіе идет с тестовой програмы я бы и незнал что его нужно выставлять в 1.
Одессит (2002-10-11 11:32:00) [3]Чтоб завершить надо отправить вот что
ks1:="100;КОЛБАСА;0.00;0.000;1;1;1;1;1;"
Нулевое количество и цену.
А вот главный секрет, с которым я возился. Надо сигнал RTS=0, а DTR=1. Тогда ЭККА отвечает, иначе он печатает, но не отвечает.
А вот таймауты обязательно. Надо чтоб как можно быстрее данные уходили из буфера в линию. Думай, ставь повышенный приоритет программе и найди нормальную компоненту для СОМ-порта.
Alek_1 (2002-10-11 09:11:00) [4]Попробовал я твой код. CRC подсчитавается нормально но каса не всегда овечает на мою строку наверное нада поиграться с таймаутами. И еще что-то не получается у меня завершить чек когда я отключаюсь от кассы он не завершается а какую команду нужно посылать я не нашел.
Что ж Одессит большое тебе спасибо а то я бы месяць или два возился.
Одессит (2002-10-10 11:57:00) [5]Как я знаю первые три секции, которые ты указал, разделенные ";", сейчас нету.
А завершаться должно 1;1; а не 0;0;
ks1:="100;КОЛБАСА;10.00;1.000;1;1;1;1;1;"
А так правильно.
Отправлять можешь одной строкой (будет быстрее). Не забудь что Винда коварная штука. А кассовый аппарат имеет жесткие ограничения по таймауту между байтами. В ДОСе работать должно, а в Винде по разному.
Я повозился очень сильно, когда писал компоненту. Раз 5 переделывал. Измерял промежутки.
Alek_1 (2002-10-10 01:11:00) [6]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-09 10:46:00) [7]И за это спасибо. У меня бумажное описание было, но не соответствующее теперешнему. Теперь и эту бумажку посеяли.
Не забудь надо рассчитать контрольную сумму по всем байтам данным без начального байта блока (код 10).
.....СRC(байтики данных).....СRC(байтики данных)
.....СRC(байтики данных).....
А в конце надо сделать такое: CRC(13); CRC(0);CRC(0);
и потом получить два байта контрольной суммы
Alek_1 (2002-10-09 01:12:00) [8]Одессит большое тебе спасибо.
Протокол апаратов вышлю на мыло.
Правда он у меня 5 ти летней давности.
Одессит (2002-10-08 14:41:00) [9]Забыл :) вместо `=` надо `:=` (отвык)
Одессит (2002-10-08 13:48:00) [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, а часть методом тыка.
Alek_1 (2002-10-08 01:31:00) [11]Одессит єто точно подсчет контрольной суммдля самсунга и датекса и даже крохи. Спасибо за код но как его перевести на паскаль?
Я в си почти не шарю.
Одессит (2002-10-07 12:49:00) [12]Как я понял, это есть расчет контрольной суммы для кассовых аппаратов Samsung и Datecs или я, возможно, ошибаюсь.
Вот так у меня это происходит на этих кассовых аппаратах.
long crc=0L;
void __fastcall TForm1::CRC(char ch)
{ char i;
(crc)+=ch;
for(i=0;i>8);
}
ch1 и ch2 есть контрольные числа
Alek_1 (2002-10-06 02:27:00) [13]Проблема в том что єто и есть выдержка из документации слово в слово.
Я сам не понял вот и решил вопрос задать.
К этой доке прилагается код на с++.
Странник (2002-10-04 11:24:00) [14]да уж, к этому вопросу еще словарь терминов нужен.
потому как "штифтируются" я понял только из С-кода, на "зарежаются" смеху не хватило.
Это ж надо так вопрос задать, чтобы объяснение на русском понимать через приведенный исходник!!!!!
Супер!
ЗЫ
Код, кстати, не С++, а просто С.
Aleks1 (2002-10-04 04:26:00) [15]> Alek_1
Понятно, что "эту контрольную сумму желательно вычилить", но как я понимаю это не твоя идея. Так может быть у тебя есть некая документация, и может ты ее приведешь здесь, вместо того, чтобы рассказывать все это СВОИМИ СЛОВАМИ, в которых никто ничего не может понять!
Alek_1 (2002-10-03 22:50:00) [16]Cпасибо за ответы.
Jeer то что это бред я и сам снаю, но эту контрольную сумму желательно вычислить а то без нее апарат ничего не пришлет в ответ.
REA (2002-10-03 16:53:00) [17]У меня так 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;
Jeer (2002-10-02 22:01:00) [18]Видишь ли..
Разбираться в чужих алгоритмах и программах, тем более на Си на сайте Дельфи вряд ли кто будет.
Мой тебе совет - начни с нуля и поизучай что есть контрольная сумма.
Как будет понятна матем.основа - созреет алгоритм, ну а кодировать кто не может ?
Для справки:
Контрольная сумма(в последующем появился и устоялся термин 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 " - знаешь, слыхал я бред и почище этого.
Извини уж.
Alek_1 (2002-10-02 17:44:00) [19]Так что никто не знает???