Отправить sms через COM порт

marinius
Дата: 21.11.2007 06:36:03
Здравствуйте. Программа, которую я пишу делает следующее: запускает консольный процесс, если процесс завершился с ошибкой, то посылает sms через телефон подключённый к компьютеру на другой номер телефона. Sms кодируется в самой программе. Программа , когда прогонишь пошагово,в месте записи в порт выдаёт ошибку "Неверный дескриптор". Что это значит? Вот фрагмент кода:
ExecConsoleApp(Cmd,OutP,ErrP,i); {Процедура запуска процесса}
    if  i<>0 then {Если процесс закончился с ошибкой}
    begin
    {Создаём файл и его хэндл}
      hInitComPort:=CreateFile('COM5',
                                GENERIC_WRITE,
                                0,
                                NIL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL {OR FILE_FLAG_OVERLAPPED},
                                0);
      PurgeComm(hInitComPort, PURGE_TXCLEAR or PURGE_RXCLEAR);
      GetCommState(hInitComPort, dcbPort);
      dcbPort.BaudRate := 9600;
      dcbPort.ByteSize := 8;
      dcbPort.Parity   := NOPARITY;
      dcbPort.StopBits := ONESTOPBIT;
      DcbPort.Flags := 1;

      SetCommState(hInitComPort, dcbPort);

      {Формируем pdu-строку для отправки sms}

        try
          Stroka := atStroka+#13+#10+pduStroka+#26;
          NumberOfBytesToWrite := Length(Stroka);
          [color=red]if not WriteFile(hInitComPort, PChar(Stroka)^, NumberOfBytesToWrite, FNumberOfBytesWritten,  nil) then[/color]
raise Exception.Create('Error '+SysErrorMessage(GetLastError));
          FlushFileBuffers(hInitComPort);
        finally
        end;
        CloseHandle(hInitComPort);
        
    end
    else
    begin
      OutP.Free;
      ErrP.Free;
    end;

end;
Ничего не понимаю уже?
Крушинка
Дата: 21.11.2007 09:29:24
Для начала было бы неплохо после CreateFile поставить

Win32Check(hInitComPort <> INVALID_HANDLE_VALUE)
alex0
Дата: 21.11.2007 09:38:06
Из того что вы проверили GetLastError после записи в файл еще не слелует что ошибка возникла в момент записи а до этого её не было. Попробуйте для начала так.
      hInitComPort:=CreateFile('COM5',
                                GENERIC_WRITE,
                                0,
                                NIL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL {OR FILE_FLAG_OVERLAPPED},
                                0);
      if hInitComPort=INVALID_HANDLE_VALUE then ShowMessage('Ёхарный бабай! Дескриптор то неверный!');
Dimitry Sibiryakov
Дата: 21.11.2007 09:42:22

Ну, зачем там PurgeComm я не знаю, но пусть будет. А CreateFile точно
возвращает правильный хэндл, а не ошибку?..

Posted via ActualForum NNTP Server 1.4

marinius
Дата: 21.11.2007 09:48:48
alex0
Из того что вы проверили GetLastError после записи в файл еще не слелует что ошибка возникла в момент записи а до этого её не было. Попробуйте для начала так.
      hInitComPort:=CreateFile('COM5',
                                GENERIC_WRITE,
                                0,
                                NIL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL {OR FILE_FLAG_OVERLAPPED},
                                0);
      if hInitComPort=INVALID_HANDLE_VALUE then ShowMessage('Ёхарный бабай! Дескриптор то неверный!');

В этом месте всё нормально, условие false.
marinius
Дата: 21.11.2007 09:53:05
А во т на этой строчке тормозит:
 if not WriteFile(hInitComPort, PChar(Stroka)^, NumberOfBytesToWrite, FNumberOfBytesWritten, nil) then

:( ???
Крушинка
Дата: 21.11.2007 09:57:18
Оберни все предыдущие функции в Win32Check. Всё нормально там будет?
alex0
Дата: 21.11.2007 10:03:59
Ну можно попробовать с атрибутами файла поиграться. Например GENERIC_READ or GENERIC_WRITE мало ли что хотя вряд ли. Или считать при записи в данный девайс действительно происходит такая ошибка и это проблема девайса а не программы.
marinius
Дата: 21.11.2007 10:35:40
Крушинка
Оберни все предыдущие функции в Win32Check. Всё нормально там будет?

Мне не совсем понятно что значит оберни все функции, но я сделала так после createfile
if not Win32Check(hInitComPort <> INVALID_HANDLE_VALUE) then
      raise Exception.Create(SysErrorMessage(GetLastError));

И в этом месте прошло успешно, т.е. условие false

Ещё я заметила такой глюк в программе: после перезагрузки компа все условия (с вашими поправками) проходят успешно т.е. без ошибок, но и sms не посылается. После нескольких компиляций или пошаговой прогонки начинает виснуть... раьше в конце приведённого кода стояли ещё 2-е строки
OutP.Destroy;
ErrP.Destroy;
В эти переменные типа TStringList грузятся ответы выводимые на консоль Успешный вывод/Ошибки (в основном нужны для просмотра и вывода в memo)
И после ErrP.Destroy вылазила ошибка Access Violation. потом я их закоментировала и вот пошла такая беда... может дело в них и они как-то память засоряют, хотя связи не вижу?
marinius
Дата: 21.11.2007 10:38:30
раьше в конце приведённого кода ...

После
CloseHandle(hInitComPort);