Gå til innhold

Anbefalte innlegg

Hei

 

Jeg skal lage et program som skal innhente informasjon fra en mikrokontroller, via RS232, til en OPC-server.

Så skal det hentes informasjon fra OPC-serveren og sende den til mikrokontrolleren.

 

Mikrokontrolleren må programmeres i C, men jeg lurer på å lage "mellomleddet" i C#.

Problemet mitt er bare at jeg har liten erfaring med hvordan man skriver til serieporten og OPC serveren i C#.

Har laget noen liknende program før, men da ved hjelp av borland delphi 3 (er vel pascal), men dette syntes jeg var et forferdelig rotete språk.

 

Kikket på en del kilde på nett, men de meste skriver til buffere, noe jeg ikke vil ha.

Jeg tenkte å sende fra mikrokontrolleren hvert 100ms, og lese serieporten på pc'n hvert 50'ende.

Planen var å sende en string som inneholder alle variabler som skal sendes vidre til OPC-serveren, og hente ut de forskjellige og putte de i forskjellige poster i servern. Er kun snakk om 5-6 variabler, på maks 5 siffer.

 

Det jeg er ute etter er letteste måte og sende en string over RS232, og letteste måte og lese serieporten på.

 

Noen tips?

Lenke til kommentar
Videoannonse
Annonse

For å lese/skrive fra serieporten bruker du System.IO.Ports.SerialPort klassen.

For å skrive en linje med tekst, bruker du enkelt nok WriteLine, eller Write funksjonen Det står ikke i dokumentasjonen hva slags encoding den sender i, og i tillegg legger den til Environment.NewLine som er "\r\n" på Windows og "\n" på Linux som kan ansees som uheldig.

 

For å skrive en ASCII string uten newline eller carriage return til serieport COM1 gjør du slik:

 

SerialPort com1 = new SerialPort("COM1");

byte[] bytes = Encoding.ASCII.GetBytes("Hello World!");
com1.Write(bytes, 0, bytes.Length);

Lenke til kommentar

Det skal være i Windows.

Men jeg må vel angi baudrate, paritetsbit, stoppbit, og slikt?

 

Jeg skal kun sende tallverdier.

 

byte[] bytes = Encoding.ASCII.GetBytes("Hello World!");
com1.Write(bytes, 0, bytes.Length);

 

Vil det fungere med kun

com1.Write(var1, 0, bytes.Length);

 

Hvor var1 er en string?

Lenke til kommentar

Fant et fint eksempel på skriving til serieporten

// This is a new namespace in .NET 2.0
// that contains the SerialPort class using System.IO.Ports; 
private static void SendSampleData() 
{ 

// Instantiate the communications
// port with some basic settings 
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);

// Open the port for communications 
port.Open(); 

// Write a string 
port.Write("Hello World"); 

// Write a set of bytes 
port.Write(new byte[] {0x0A, 0xE2, 0xFF}, 0, 3); 

// Close the port 
port.Close(); 
}

 

Men er det noe poeng i å lukke porten så lenge programmet går?

Lenke til kommentar

Poenget var vel mer at det varierer om det er \r\n eller \n

Så hvis programmet kjører på Mono så vil det plutselig gi mokrokontrolleren-en annen data avhengig av operativsystem.

 

Men jeg må vel angi baudrate, paritetsbit, stoppbit, og slikt?

Baudrate og slikt gir du i constructoren til SerialPort.

 

For å skrive andre verdier, kan det være en fordel å bruke BinaryWriter. Med denne kan du skrive int-er eller lignende.

Lenke til kommentar

Hm..

Seriekommunikasjon var vist ikke så vanskelig.

 

Snakke med en OPC server derimot virker litt tuklete.

Det er veldig lite dokumentasjon om OPC med C# på nett.

 

Noen som har noe erfaring med dette?

 

Det er i utgangspunktet en slags COM serve, og jeg ser ikke helt hvordan jeg får snakket med den i C# :mellow:

Lenke til kommentar

Aha, forstår :)

Må si jeg stemmer for at windows har den riktige metoden med tanke på hvordan gamle skrivemaskiner faktisk fungerer...

 

Har man kun en \n (Ny linje), er man jo fortsatt på slutten av arket. (Siden carriagen fortsatt er på høyre siden av arket)

Har man båre \r og \n går først carriagen tilbake til venstre siden av arket, også får man en ny linje. :)

Endret av Wubbable
Lenke til kommentar

Vel ISO-standarden krevde kun en line feed karakter for newline, mens ANSI standarden krevde carriage return og newline.

 

MS-DOS, built upon a CP/M clone called 86-DOS (which Microsoft purchased and renamed), adopted CP/M's CR+LF; CP/M's use of CR+LF made sense for using computer terminals via serial lines. This convention was inherited by Microsoft's later Windows operating system.

 

Dette har ikke vært nødvendig på mange, mange år, siden vi nå bruker printer drivere for å skrive ut dokumenter... og det har vi gjort i over 20 år nå.

I DOS skrev en ut dokumenter slik:

type doc1.txt | COM1

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...