Как отправить данные с модемом (RS232) на Verifiedone VX520?

Я хочу отправить данные с модемом RS-232 ( COM3) на Verifiedone VX520. Как его инициализировать и как включить библиотеку? Как я могу набрать номер с помощью Verifiedone VX520?

h_modem = open(DEV_COM3 , 0);

1 ответ

Я немного смущен вашим вопросом. COM3 является COM-портом для встроенного модема, но когда мы говорим о RS-232, я думаю о порте 1 на 520 или 2 на 570- в любом случае, это будет для внешнего модема, и я предполагаю, что вы не говорите об этом... Кроме того, ваш пример кода назначает дескриптор для CLOCK, а не модема. Опечатка?

Глава 10 "Руководства для программистов Verix eVo ACT" станет вашим другом для помощи, связанной с модемом. Так же как и раздел "Вызовы функций модемного движка" того же документа (стр. 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), и должна быть достаточно большой, чтобы вместить четыре дополнительных символа команды, используемых этой функцией. Самая длинная команда Хейса, которую можно отправить, составляет 40 байт.

Когда xmdm_get_line_dial() возвращается, iwrite содержит число байтов, записанных в буфер команд модема, а dial_string содержит полную командную строку набора, длина строки которой должна быть равна iwrite для успешного набора.

Обратите внимание, что "30" выше - это время ожидания в секундах. Если вы передадите 0, время не истечет.

Проверьте result чтобы убедиться, что вы подключились (какой-то мудрец из Хейса решил разделить эти значения подключения):

if( result == CONNECT ||
    result == CONNECT_300 ||
    result== CONNECT_1200 ||
    (result >= CONNECT_600 && result <= CONNECT_115200) )

ОТПРАВИТЬ И ПОЛУЧИТЬ ДАННЫЕ

int totalBytesRead = xmdm_receive_data(hModem, buffer, 1, 1, 1000);

считывание из [hMmodem], в [buffer], ([1]-ignored), до [1] char(s), тайм-аут после [1000] "центсекунд" (сотых долей секунды, то есть 10 секунд). Обратите внимание, что totalBytesRead будет отрицательным при ошибке. Проверьте документацию для различных возможных возвращаемых значений.

int totalBytesSent = xmdm_send_data (hModem, buffer, i, 300);

отправить [i] байтов из [buffer] в [hmodem], тайм-аут после [300] "центсекунд" (3 секунды). Обратите внимание, что totalBytesSent будет отрицательным при ошибке. Проверьте документацию для различных возможных возвращаемых значений.

БЛИЗКО

close(hModem);

ВЕРНУТЬСЯ В VMAC

EESL_send_event("DEVMAN", COMM_3_RELEASED_EVENT, (unsigned char*) 0, 0);
Другие вопросы по тегам