views:

65

answers:

1

Hello everybody,

I am using Serial COM Simply in C# by Noah Coad http://www.devhood.com/Tutorials/tutorial_details.aspx?tutorial_id=320

and I have available ports on my machine whichs COM1,COM2,COM6,COM7,COM8,COM9,COM10,COM11,COM12,COM13 and I use COM6,COM7,COM8,COM9,COM10,COM11,COM12 with ZyXEL Omni 56K modem, I use these 7 ports with 7 modems. There are clients for getting answer wtih this modems. I use the mscomm.ocx to listen com ports. My application is running successfully but sometimes one modem processing 50-100 ruqest and answer then it stops its working and my clients getting time out because they do not get the answer from server(using com port modem). First it getting "RING" and then getting "CONNECT 1200/V.22b 2400/NONE" then getting orginal package of my client and I process this package and produce a answer to client. I use 7 exe files for open and listen com ports because when I use 1 exe file I do not process same time. I know I must use Thread but I dont know. Please help me, How can I listen 7 com port same time and doing my work with no problems. Always I want to my application work correctly and reply to all clients in same time. These is my codes :

using System;

using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Text; using System.IO; using System.Diagnostics; using System.Threading;

namespace Serial_Demo { /// /// Summary description for Form1. /// public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.Label label8;

    private Sistem sistemim = new Sistem();
    private ParcaKontorRaporu parcaKontorRaporu = new ParcaKontorRaporu();
    private ParcaKontorYukleme parcaKontorYukleme = new ParcaKontorYukleme();
    private FaturaOdeme faturaOdeme = new FaturaOdeme();
    private FaturaRaporu faturaRaporu = new FaturaRaporu();
    private FaturaSorgulama faturaSorgulama = new FaturaSorgulama();
    private NumaraSorgulama numaraSorgulama = new NumaraSorgulama();
    private TamKontorRaporu tamKontorRaporu = new TamKontorRaporu();
    private TamKontorYükleme tamKontorYukleme = new TamKontorYükleme();
    private BakiyeSorgulama bakiyeSorgulama = new BakiyeSorgulama();
    private HavaleBildirimi havale = new HavaleBildirimi();
    private KartKontorSifresi kartSifresi = new KartKontorSifresi();
    private KartKontorRaporu kartRapor = new KartKontorRaporu();
    private FiyatListesi fiyatListesi = new FiyatListesi();
    private AylikKontorRaporu aylikKontorRapor = new AylikKontorRaporu();
    private AylikFaturaRaporu aylikFaturaRapor = new AylikFaturaRaporu();
    private SifreDegirtirme sifreDegistir = new SifreDegirtirme();
    private BankaExtra BankExtra = new BankaExtra();
    private Duyurular duyuru = new Duyurular();
    private DuyurularExtra duyuruExtra = new DuyurularExtra();
    private BankaListesi Bankalar = new BankaListesi();
    private KontorFiyatSorgula KontorFiyat = new KontorFiyatSorgula();

    string bugun = DateTime.Now.ToShortDateString();
    private AxMSCommLib.AxMSComm com;
    private Button btn_disconnect;
    private Label label1;
    private Panel panel1;
    string GidenToPos = null;
    private int count = 0;
    private IContainer components;
    private System.Windows.Forms.Timer timer1;
    private ListBox listBox1;
    private Label sayiLbl;
    private Label label2;
    Char chr = (char)13;

    public Form1()
    {
        InitializeComponent();

        InitComPort();
    }

    private void InitComPort()
    {     
        // Set the com port to be 1
        com.CommPort = 6;

        // This port is already open, then close.
        if (com.PortOpen)
            com.PortOpen = false;

        // Trigger the OnComm event whenever data is received
        com.RThreshold = 1;

        // Set the port to 9600 baud, no parity bit, 8 data bits, 1 stop bit (all standard)
        com.Settings = "1200,n,8,1";

        // Force the DTR line high, used sometimes to hang up modems
        //com.DTREnable = true;

        com.RTSEnable = true;

        com.DTREnable = true;

        // No handshaking is used
        com.Handshaking = MSCommLib.HandshakeConstants.comNone;

        // Use this line instead for byte array input, best for most communications
        com.InputMode = MSCommLib.InputModeConstants.comInputModeText;

        // Read the entire waiting data when com.Input is used
        com.InputLen = 0;

        // Don't discard nulls, 0x00 is a useful byte
        com.NullDiscard = false;

        // Attach the event handler
        com.OnComm += new System.EventHandler(this.OnComm);

        com.PortOpen = true;

        com.Output = "AT&F S0=1" + chr;
        com.Output = "ATM0" + chr;
        com.Output = "ATS7=90 +++ATH0" + chr;

    }

    private void OnComm(object sender, EventArgs e)  //  MSCommLib OnComm Event Handler
    {
       Thread.Sleep(400);

        if (com.InBufferCount > 0) 
        {
            string response = (string)com.Input;

            ProcessResponseText(response);
        }
        com.PortOpen = true;
    }

    private void ProcessResponseText(string input)
    {
        string IslemSaati = DateTime.Now.ToShortTimeString();

        if (input.Trim().Equals("RING"))
        {
            listBox1.Items.Add(IslemSaati + " - ringing...");
        }
        else
            if (input.Trim().Equals("CONNECT 1200/V.22b 2400/NONE"))
            {
                listBox1.Items.Add(IslemSaati + " - connecting...");

            }
            else
            {
                char[] c = input.Trim().ToCharArray();
                if (c[0].ToString() == "\x02")
                {
                    count++;
                    sayiLbl.Text = "number of process : " + Convert.ToString(count);

                    string gidecekStr = null;
                    gidecekStr = GeleniTemizle(input);
                    GidenToPos = null;

                    char[] k = gidecekStr.ToCharArray();

                    if (k[0].ToString() == "X")
                    {
                        for (int i = 1; i < k.Length; i++)
                        {
                            GidenToPos += k[i];
                        }
                    }
                    else
                    {
                        GidenToPos = paketFiltre(gidecekStr);
                    }

                    listBox1.Items.Add(IslemSaati + " - Coming Package : " + input);

                    com.Output = GidenToPos;

                    listBox1.Items.Add(IslemSaati + " - Going Package : " + GidenToPos);
                }
                else
                {
                    sayiLbl.Text = "number of process : " + Convert.ToString(count);
                }
            }
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {

        }
        base.Dispose(disposing);
    }

    public string paketFiltre(string gelen)
    {
        char[] c = gelen.ToCharArray();
        string gidecekStr = null;
        int secim = 0;

        if (c[18].ToString() == "1")
        {
            secim = 1;
        }
        if (c[18].ToString() == "2")
        {
            secim = 2;
        }
        if (c[18].ToString() == "3")
        {
            secim = 3;
        }
        if (c[18].ToString() == "4")
        {
            secim = 4;
        }
        if (c[18].ToString() == "5")
        {
            secim = 5;
        }
        if (c[18].ToString() == "6")
        {
            secim = 6;
        }
        if (c[18].ToString() == "7")
        {
            secim = 7;
        }
        if (c[18].ToString() == "8")
        {
            secim = 8;
        }
        if (c[18].ToString() == "9")
        {
            secim = 9;
        }
        if (c[18].ToString() == "A")
        {
            secim = 10;
        }
        if (c[18].ToString() == "B")
        {
            secim = 11;
        }
        if (c[18].ToString() == "C")
        {
            secim = 12;
        }
        if (c[18].ToString() == "D")
        {
            secim = 13;
        }
        if (c[18].ToString() == "E")
        {
            secim = 14;
        }
        if (c[18].ToString() == "F")
        {
            secim = 15;
        }
        if (c[18].ToString() == "G")
        {
            secim = 16;
        }
        if (c[18].ToString() == "H")
        {
            secim = 17;
        }
        if (c[18].ToString() == "I")
        {
            secim = 18;
        }
        if (c[18].ToString() == "J")
        {
            secim = 19;
        }
        if (c[18].ToString() == "K")
        {
            secim = 20;
        }
        if (c[18].ToString() == "L")
        {
            secim = 21;
        }

        switch (secim)
        {
            case 1:  // Bakiye Sorgulama
                gidecekStr = bakiyeSorgulama.BakiyeSorgula(gelen);
                break;

            case 2:  // Parça Kontör Talimatı Gönderme
                gidecekStr = parcaKontorYukleme.ParcaKontorYukle(gelen);
                break;

            case 3: // Parça Kontör Raporu
                gidecekStr = parcaKontorRaporu.Rapor(gelen);
                break;

            case 4: // Tam Kontör Talimatı Gönderme
                gidecekStr = tamKontorYukleme.KontorYukle(gelen);
                break;

            case 5: // Tam Kontör Raporu
                gidecekStr = tamKontorRaporu.Rapor(gelen);
                break;

            case 6: // Numara Sorgulama
                gidecekStr = numaraSorgulama.Sorgula(gelen);
                break;

            case 7: // Fatura Sorgulama
                gidecekStr = faturaSorgulama.Sorgulama(gelen);
                break;

            case 8: // Fatura Ödeme
                gidecekStr = faturaOdeme.FaturaOde(gelen);
                break;

            case 9: // Fatura Raporu
                gidecekStr = faturaRaporu.Rapor(gelen);
                break;

            case 10: // HAVALE/EFT BİLDİRİMİ
                gidecekStr = havale.HavaleEftBildirimi(gelen);
                break;

            case 11: // KART KONTÖR ŞİFRESİ ALMA
                gidecekStr = kartSifresi.KartKontorSifresiAlma(gelen);
                break;

            case 12: // KART KONTÖR RAPORU
                gidecekStr = kartRapor.Rapor(gelen);
                break;

            case 13: // FİYAT LİSTESİ
                gidecekStr = fiyatListesi.Liste(gelen);
                break;

            case 14: // GÜNLÜK/HAFTALIK/AYLIK KONTÖR RAPORU ALMA
                gidecekStr = aylikKontorRapor.Rapor(gelen);
                break;

            case 15: // GÜNLÜK/HAFTALIK/AYLIK FATURA RAPORU ALMA
                gidecekStr = aylikFaturaRapor.Rapor(gelen);
                break;

            case 16: // ŞİFRE DEĞİŞTİRME
                gidecekStr = sifreDegistir.SifreDegistir(gelen);
                break;

            case 17: // BANKA LİSTESİ
                gidecekStr = Bankalar.Liste(gelen);
                break;

            case 18: // BANKA EXTRA
                gidecekStr = BankExtra.Liste(gelen);
                break;

            case 19: // DUYURULAR
                gidecekStr = duyuru.Liste(gelen);
                break;

            case 20: // DUYURULAR EXTRA
                gidecekStr = duyuruExtra.Liste(gelen);
                break;

            case 21: // KONTÖR FİYAT SORGULA
                gidecekStr = KontorFiyat.Sorgula(gelen);
                break;
        }
        return gidecekStr;
    }

    public string ConvertToHex(string asciiString)
    {
        string hex = "";
        foreach (char c in asciiString)
        {
            int tmp = c;
            hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString()));
        }
        return hex;
    }

    private string HexAsciiConvert(string hex)
    {

        StringBuilder sb = new StringBuilder();

        for (int i = 0; i <= hex.Length - 2; i += 2)
        {

            sb.Append(Convert.ToString(Convert.ToChar(Int32.Parse(hex.Substring(i, 2),

            System.Globalization.NumberStyles.HexNumber))));

        }

        return sb.ToString();

    }
    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.components = new System.ComponentModel.Container();
        System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
        this.label8 = new System.Windows.Forms.Label();
        this.com = new AxMSCommLib.AxMSComm();
        this.btn_disconnect = new System.Windows.Forms.Button();
        this.label1 = new System.Windows.Forms.Label();
        this.panel1 = new System.Windows.Forms.Panel();
        this.label2 = new System.Windows.Forms.Label();
        this.sayiLbl = new System.Windows.Forms.Label();
        this.timer1 = new System.Windows.Forms.Timer(this.components);
        this.listBox1 = new System.Windows.Forms.ListBox();
        ((System.ComponentModel.ISupportInitialize)(this.com)).BeginInit();
        this.panel1.SuspendLayout();
        this.SuspendLayout();
        // 
        // label8
        // 
        this.label8.BackColor = System.Drawing.Color.Transparent;
        this.label8.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        this.label8.ForeColor = System.Drawing.SystemColors.Highlight;
        this.label8.Location = new System.Drawing.Point(0, 109);
        this.label8.Name = "label8";
        this.label8.Size = new System.Drawing.Size(160, 24);
        this.label8.TabIndex = 22;
        this.label8.Text = "Gelen/Giden Paketler :";
        // 
        // com
        // 
        this.com.Enabled = true;
        this.com.Location = new System.Drawing.Point(491, 109);
        this.com.Name = "com";
        this.com.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("com.OcxState")));
        this.com.Size = new System.Drawing.Size(38, 38);
        this.com.TabIndex = 14;
        // 
        // btn_disconnect
        // 
        this.btn_disconnect.Location = new System.Drawing.Point(533, 72);
        this.btn_disconnect.Name = "btn_disconnect";
        this.btn_disconnect.Size = new System.Drawing.Size(86, 23);
        this.btn_disconnect.TabIndex = 17;
        this.btn_disconnect.Text = "Bağlantıyı kes";
        this.btn_disconnect.Click += new System.EventHandler(this.btn_disconnect_Click);
        // 
        // label1
        // 
        this.label1.BackColor = System.Drawing.Color.Transparent;
        this.label1.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        this.label1.ForeColor = System.Drawing.Color.Red;
        this.label1.Location = new System.Drawing.Point(251, 17);
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size(148, 24);
        this.label1.TabIndex = 24;
        this.label1.Text = "DARKOCEAN";
        // 
        // panel1
        // 
        this.panel1.BackColor = System.Drawing.SystemColors.ControlLight;
        this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
        this.panel1.Controls.Add(this.label2);
        this.panel1.Controls.Add(this.sayiLbl);
        this.panel1.Controls.Add(this.label1);
        this.panel1.Controls.Add(this.btn_disconnect);
        this.panel1.Location = new System.Drawing.Point(0, 0);
        this.panel1.Name = "panel1";
        this.panel1.Size = new System.Drawing.Size(634, 104);
        this.panel1.TabIndex = 23;
        // 
        // label2
        // 
        this.label2.BackColor = System.Drawing.Color.Transparent;
        this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 14F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        this.label2.ForeColor = System.Drawing.Color.Red;
        this.label2.Location = new System.Drawing.Point(251, 41);
        this.label2.Name = "label2";
        this.label2.Size = new System.Drawing.Size(133, 24);
        this.label2.TabIndex = 26;
        this.label2.Text = " MODEM - 2";
        // 
        // sayiLbl
        // 
        this.sayiLbl.AutoSize = true;
        this.sayiLbl.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
        this.sayiLbl.ForeColor = System.Drawing.Color.Navy;
        this.sayiLbl.Location = new System.Drawing.Point(11, 72);
        this.sayiLbl.Name = "sayiLbl";
        this.sayiLbl.Size = new System.Drawing.Size(0, 13);
        this.sayiLbl.TabIndex = 25;
        // 
        // listBox1
        // 
        this.listBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(162)));
        this.listBox1.FormattingEnabled = true;
        this.listBox1.Location = new System.Drawing.Point(0, 136);
        this.listBox1.Name = "listBox1";
        this.listBox1.ScrollAlwaysVisible = true;
        this.listBox1.Size = new System.Drawing.Size(634, 134);
        this.listBox1.TabIndex = 27;
        // 
        // Form1
        // 
        this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
        this.ClientSize = new System.Drawing.Size(632, 270);
        this.Controls.Add(this.listBox1);
        this.Controls.Add(this.panel1);
        this.Controls.Add(this.com);
        this.Controls.Add(this.label8);
        this.Name = "Form1";
        this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
        this.Text = "DARKOCEAN";
        this.Load += new System.EventHandler(this.Form1_Load);
        ((System.ComponentModel.ISupportInitialize)(this.com)).EndInit();
        this.panel1.ResumeLayout(false);
        this.panel1.PerformLayout();
        this.ResumeLayout(false);

    }
    #endregion

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.Run(new Form1());
    }

    private void btn_disconnect_Click(object sender, System.EventArgs e)
    {
        // If com port is open then close it 
        // to disconnect connection

        if (com.PortOpen)
        {
            com.PortOpen = false;
            MessageBox.Show("Disconnected...", this.Text,
                MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }

    public string GeleniTemizle(string gelen)
    {
        string DATA = null;
        string LRC = null;

        string temp1 = gelen.Replace("\x02", "");
        string[] tempArray = temp1.Split('\x03');


        string kontrolLRC = "";

        string gelenLRC = tempArray[1];

        sbyte[] array;

        array = sistemim.PrepareLRCPacket(tempArray[0]);

        foreach (sbyte ch in array)
            LRC += Convert.ToChar(ch);

        kontrolLRC = LRC[LRC.Length - 1].ToString();

        if (gelenLRC == kontrolLRC )
        {
            DATA = tempArray[0];
        }
        else
        {
            sbyte[] array2;
            string LRC2 = null;

            array2 = sistemim.PrepareLRCPacket("000000000000215" + "package problem");
            DATA = null;

            foreach (sbyte ch2 in array2)
                LRC2 += Convert.ToChar(ch2);

            DATA = "X" + LRC2;
        }

        return DATA;
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

}

}

A: 

You should wrap your com port handling into a separate class, the class will have it's own instance of the com port and then you can create multiple instances of your wrapper class, one for each com port you want to access.

Chris Taylor