Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
7-36438
Alek_1
2002-09-30 23:04
2002.12.12
ComPort


1-36115
aterm
2002-12-03 11:37
2002.12.12
как отловить вставку из буфера в определенную TMemo?


7-36441
netm
2002-10-14 04:44
2002.12.12
Как узнать о изменении курсора?


1-36120
Serega Belov
2002-12-03 12:29
2002.12.12
WinExec и Winoldap в Delphi 6.


14-36414
XMblPb
2002-11-22 18:07
2002.12.12
Ошибка Undeclared identifier при чтении/записи ini-файлов.