Форум: "WinAPI";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Вниз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(" Ïîñëàíà êîìàíäà ñèíõðîíèçàöèè") else Memo1.Lines.Add(" Êîìàíäà ñèíõðîíèçàöèè ÍÅ ïîñëàíà");
GetCommState(hPort, DCB);
DCB.Parity:=SPACEPARITY;
SetCommState(hPort, DCB);
Result:=ReadFile(hPort, Buffer, Size, NOBW, nil);
if Buffer=$77 then Memo1.Lines.Add(" Âåñû ïðèíÿëè êîìàíäó ñèíõðîíèçàöèè") else Memo1.Lines.Add(" Âåñû ÍÅ ïðèíÿëè êîìàíäó ñèíõðîíèçàöèè");
buffer:=$02;
size:=1;
result:=WriteFile(hPort, buffer, Size, NOBW, nil);
if result then Memo1.Lines.Add(" Ïîñëàí çàïðîñ òåêóùåãî âåñà") else Memo1.Lines.Add(" Çàïðîñ òåêóùåãî âåñà ÍÅ ïîñëàí");
Result:=ReadFile(hPort, Buffer, Size, NOBW, nil);
if Buffer=$01 then Memo1.Lines.Add(" Âåñû ïðèíÿëè êîìàíäó") else Memo1.Lines.Add(" Âåñû ÍÅ ïðèíÿëè êîìàíäó");
Result:=ReadFile(hPort, Buffer, Size, NOBW, nil);
if Buffer=$00 then Memo1.Lines.Add(" Ôîðìàò ýòèêåòêè À");
if Buffer=$01 then Memo1.Lines.Add(" Ôîðìàò ýòèêåòêè B");
if Buffer=$02 then Memo1.Lines.Add(" Ôîðìàò ýòèêåòêè C");
if Buffer=$03 then Memo1.Lines.Add(" Ôîðìàò ýòèêåòêè D");
Result:=ReadFile(hPort, Buffer, Size, NOBW, nil);
Memo1.Lines.Add(" Äëèíà ýòèêåòêè "+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 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.031 c