Komunikacja z urządzeniem przez RS232/COM

Odpowiedz Nowy wątek
2018-03-14 01:05
0

Próbuje skomunikować się z urządzeniem zgodnie z protokołem transmisji z załącznika. Mój kod programu wygląda następująco:

class SerialPortProgram
    {
        //// Create the serial port with basic settings
        //private SerialPort port = new SerialPort("COM1",
        //  9600, Parity.None, 8, StopBits.One);

        static string portName = "COM4";
        static int baudRate = 115200; //szybkość transmisji
        static Parity parityBits = Parity.Even; //1 bit parzystej parzystości
        static int dataBits = 8; //ilość bitów danych
        static StopBits stopBits = StopBits.One; //ilość bitów stopu

        private SerialPort port = new SerialPort(portName, baudRate, parityBits, dataBits, stopBits);

        [STAThread]
        static void Main(string[] args)
        {
            // Instatiate this class
            new SerialPortProgram();
        }

        private SerialPortProgram()
        {
            // Begin communications
            port.Open();

            // Attach a method to be called when there is data waiting in the port's buffer
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

            port.RtsEnable = true; // Data-terminal-ready
            port.DtrEnable = true; // Request-to-send
            port.Encoding = Encoding.ASCII;

            //port.ReceivedBytesThreshold = 9;
            //port.PinChanged

            byte[] bytes = System.Text.Encoding.ASCII.GetBytes("<SOH>#0#0#0#<ETX>");
            //byte[] bytes = System.Text.Encoding.ASCII.GetBytes("#0#0#0#");

            port.Write(bytes, 0, bytes.Length);

            Console.WriteLine("Incoming Data:");

            Console.WriteLine(port.ReadLine());

            // Enter an application loop to keep this thread alive

            //Application.DoEvents();
            Application.Run();
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Console.WriteLine("siema");
            // Show all the incoming data in the port's buffer
            Console.WriteLine(port.ReadExisting());
        }
    }

Niestety od urządzenia nie dostaje żadnej odpowiedzi, tzn nie zostaje wywołane zdarzenie 'port_DataReceived'

Do urządzenia był dołączony prosty program za pomocą którego można odczytywać dane przesyłane z czujnika urządzenia do komputera. Zainstalowałem WireShark i porównałem wysyłane zapytania do urządzenia. Jak widać na screenie różnią się one od siebie i pewnie dlatego nie dostaje poprawnej odpowiedzi. Macie jakieś pomysły gdzie zrobiłem błąd?
Okna po lewej stronie to poprawnie wysłane zapytanie przez program producenta, okna po prawej stronie to zapytania wysłane przez mój program.Zapytania wysłane w sposób:

byte[] bytes = System.Text.Encoding.ASCII.GetBytes("<SOH>#0#0#0#<ETX>");
oraz
byte[] bytes = System.Text.Encoding.ASCII.GetBytes("#0#0#0#");

edytowany 3x, ostatnio: RideorDie, 2018-03-14 01:11

Pozostało 580 znaków

2018-03-14 08:47
1

Na pewno trzeba wyrzucić sterowanie transmisja rts dtr.

Pozostało 580 znaków

2018-03-14 11:18
0

Wyrzuciłem, teraz zapytanie wygląda jak na zalaczniku.
PacketDataLength jest różne może to przez to

Pozostało 580 znaków

2018-03-14 18:04

http://www.robelle.com/smugbook/ascii.html
Tu masz link. S0H => 0x01, a ten drugi ETX to 0x03

Więc wysyłane dane muszą wyglądać coś w ten deseń

Encoding.ASCII.GetBytes("\u0001#0#0#0#\u0003");

Nie wiem czy jest jakaś klasa, która zawiera te znaczniki, a jak nie ma to żeby było bardziej przejrzyście i żebyś się tam nie machnął to możesz sobie utworzyć dla każdego potrzebnego znacznika zmienną np.

string soh = "\u0001" 

albo

char soh = (char)0x01

i potem piszesz takiego stringa dla metody GetBytes:

$"{soh}#0#0#0#{etx}"

W sumie to lepiej stałą a nie zmienną bo wartość ta się nie zmienia.

edytowany 2x, ostatnio: Manuel.Artificer, 2018-03-14 18:19

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0