Что нового

[Данные, строки] Как отправить CTRL+Z через COM-порт в USB-модем

Юрчище

Новичок
Сообщения
16
Репутация
0
При отправке SMS через USB-модем не получается послать "Ctrl+Z" в порт модема:
Код:
#include <CommMG.au3>

; открыл нужный порт, используя _CommSetPort(...)
; ввел пин-код командой _CommSendString('AT+CPIN="9751"' & @CR, 1)
; установил текстовый режим командой _CommSendString('AT+CMGF=1' & @CR, 1)

; 1-ая команда отправки SMS-сообщения
_CommSendString('AT+CMGS="+79991234567"' & @CR, 1)
sleep(500)

; 2-ая команда отправки SMS-сообщения
$sRet = _CommSendString("Test" & Chr(26), 1)    ;Chr(26) - это комбинация нажатия клавиш CTRL + Z
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sRet = ' & $sRet & @crlf & '>Error code: ' & @error & @crlf)

; Чтение ответа модема
$sRet =  _CommGetstring()
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sRet = ' & $sRet & @crlf & '>Error code: ' & @error & @crlf)

; Закрываю порт _CommClosePort()


В результате в консоли получаю: +CMS ERROR: 500

В чем ошибка ?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
А вы дожидаетесь > или 500 мс достаточно?
 
Автор
Ю

Юрчище

Новичок
Сообщения
16
Репутация
0
Да, 500 милисек хватает с запасом, чтобы получить ответ от модема: ">"

Вы однажды писали:
inververs сказал(а):
Если ли способ читать и посылать данные в COM порт?
Например через API read file или еще как то?
Я знаю про COMMs UDF и ее библиотеку comMG.dll, но она мне не подходит. т.к она глючная.
Вот хочу найти альтернативу, может кто что подскажет?
Желательно что бы без dll, OCX итп
inververs сказал(а):
Yashied [?]
В чем заключаются глюки?
У меня usb свисток есть, так он сам перезапускается и если в этот момент начать в порт писать или считывать, то прога вылетает или зависает.
Посмотрю CommApi

Каковы Ваши впечатления от CommAPI ?
 
Автор
Ю

Юрчище

Новичок
Сообщения
16
Репутация
0
inververs сказал(а):
Юрчище [?]
Каковы Ваши впечатления от CommAPI ?
Мне не очень нравится, если бы были альтернативы, перешел бы. Но пока ей пользуюсь.

1. Правильно ли я понял, что CommAPI по Вашему мнению лучше, чем COMMs UDF ?
2. А как в CommAPI Вы вводите CTRL+Z ?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Да, CommAPi получше, он без библиотеки, не нужно ее таскать.
2. Тоже, через chr(26) функцией _CommAPI_TransmitString


Добавлено:
Сообщение автоматически объединено:

Если захотите ее, то вот вам правильная функция открытия порта:
Код:
Func _CommAPI_OpenCOMPort_2(Const $iPort, Const $iBaudRate = 9600, Const $iParity = 0, Const $iByteSize = 8, Const $iStopBits = 1)
	Local $sFileName = "\\.\COM" & $iPort
	Local $hFile = _WinAPI_CreateFile($sFileName, 2, 6)
	If @error Then Return SetError(@error, @ScriptLineNumber, 0)
	If $hFile <= 0 Then Return SetError(-1, @ScriptLineNumber, 0)

	Local $tDCB = DllStructCreate($tagDCB)
	DllStructSetData($tDCB, 'DCBlength', DllStructGetSize($tDCB))

	DllStructSetData($tDCB, 'BaudRate', $iBaudRate)
	DllStructSetData($tDCB, 'Parity', $iParity)
	DllStructSetData($tDCB, 'ByteSize', $iByteSize)
	DllStructSetData($tDCB, 'StopBits', $iStopBits)

;~ 	_CommAPI_BuildCommDCB($sMode, $tDCB)
;~ 	If @error Then Return SetError(@error, @extended, 0)

	Local $tCommTimeouts = DllStructCreate($tagCOMMTIMEOUTS)
	_CommAPI_SetCommTimeoutsElement($tCommTimeouts, "ReadTotalTimeoutMultiplier", 1)
	If @error Then Return SetError(@error, @extended, 0)

	_CommAPI_SetCommTimeoutsElement($tCommTimeouts, "WriteTotalTimeoutMultiplier", 1)
	If @error Then Return SetError(@error, @extended, 0)


	If Not _CommAPI_SetCommState($hFile, $tDCB) Then Return SetError(@error, @extended, 0)
	If Not _CommAPI_SetCommTimeouts($hFile, $tCommTimeouts) Then Return SetError(@error, @extended, 0)

	Return $hFile

EndFunc   ;==>_CommAPI_OpenCOMPort
 
Автор
Ю

Юрчище

Новичок
Сообщения
16
Репутация
0
Вот нашел нечто похожее, но там странная переменная: $time = 10


Serial Port /COM Port UDF

Posted March 17, 2010
On 17.03.2010 at 3:50 AM, 'Rambo said:
Man, i cant send Ctrl-z
I tested _CommSendByte(26,0) and _CommSendString(Chr(26))
I need to send Ctrl-z to the modem to send a SMS
Thanks
ОТВЕТ:
Код:
$AT_send = 'AT+CMGS="'
$number = "+123456789"
$time = 10
$text = "Send SMS"
$data1 = (""&$AT_send &$number&'"'&@CR)
$data2 = (""&$text &Chr(26) &@CR)
sleep(10)
_CommSendString($data1,$time)
sleep(400)
_CommSendString($data2,$time)

ОТВЕТ:
And there is no need to send @CR after sending Ctrl-Z,
The question is: now it works, but just because i added $time ?
in my tests i didnt use $time option. Maybe it was the problem...
 
Верх