Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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("   &#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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.031 c
1-1105224751
Enabled
2005-01-09 01:52
2005.02.06
Как получить TShiftState который в OnMouseDown используется ?


1-1106055019
Нуждающийся в помощи
2005-01-18 16:30
2005.02.06
DLL: Динамическая загрузка/выгрузка


6-1100863537
AlekseyUpstar
2004-11-19 14:25
2005.02.06
Удалленное управление компьютером


1-1106574729
vladimir29
2005-01-24 16:52
2005.02.06
WEBBrowsere


3-1103385020
Piter
2004-12-18 18:50
2005.02.06
Скорость выборки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский