C# и работа с Com-портом

Тема в разделе ".NET", создана пользователем alex_nv, 25 май 2009.

Статус темы:
Закрыта.
  1. alex_nv

    alex_nv Гость

    Добриы день
    может кто сталкивался и поможет решить следующую задачу на C#

    суть задачи состоит в том что бы написать программу прозвонки сигнализации
    програма должна звонить по определенным номерам телефонов
    где на другом конце стоит автоответчик который при входящем звонке генерит в линию сигнал частотой 700Гц и длительностью 4-5 сек.
    вот его то и нужно определить

    через COM посылаю модему(Zyxel U-1496) команду набора номера
    все нормально модем номер набирает, при поднятии трубки автоответчиком на другой стороне
    на LPT-порт подается сигнал(за счет переплюсовки в линии) и с етого момента нужно как бы начать слушать что приходит на модем и определить есть ли сигнал сигнализации

    есть определенные нароботки
    Код (Text):
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.IO.Ports;
    using System.Runtime.InteropServices;
    using System.Timers;
    using System.Threading;

    namespace AUTORING_ATS
    {
    public partial class Form1 : Form
    {
    bool timer = true;
    System.Timers.Timer tm;
    System.IO.Ports.SerialPort port = new System.IO.Ports.SerialPort();
    int port_time = 0; // время на ответ модема
    int out_time = 0; //время до поднятия трубки
    int num;

    public Form1()
    {
    InitializeComponent();
    IniFileClass a = new IniFileClass(@"c:\settings.ini");

    port.PortName = a.ReadString("portconfig", "PortName", "COM1");
    port.BaudRate = a.ReadInt("portconfig", "PortSpeed", 38400);
    port.WriteTimeout = 500;
    port.ReadTimeout = 500;
    port.Parity = Parity.None;
    port.DataBits = 8;
    port.StopBits = StopBits.One;
    port.Handshake = Handshake.RequestToSend;
    port.DtrEnable = true;
    port.RtsEnable = true;
    port.NewLine = System.Environment.NewLine;
    port_time = a.ReadInt("portconfig", "PortTime", 40);
    out_time = a.ReadInt("portconfig", "OutTime", 15);

    }
    private void button1_Click(object sender, EventArgs e)
    {
    //tm = new System.Timers.Timer();
    //tm.Interval = 6000;
    //tm.Enabled = true;
    //tm.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    Reset_LTP();
    string cache = "";
    port.Open();
    port.WriteLine("AT+FCLASS=8+VIT=60+VVT=1+VSM=30+VDH=1+VRA=0+VRN=57");
    Thread.Sleep(1000);
    port.WriteLine("ATDT35199");
    Thread.Sleep(2000); // ОЖИДАЕМ СИГНАЛА ПОДНЯТИЯ ТРУБКИ ЕСЛИ ПОЯВИЛСЯ ТО НАЧИНАЕМ
    //tm.Start();    //ЗАПИСЬ
    port.WriteLine("AT+VRX");
    Thread.Sleep(100);
    while (port.ReadLine() == "CONNECT")
    {
    Thread.Sleep(100);
    }
    MessageBox.Show("START RECORDING");
    while (port.BytesToRead > 0)
    {
    try
    {
    cache += port.ReadLine();
    }
    catch{ }
    //MessageBox.Show(cache);
    }
    //tm.Stop();
    port.WriteLine("AT+VLS=0");
    port.Close();
    MessageBox.Show("КОНЕЦ");
    MessageBox.Show("-" + cache + "-");
    }
    public void OnTimedEvent(object source, ElapsedEventArgs e)
    {
    timer = false;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
    }
    public void Reset_LTP()
    {
    LPTPort.OutputLPT(889, 127);           
    }
    }
    //================================================================================
    ========
    //======================= КЛАС ИНИЦИАЛИЗАЦИИ ПАРАМЕТРОВ ==================================
    //================================================================================
    ========
    public class LPTPort
    {
    [DllImport("inpout32.dll", EntryPoint = "Inp32")]
    public static extern int InputLPT(int adress);

    [DllImport("inpout32.dll", EntryPoint = "Out32")]
    public static extern void OutputLPT(int adress, int value);
    }

    //================================================================================
    ========
    //======================= КЛАС ИНИЦИАЛИЗАЦИИ ПАРАМЕТРОВ ==================================
    //================================================================================
    ========
    public class IniFileClass
    {
    private String IniFile = "";

    [DllImport("kernel32")]
    private static extern long WritePrivateProfileInt(String Section, String Key, int Value, String FilePath);
    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(String Section, String Key, String Value, String FilePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileInt(String Section, String Key, int Default, String FilePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(String Section, String Key, String Default, StringBuilder retVal, int Size, String FilePath);

    public IniFileClass(String IniFile)
    {
    this.IniFile = IniFile;
    }

    public String ReadString(String Section, String Key, String Default)
    {
    StringBuilder StrBu = new StringBuilder(255);
    GetPrivateProfileString(Section, Key, Default, StrBu, 255, IniFile);
    return StrBu.ToString();
    }

    public int ReadInt(String Section, String Key, int Default)
    {
    return GetPrivateProfileInt(Section, Key, Default, IniFile);
    }

    public void WriteString(String Section, String Key, String Value)
    {
    WritePrivateProfileString(Section, Key, Value, IniFile);
    }

    public void WriteInt(String Section, String Key, int Value)
    {
    WritePrivateProfileInt(Section, Key, Value, IniFile);
    }
    }
    }
    проблема здесь
    Код (Text):
    port.WriteLine("AT+VRX");
    Thread.Sleep(100);
    while (port.ReadLine() == "CONNECT")
    {
    Thread.Sleep(100);
    }
    MessageBox.Show("START RECORDING");
    while (port.BytesToRead > 0)
    {
    try
    {
    cache += port.ReadLine();
    }
    catch{ }
    //MessageBox.Show(cache);
    }
    я получаю ответ что запись началась но на порту нету ничего,
    хотя когда использую HyperTerminal данные с порта поступают как положенно

    набор команд которые я посылаю модему один и тот же
    почему же я ничего не могу снять с порта? может не правильно что-то

    ребята ПОМОГИТЕ, может кто сталкивался с работой с COM-портом
    бьюсь над етим вопросом уже 2 месяц

    всем заранее спасибо
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей