Avatar billede koppelgaard Praktikant
06. september 2007 - 13:33 Der er 9 kommentarer og
1 løsning

Hente data fra tryktransducer

Hej kære eksperter

Jeg forsøger at hente data fra en tryktransducer, med følgende specifikationer:
Baud Rate .... 9600
Start Bits .... 1
Data Bits .... 8
Stop Bits .... 1
Parity .... None
Og for at få måleresultat:
*00P1 <cr> Response: ?01CP=15.458 (for RS-232)

Er der en der har en stump kode ?

Jeg har prøvet følgende fra msdn2 men er i tvivl, hvorvidt jeg taster rigtigt  ved

_serialPort.WriteLine(
  String.Format("<{0}>: {1}", name, message));

Her taster jeg :

Alt 42
Alt 48
Alt 48
Alt 80
Alt 49
Alt 13


using System;
using System.IO.Ports;
using System.Threading;

public class PortChat
{
    static bool _continue;
    static SerialPort _serialPort;

    public static void Main()
    {
        string name;
        string message;
        StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
        Thread readThread = new Thread(Read);

        // Create a new SerialPort object with default settings.
        _serialPort = new SerialPort();

        // Allow the user to set the appropriate properties.
        _serialPort.PortName = SetPortName(_serialPort.PortName);
        _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
        _serialPort.Parity = SetPortParity(_serialPort.Parity);
        _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
        _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
        _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);

        // Set the read/write timeouts
        _serialPort.ReadTimeout = 5000;
        _serialPort.WriteTimeout = 5000;

        _serialPort.Open();
        _continue = true;
        readThread.Start();

        Console.Write("Name: ");
        name = Console.ReadLine();

        Console.WriteLine("Type QUIT to exit");

        while (_continue)
        {
            message = Console.ReadLine();

            if (stringComparer.Equals("quit", message))
            {
                _continue = false;
            }
            else
            {
                _serialPort.WriteLine(
                    String.Format("<{0}>: {1}", name, message));
            }
        }

        readThread.Join();
        _serialPort.Close();
    }

    public static void Read()
    {
        while (_continue)
        {
            try
            {
                string message = _serialPort.ReadLine();
                Console.WriteLine("Output: "+message);
            }
            catch (TimeoutException) { }
        }
    }

    public static string SetPortName(string defaultPortName)
    {
        string portName;

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

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

        if (portName == "")
        {
            portName = defaultPortName;
        }
        return portName;
    }

    public static int SetPortBaudRate(int defaultPortBaudRate)
    {
        string baudRate;

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

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

        return int.Parse(baudRate);
    }

    public static Parity SetPortParity(Parity defaultPortParity)
    {
        string parity;

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

        Console.Write("Parity({0}):", defaultPortParity.ToString());
        parity = Console.ReadLine();

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

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

    public static int SetPortDataBits(int defaultPortDataBits)
    {
        string dataBits;

        Console.Write("Data Bits({0}): ", defaultPortDataBits);
        dataBits = Console.ReadLine();

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

        return int.Parse(dataBits);
    }

    public static StopBits SetPortStopBits(StopBits defaultPortStopBits)
    {
        string stopBits;

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

        Console.Write("Stop Bits({0}):", defaultPortStopBits.ToString());
        stopBits = Console.ReadLine();

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

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

    public static 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("Stop Bits({0}):", defaultPortHandshake.ToString());
        handshake = Console.ReadLine();

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

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

Michael
Avatar billede bitmatic Nybegynder
07. september 2007 - 00:39 #1
To løse forslag her 1 time efter jeg egentlig burde ligge og sove.

Når du læser "message" med Cosole.ReadLine. Er du så sikker på at <cr> ikke bliver smidt væk ? Og er du sikker på at serialPort.WriteLine sætter et <cr> i enden af det skrevne ?
Prøv evt. at bruge Read og Write i stedet, og så selv styre hvor <cr> skal puttes/hentes

Er du sikker på at strengen bliver ASCII-encodet når du formaterer og skriver til porten med _serialPort.WriteLine(String.Format("<{0}>: {1}", name, message));
Prøv at oprette en temporær string-variabel der indeholder resultatet af String.Format("<{0}>: {1}", name, message) og se om det ser fornuftigt ud i et råt memory view.

/Jakob
Avatar billede md_craig Nybegynder
07. september 2007 - 20:43 #2
kig lidt på

port.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler( port_DataReceived );

der kan du evt' starte med at se om du nogen sinde får rejst det event... hvis ikke så får du ganske enkelt ikke data retur ind på porten...

(Med den kan du evt. også slippe af med en grim tråd der står og pulser hele tiden... (høj CPU load))
Avatar billede koppelgaard Praktikant
09. september 2007 - 11:31 #3
1000 tak for jeres svar.
Jeg har været på weekend og har først set dem nu.


Jeg har prøvet i nedenstående kode prøvet at indsætte event'en.

For at  mere sikker på at sende det rigtige har jeg skrevet stengen ind i en tekstboks. Jeg skriver altså i tekstboksen *00P1 og får ?00P??0 retur

Hvorvidt jeg for <cr> sendes automatisk med ved writeLine ved jeg ikke, men jeg har også prøvet at tilføje dem efter stengen som det ses :            serialPort1.WriteLine(textBox2.Text+(char)13);
Hverken            serialPort1.WriteLine(textBox2.Text+(char)13);
eller            serialPort1.WriteLine(textBox2.text);
giver det rigtige svar.


Svaret skulle være ala : ?01CP=15.458, hvis trykket er 15.458. Så jeg må vel sende det forkerte??
DET SKAL NÆVNES AT JEG SAGTES KAN MODTAGE DATA FRA VBA (EXCEL).

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;          // Denne linie skal tilføjes !!!!!!

namespace SerialTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();


            //  Dette er den hurtige løsning for at lave en hurtig test MEN
            //  den kan gøre programmet ustabilt!!!!! 
            CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
                      /* Initialiser com port */
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
           
            serialPort1.PortName = "COM1";
            serialPort1.NewLine = "\n";           
            serialPort1.DataBits = 8;
            serialPort1.Handshake = Handshake.None;
            serialPort1.Parity = Parity.Odd;
            serialPort1.BaudRate = 9600;
            serialPort1.ReadTimeout = 4000;
            serialPort1.ReadBufferSize = 4000;
            serialPort1.RtsEnable = true;           
            serialPort1.Open();
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string Modtaget;
            Modtaget = serialPort1.ReadExisting();
            textBox1.Text += Modtaget;
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            serialPort1.Close();
        }

        private void BtmLuk_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            this.Close();
        }

        private void BtmSend_Click(object sender, EventArgs e)
        {
            serialPort1.WriteLine(textBox2.Text+(char)13);
        }

   
    }
}

Har I nogen bud
Avatar billede koppelgaard Praktikant
09. september 2007 - 11:35 #4
PPT manualen ligger i øvrigt her.
Og jeg giver 100 ekstra (ialt 200) for at hjælpende tip der kan give mig rigtige data.

http://www.ssec.honeywell.com/pressure/datasheets/ppt&pptrmanual.pdf

Michael
Avatar billede koppelgaard Praktikant
09. september 2007 - 11:43 #5
Og forresten har jeg prøvet at se på strenge som bliver læst fra teksboksen. I koden står den som *00P1 hvilket vel er det korrekte ?
Avatar billede md_craig Nybegynder
09. september 2007 - 20:06 #6
Lige et par ting...

Du sætter Parity til odd?... skulle den ikke være None?...
Sæt desuden StopBits samt StartBits for at være sikker på de står korrekt...

Istedet for at bruge WriteLine prøv med Write istedet...

Send: serialPort1.Write("*00P1 \r");
Avatar billede koppelgaard Praktikant
09. september 2007 - 21:52 #7
Bingo du har ret! Pariteten skulle være none og det gave pote !!!
Nu for jeg følgende svar : ?01CP!-0.1548.
Svaret skulle være ?01CP=0.1548. Lighedstegn er åbentbart blivet til !-.

Men ellers virker det! Tænk jeg synes også jeg havde prøvet none.

Startbit kan jeg dog ikke finde nogen property for. Hvor sættes den ?
Og ved du hvad serialPort1.RtsEnable sættes for ?

Send et svar og du får point!
Jeg lovede 200 ialt  så jeg sender lige et spørgsmål til.

Michael

Den færdige kode er her:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;          // Denne linie skal tilføjes !!!!!!

namespace SerialTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();


            //  Dette er den hurtige løsning for at lave en hurtig test MEN
            //  den kan gøre programmet ustabilt!!!!! 
            CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
                      /* Initialiser com port */
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
            }
           
            serialPort1.PortName = "COM1";
            serialPort1.NewLine = "\n";           
            serialPort1.DataBits = 8;
            serialPort1.StopBits = StopBits.One;
           

            serialPort1.Handshake = Handshake.None;
            serialPort1.Parity = Parity.None;
            serialPort1.BaudRate = 9600;
            serialPort1.ReadTimeout = 4000;
            serialPort1.ReadBufferSize = 4000;
            serialPort1.RtsEnable = true;           
            serialPort1.Open();
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string Modtaget;
            Modtaget = serialPort1.ReadExisting();
            textBox1.Text += Modtaget;
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            serialPort1.Close();
        }

        private void BtmLuk_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            this.Close();
        }

        private void BtmSend_Click(object sender, EventArgs e)
        {
            //serialPort1.Write("*00P1 \r"); dette virker         
            serialPort1.WriteLine("*00P1 \r"); // men det gør dette også, her kommer bare et linieskift efter svaret.

         
        }
           
    }
}
Avatar billede md_craig Nybegynder
10. september 2007 - 04:52 #8
Nej det kan jeg godt se, er lige lidt siden jeg arbejdede med Com Porte så kunne ikke huske alle de ting man lige umiddlebart havde adgang til...

RtsEnable er om RTS er sat til eller ej... RTS = Request To Send...
Kigger lige på resten senere skal på arbejde nu...
Avatar billede nielle Nybegynder
10. september 2007 - 08:49 #9
md_craig> Se også http://www.eksperten.dk/spm/795545

koppelgaard> Husk at lave en reference imellem hvert af de to spørgsmål. Forresten er det ikke nødvendigt at oprette et nyt spørgsmål med point hvis det gamle ikke er afsluttet; du kan tildele flere point under menupunktet Funktioner oppe i toppen ude i venstre side. :^)
Avatar billede koppelgaard Praktikant
10. september 2007 - 14:53 #10
Tak for tippet nielle
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB