Monitor sériového portu [C#] – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Monitor sériového portu [C#] – .NET – Fórum – Programujte.comMonitor sériového portu [C#] – .NET – Fórum – Programujte.com

 

888johny0
Duch
24. 4. 2016   #1
-
0
-

Zdravím,

jedná se o prosbu, výpomoc s mým programem. Udělal jsem formulářový program na přenos dat mezi počítačem po sériovém portu COM, kde se nastavují vlastnosti portu (rychlost, parita...). dále je příjem a odesílání jednotlivých znaků a příjem a odesílání jednotlivého souboru. Je problém že přenos musí fungovat mezi asemblerem a C#. Mně přenos funguje pouze C# a  C#. Pokud použiji již hotový a funkční program z asembleru a můj program, tak můj program nepřijímá data. Někomu program může zabrat 60 minut práce a někdo jako já na tom pracoval přes měsíc a stále to není úplně funkční. Program klidně mohu zaslat někomu kdo by měl zájem pomoct.
Za výpomoc jsem schopen nabídnou finanční částku, ale jsem student prosil bych s mírou.

Zde je ukázka zdrojového kódu. Je to hodně zakomentované. Spíše to co neplatí.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;
using System.Windows;
using System.IO;

namespace SerialPortVlcek
{
    public partial class SerialPortForm : Form
    {
        bool _continue = true;
        SerialPort _serialPort = new SerialPort();

        PortChat mujPortChat = new PortChat();
        public SerialPortForm()
        {
            InitializeComponent();
            
        }

        private void konecButton_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void restartButton_Click(object sender, EventArgs e)
        {
            Application.Restart();
        }

        private void odeslatButton_Click(object sender, EventArgs e)
        {
            //_serialPort.PortName = this.SetPortName(portNameTextBox.Text);
            //_serialPort.BaudRate = this.SetPortBaudRate(Convert.ToInt16(portBaudRateTextBox.Text));
            //_serialPort.Parity = this.SetPortParity(portParityTextBox.Text);
            //_serialPort.DataBits = this.SetPortDataBits(Convert.ToInt16(portParityTextBox.Text));
            //_serialPort.StopBits = this.SetPortStopBits(portStopBitsTextBox.Text);

            string message = zpravaTextBox.Text;
            _serialPort.WriteLine(String.Format("<{0}>: {1}", jmenoTextBox.Text, message));

        }

        private void otevritVlaknoButton_Click(object sender, EventArgs e)
        {
            _serialPort.PortName = this.SetPortName(portNameTextBox.Text);
            _serialPort.BaudRate = this.SetPortBaudRate(Convert.ToInt16(portBaudRateTextBox.Text));
            _serialPort.Parity = this.SetPortParity(portParityTextBox.Text);
            _serialPort.DataBits = this.SetPortDataBits(Convert.ToInt16(portDataBitsTextBox.Text));
            _serialPort.StopBits = this.SetPortStopBits(portStopBitsTextBox.Text);
            switch (handShakeComboBox.Text)
            {
                case "None":
                    _serialPort.Handshake = this.SetPortHandshake(_serialPort.Handshake);
                    break;

                case "RequestToSend":
                    _serialPort.Handshake = this.SetPortHandshake(_serialPort.Handshake);
                    break;

                case "RequestToSend XOnXOff":
                    _serialPort.Handshake = this.SetPortHandshake(_serialPort.Handshake);
                    break;

                case "XOnXOff":
                    _serialPort.Handshake = this.SetPortHandshake(_serialPort.Handshake);
                    break;           
            }

            try
            {
                _serialPort.Open();
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception.Message);
            }
            

            // vytvorit vlakno - "delnika" ktere sleduje prichozi data na portu
            // po spusteni vlakna se zacne vykonavat metoda Read
            Thread readThread = new Thread(Read);
            // spustit cteci vlakno - ted se zacne cist
            readThread.Start();

        }

        public string SetPortName(string defaultPortName)
        {
            string portName="";

            //Console.WriteLine("Available Ports:");
            //foreach (string s in SerialPort.GetPortNames())
            //{
            //    Console.WriteLine("   {0}", s);
            //}

            //Console.Write("Enter COM port value (Default: {0}): ", defaultPortName);
            //portName = Console.ReadLine();

            if (portName == "" || !(portName.ToLower()).StartsWith("com"))
            {
                portName = defaultPortName;
            }
            return portName;
        }

        public void Read()
        {
            while (_continue)
            {
                try
                {
                    string message = _serialPort.ReadLine();
                    //Console.WriteLine(message);
                    poleTextBox.AppendText(message);
                    poleTextBox.AppendText(" ");
                }
                catch (TimeoutException) { }
            }
        }

        public  int SetPortBaudRate(int defaultPortBaudRate)
        {
            string baudRate="";

           // Console.Write("Baud Rate(default:{0}): ", defaultPortBaudRate);
           // baudRate = Console.ReadLine();

            if (baudRate == "")
            {
                baudRate = defaultPortBaudRate.ToString();
            }

            return int.Parse(baudRate);
        }

        public Parity SetPortParity(string defaultPortParity)
        {
            string parity="";

          // Console.WriteLine("Available Parity options:");
          // foreach (string s in Enum.GetNames(typeof(Parity)))
          // {
           //     Console.WriteLine("   {0}", s);
           // }

           // Console.Write("Enter Parity value (Default: {0}):", defaultPortParity.ToString(), true);
          //  parity = Console.ReadLine();

            if (parity == "")
            {
                parity = defaultPortParity.ToString();
            }

            return (Parity)Enum.Parse(typeof(Parity), parity, true);
        }

        public int SetPortDataBits(int defaultPortDataBits)
        {
            string dataBits="";

            //Console.Write("Enter DataBits value (Default: {0}): ", defaultPortDataBits);
            //dataBits = Console.ReadLine();

            if (dataBits == "")
            {
                dataBits = defaultPortDataBits.ToString();
            }

            return int.Parse(dataBits.ToUpperInvariant());
        }

        public StopBits SetPortStopBits(string defaultPortStopBits)
        {
            string stopBits = "";

            //Console.WriteLine("Available StopBits options:");
            //foreach (string s in Enum.GetNames(typeof(StopBits)))
            //{
                //Console.WriteLine("   {0}", s);
            //}

            //Console.Write("Enter StopBits value (None is not supported and \n" +
             //"raises an ArgumentOutOfRangeException. \n (Default: {0}):", defaultPortStopBits.ToString());
            //stopBits = Console.ReadLine();

            if (stopBits == "")
            {
                stopBits = defaultPortStopBits.ToString();
            }

            return (StopBits)Enum.Parse(typeof(StopBits), stopBits, true);

        }
        public Handshake SetPortHandshake(Handshake defaultPortHandshake)
        {
            string handshake = "";

            //Console.WriteLine("Available Handshake options:");
            //foreach (string s in Enum.GetNames(typeof(Handshake)))
            //{
                //Console.WriteLine("   {0}", s);
            //}

            //Console.Write("End Handshake value (Default: {0}):", defaultPortHandshake.ToString());
            //handshake = Console.ReadLine();

            if (handshake == "")
            {
                handshake = defaultPortHandshake.ToString();
            }

            return (Handshake)Enum.Parse(typeof(Handshake), handshake, true);
        }

        public string nacteniSouboru(string cesta)
        {
            // The files used in this example are created in the topic
            // How to: Write to a Text File. You can change the path and
            // file name to substitute text files of your own.

            // Example #1
            // Read the file as one string.
            string text = System.IO.File.ReadAllText(cesta);

            // Display the file contents to the console. Variable text is a string.
            //zpravaTextBox.Text = text;
            //System.Console.WriteLine("Contents of WriteText.txt = {0}", text);

            // Example #2
            // Read each line of the file into a string array. Each element
            // of the array is one line of the file.
            //string[] lines = System.IO.File.ReadAllLines(@"C:\Users\Public\TestFolder\WriteLines2.txt");

            // Display the file contents by using a foreach loop.
            //System.Console.WriteLine("Contents of WriteLines2.txt = ");
            //foreach (string line in lines)
            //{
            // Use a tab to indent each line of the file.
            //    Console.WriteLine("\t" + line);
            //}

            // Keep the console window open in debug mode.
            //Console.WriteLine("Press any key to exit.");
            //System.Console.ReadKey();
            return text;
        }

        private void nacteniSouboruButton_Click(object sender, EventArgs e)
        {
            OpenFileDialog otevreniSouboru = new OpenFileDialog();
            otevreniSouboru.Filter = "Textové soubory (.txt)|*.txt";
            otevreniSouboru.FilterIndex = 1;
            otevreniSouboru.Multiselect = false;
            otevreniSouboru.ShowDialog();

            //            if (otevreniSouboru.ShowDialog() == DialogResult.OK)
            //            {
            //                string jmenoSouboru = otevreniSouboru.FileName;
            //                informaceSouboru = new System.IO.FileInfo(jmenoSouboru);
            //            }

            String textZeSouboru = File.ReadAllText(otevreniSouboru.FileName, Encoding.GetEncoding(65001));
            //String textZeSouboru = this.nacteniSouboru(otevreniSouboru.FileName);
            //byte[] bytes = Encoding.Default.GetBytes(textZeSouboru);
            //textZeSouboru = Encoding.UTF7.GetString(bytes);
            zpravaTextBox.Text = textZeSouboru;
        }

        private void ulozitSouborButton_Click(object sender, EventArgs e)
        {
            string textUlozeni = poleTextBox.Text;

            SaveFileDialog ulozeniSouboru = new SaveFileDialog();
            ulozeniSouboru.Filter = "Textové soubory (.txt) | *.txt";
            ulozeniSouboru.Title = "Ukládání souboru";
            ulozeniSouboru.ShowDialog();

            if (ulozeniSouboru.FileName != "")
            {
                System.IO.File.WriteAllText(ulozeniSouboru.FileName, textUlozeni);
            }

        }

        private void odeslatButton_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Return)
            {
                string message = zpravaTextBox.Text;
                _serialPort.WriteLine(String.Format("<{0}>: {1}", jmenoTextBox.Text, message));
            }
        }
    }
}
Nahlásit jako SPAM
IP: 85.207.47.–
25. 4. 2016   #2
-
+1
-
Zajímavé

Pomocí Terminal.exe nebo něčeho podobného se podívej, co tvůj program na COM posílá. Pokud ti komunikují mezi sebou dva programy v C#, ale s programem v Assembleru to nekomunikuje, zřejmě bude rozdíl mezi tím, co posíláš a tím co se očekává na příjmu. Předpokládám, že baudrate, paritu a stop bity máš na obou stranách stejně.

hu

Edit> Možná to má na svědomí kódování a metoda WriteLine - pokud vysíláš "multibyte characters" místo ASCII.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
888johny0
Duch
25. 4. 2016   #3
-
0
-

#2 hlucheucho

Ano potřebné nastavení na přenos mám stejné. Je možné že to bude chyba kódováním.   Děkuji.      


Nahlásit jako SPAM
IP: 85.207.47.–
Ovrscout
~ Anonymní uživatel
113 příspěvků
26. 4. 2016   #4
-
0
-

Z trochu jiného soudku:
Ten přístup k formuláři z druhého vlákna, není úplně nejzdravější. Mělo by to být třeba přes Invoke.
Také by mohlo být lepší místo ručně spuštěného vlákna skusit použít obsluhu události SerialPort.DataReceived

Nahlásit jako SPAM
IP: 193.165.79.–
VladislavK0
Super člen
26. 4. 2016   #5
-
0
-

Ahoj v jake fazi jsi??

Nebudu pročítat proběhlou komunikaci - ale někdo dříve vyslovil myšlenku "že je uplně jedno ským nebo čím komunikuješ"

napiš na na muj spam mail kral.vladislav@volny.cz:

Nahlásit jako SPAM
IP: 2a00:1028:83b4:28b6:146:e...–
Manželka programátora pošle svého muže koupit chleba s dovětkem kdyby měly housky přines jich deset! Co přinese programátor??
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý