Я немного смущен вашим вопросом. COM3 - это COM-порт для встроенного модема, но когда мы говорим о rs-232, я думаю о порте 1 на 520 или 2 на 570 - в любом случае, это было бы для внешнего модема, и я предполагая, что вы не говорите об этом ... Кроме того, ваш образец кода назначает дескриптор CLOCK, а не модем. Опечатка?
Глава 10 «Руководство по программированию ACE Verix eVo» станет вашим другом для справки, связанной с модемом. Таким образом, раздел «Функциональные вызовы модема» в том же документе (страница 275 в моей версии).
Я использую библиотеку xmodem
для модемных функций. Я включаю биты моего кода, который я использую для связи модема.
ЗАПРОС
Если вы используете VMAC, то сначала вы должны запросить модемное устройство (если вы не используете VMAC, переходите к следующему разделу). Один совет, который мне однажды дал, - это сначала отключить режим комбо. Это было для 37x0 терминалов (Verix) и не могут быть актуальны больше, но я до сих пор сделать это:
set_combo_mode(0)
я затем отправить пользовательское событие, определенный в моем файле .rck следующим образом:
(HIGH, MODEM_REQUEST_EVENT, MODEM_EVENT, {(COMM_3)})
Если вы используете VMAC, вы уже должны быть знакомы с тем, что эта таблица определяется как «Приоритет, входное событие, событие вывода, устройства». Дальнейшее объяснение выходит за рамки этого ответа.
ОТКРЫТЫЙ
Далее, вам нужно открыть модем и получить ручку:
hModem = open(DEV_COM3, 0);
Будьте уверены, чтобы проверить, что hModem
> 0 и иметь дело со случаями, когда это не так.
ИНИЦИАЛИЗИРОВАТЬ
Сначала вы должны инициализировать терминал < - интерфейс> модем:
struct Opn_Blk Com3ob;
Com3ob.rate = Rt_115200;
Com3ob.format = Fmt_A8N1; //another common rate is Fmt_A7E1
Com3ob.protocol = P_char_mode;
Com3ob.parameter = 0;
set_opn_blk(hModem, &Com3ob);
Примечание: скорость передачи данных может быть быстрее, чем модемное соединение, так как модем может обмениваться данными с хостом системы с одной скоростью, а также разговаривать с терминалом в другой. Обратите внимание, что было бы разумно всегда делать терминал с модемной скоростью, превышающей скорость модема.
Тогда вы можете также отправить строку инициализации модема, чтобы установить параметры связи между модемом и сервером вы набираете в:
write(hModem, "+++", 3); // put the modem into "Command mode"
write(hModem, ATString, ATStringLength); // be sure ATString ends with '\r'
//read(hModem, buffer, readLength) --> process the response.
// How you do that will depend on if echo and or verbose is on
ДИАЛ
int result = xmdm_get_line_dial(hModem, dial_string, &iWrite, hClock, 30);
Примечания от документации:
dial_string должно быть нулевым, завершена строка, содержащая действительный набор информации (см. таблицу 18) и должна быть достаточно большой, чтобы разместить четыре дополнительных командных символа, используемые этой функцией. Самая длинная команда Hayes, которую можно отправить, составляет 40 байт.
Когда xmdm_get_line_dial() возвращает, iwrite содержит число байт записываются в буфер команд модема и dial_string содержит командную строку полного набора, чью длину строки должна быть равны iwrite для успешного набора.
Обратите внимание, что «30» - это таймаут в секундах. Если вы перейдете в 0, это не будет тайм-аут.
Проверить result
, чтобы убедиться, что вы подключены (некоторые мудрый парень в Hayes решил разделить эти подключения значения вверх):
if(result == CONNECT ||
result == CONNECT_300 ||
result== CONNECT_1200 ||
(result >= CONNECT_600 && result <= CONNECT_115200))
SEND & ПОЛУЧИТЬ ДАННЫЕ
int totalBytesRead = xmdm_receive_data(hModem, buffer, 1, 1, 1000);
читать [ hMmodem], в [buffer], ([1] -ignored), до [1] char (s), тайм-аут после [1000] «сантисекунд» (100ths секунды, то есть 10 секунд). Обратите внимание, что totalBytesRead будет отрицательным при ошибке. Проверьте документацию на различные возможные возвращаемые значения.
int totalBytesSent = xmdm_send_data (hModem, buffer, i, 300);
отправить [я] байты из буфера [] до [hmodem], после того, как тайм-аут [300] "сантисекунд" (3 секунды). Обратите внимание, что totalBytesSent будет отрицательным при ошибке. Проверьте документацию на различные возможные возвращаемые значения.
ЗАКРЫТЬ
close(hModem);
ВОЗВРАТ К VMAC
EESL_send_event("DEVMAN", COMM_3_RELEASED_EVENT, (unsigned char*) 0, 0);
Является 'verifone' целевой модем или это источник модем? Если это исходный модем, я считаю, что verifone имеет свой собственный язык под названием 'tcl', если только эта версия не использует скомпилированный c, как« rover ». Если это цель, вам нужно будет написать код в своем источнике, используя поддерживаемый им язык, или на языке, поддерживаемом основным компьютером, на котором подключен исходный модем. Ваш вопрос связан с передачей данных? Или это о программировании в verifone 'tcl'? – alvits
VeriFone использовал TCL в (MUCH) более старых моделях (например, терминалы Zon и Tranz). Начиная с линии «Omni» (например, 3200), они перешли на стандартный код C. Слава богу - по сравнению с C, TCL была настоящей болью! – David