Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

COM+HEX   Найти похожие ветки 

 
Phantomouse ©   (2004-12-14 16:28) [0]

Приветствую.

Я наверное уже всех достал, но...

Спасибо за предыдущие советы. Они мне помогли. Но тем не менее снова проблема. Открываю и настраиваю COm-порт. Все нормально. Нормально также передаются данные. И читается все хорошо. Только нет разницы, включено ли устройство по ту сторону COMа, или нет :-). Все-равно возвращает одно и то же :-(((.

В общем задача такая. Есть такой протокольчик:

Обмен осуществляется через интерфейс RS232, скорость обмена 9600 Бод. Прием и передача байта осуществляется последовательным потоком 11 бит:  1 стартовый бит, 8 бит данных (младшими битами вперед), 9-ый бит данных 0 или 1, 1 стоповый бит.
Передачу информации по протоколу 0 всегда начинает ЭВМ с  команды синхронизации, в которой восемь бит данных содержат номер весов (от 0 до 99), а девятый бит данных устанавливается в 1. Все остальные команды и данные передаются с девятым битом данных, равным 0. Номер весов задается в каждых весах ручным программированием. Нулевой номер воспринимают все весы, не зависимо от установленного на них номера. При передаче числа, состоящего из двух байт и более, первым передается младший байт. Все числа передаются в двоичной системе счисления, отрицательные в дополнительном коде.

Установка в весах параметров этикетки:
Компьютер -> Команда синхронизации 1 байт (номер весов). -> Весы

Компьютер <- Команда синхронизации 1 байт (НЕХ-77). <- Весы

Компьютер -> Код операции (НЕХ-0А). -> Весы

Компьютер <- Весы готовы к приему данных (НЕХ-01). или не готовы (HEX-00) <- Весы

Компьютер <- Данные (106 байт):
   1 байт - номер отдела для взвешиваемого товара  (0-99),
   1 байт - номер отдела для штучного товара  (0-99),
   1 байт - штриховой код (0-11),
   1 байт - разрешение печати даты (0,1),
   1 байт - разрешение печати цены и стоимости (0,1),
   1 байт - разрешение печати знака сертификации (0,1),
   4 байта - код знака сертификации,
 24 байта - 1-я строка рекламной информации,
 24 байта - 2-я строка рекламной информации,
 24 байта - 1-я строка заголовка незапрограммированного товара,
 24 байта - 1-я строка заголовка незапрограммированного товара.
<- Весы


Мне нужно узнать как писать в порт эти самые HEX-XX и текстовые строки и читать их из порта. Соответственно, как определить, какой HEX мне прислали. Вариант if buffer=$00 не работает.

Мой код:

var buffer:byte;
   size,NOBW:Cardinal;
   result:boolean;
begin
PurgeComm(hPort,PURGE_TXABORT+PURGE_RXABORT);

GetCommState(hPort, DCB);
DCB.Parity:=MARKPARITY;
SetCommState(hPort, DCB);
buffer:=$00;
size:=1;
result:=WriteFile(hPort, buffer, Size, NOBW, nil);
if result then Memo1.Lines.Add("   &#207;&#238;&#241;&#235;&#224;&#237;&#224; &#234;&#238;&#236;&#224;&#237;&#228;&#224; &#241;&#232;&#237;&#245;&#240;&#238;&#237;&#232;&#231;&#224;&#246;&#232;&#232;") else Memo1.Lines.Add("   &#202;&#238;&#236;&#224;&#237;&#228;&#224; &#241;&#232;&#237;&#245;&#240;&#238;&#237;&#232;&#231;&#224;&#246;&#232;&#232; &#205;&#197; &#239;&#238;&#241;&#235;&#224;&#237;&#224;");
GetCommState(hPort, DCB);
DCB.Parity:=SPACEPARITY;
SetCommState(hPort, DCB);
Result:=ReadFile(hPort, Buffer, Size, NOBW, nil);
if Buffer=$77 then Memo1.Lines.Add("   &#194;&#229;&#241;&#251; &#239;&#240;&#232;&#237;&#255;&#235;&#232; &#234;&#238;&#236;&#224;&#237;&#228;&#243; &#241;&#232;&#237;&#245;&#240;&#238;&#237;&#232;&#231;&#224;&#246;&#232;&#232;") else Memo1.Lines.Add("   &#194;&#229;&#241;&#251; &#205;&#197; &#239;&#240;&#232;&#237;&#255;&#235;&#232; &#234;&#238;&#236;&#224;&#237;&#228;&#243; &#241;&#232;&#237;&#245;&#240;&#238;&#237;&#232;&#231;&#224;&#246;&#232;&#232;");

buffer:=$02;
size:=1;
result:=WriteFile(hPort, buffer, Size, NOBW, nil);
if result then Memo1.Lines.Add("   &#207;&#238;&#241;&#235;&#224;&#237; &#231;&#224;&#239;&#240;&#238;&#241; &#242;&#229;&#234;&#243;&#249;&#229;&#227;&#238; &#226;&#229;&#241;&#224;") else Memo1.Lines.Add("   &#199;&#224;&#239;&#240;&#238;&#241; &#242;&#229;&#234;&#243;&#249;&#229;&#227;&#238; &#226;&#229;&#241;&#224; &#205;&#197; &#239;&#238;&#241;&#235;&#224;&#237;");
Result:=ReadFile(hPort, Buffer, Size, NOBW, nil);
if Buffer=$01 then Memo1.Lines.Add("   &#194;&#229;&#241;&#251; &#239;&#240;&#232;&#237;&#255;&#235;&#232; &#234;&#238;&#236;&#224;&#237;&#228;&#243;") else Memo1.Lines.Add("   &#194;&#229;&#241;&#251; &#205;&#197; &#239;&#240;&#232;&#237;&#255;&#235;&#232; &#234;&#238;&#236;&#224;&#237;&#228;&#243;");

Result:=ReadFile(hPort, Buffer, Size, NOBW, nil);
if Buffer=$00 then Memo1.Lines.Add("   &#212;&#238;&#240;&#236;&#224;&#242; &#253;&#242;&#232;&#234;&#229;&#242;&#234;&#232; &#192;");
if Buffer=$01 then Memo1.Lines.Add("   &#212;&#238;&#240;&#236;&#224;&#242; &#253;&#242;&#232;&#234;&#229;&#242;&#234;&#232; B");
if Buffer=$02 then Memo1.Lines.Add("   &#212;&#238;&#240;&#236;&#224;&#242; &#253;&#242;&#232;&#234;&#229;&#242;&#234;&#232; C");
if Buffer=$03 then Memo1.Lines.Add("   &#212;&#238;&#240;&#236;&#224;&#242; &#253;&#242;&#232;&#234;&#229;&#242;&#234;&#232; D");
Result:=ReadFile(hPort, Buffer, Size, NOBW, nil);
Memo1.Lines.Add("   &#196;&#235;&#232;&#237;&#224; &#253;&#242;&#232;&#234;&#229;&#242;&#234;&#232; "+IntToStr(buffer));


Код естественно неправильный где-то, поэтому мне можно не говорить, какой я корявый.


 
Phantomouse ©   (2004-12-14 16:32) [1]

Простите. небольшая ошибка. В последнем шаге в описании протокола не весы передают данные компьютеру, а компьютер весам. (это там, где написано Компьютер <- Данные (106 байт)... и т.д.)


 
TUser ©   (2004-12-14 18:42) [2]

ну и шли туда $xx - это и есть hex


 
DiamondShark ©   (2004-12-14 20:25) [3]

Ну, во-первых.
Менять настройку Parity надо после того, как от весов получен ответ на синхронизацию.
Иначе синхробайт от весов не будет принят.

Трассируй не возвращаемый результат ReadFile/WriteFile, а буфер и количество посланных/принятых байт.

Строки посылать, используя в качестве буфера массив символов.


 
ECM ©   (2004-12-15 12:00) [4]

Могу посоветовать свою софтину - писалась как раз под решение
такого класса задач - она меня уже выручала неоднократно.
http://kolibdb.100free.com/wTerm.zip ~ 80кБ



Страницы: 1 вся ветка

Текущий архив: 2005.02.06;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
1-1106326550
sloug
2005-01-21 19:55
2005.02.06
Ошибка


6-1100945155
Sicilla
2004-11-20 13:05
2005.02.06
Несовместимость типов


6-1100851087
Julia
2004-11-19 10:58
2005.02.06
Передача файла через прямое модемное соединение


9-1099655298
Ландграф Павел
2004-11-05 14:48
2005.02.06
У меня сменили пароль на ник


1-1106300946
GH@ST
2005-01-21 12:49
2005.02.06
КАк убрать ковычку из строки?