Code um mit dem .Net CompactFramework COM Port anzusteuern..
Hallo
Hier etwas Code, um Serialports zu verwenden.
Dieser Code liest vom Serialport (GPS) und ist Bestandteil eines Projektes von mir.
Code:
using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace interware.io.Serial
{
/// <summary>
/// Summary description for Receiver.
/// </summary>
///
public delegate void NMEADataReceivedHandler(string NMEAData);
public class Receiver : System.ComponentModel.Component
{
private string m_ComPort;
private int m_Baudrate;
private int handleSerialPort = -1;
private bool bCycle = false;
private static Receiver m_MySelf;
private System.Threading.Thread m_Worker;
public event NMEADataReceivedHandler NMEADataReceived;
public Receiver(string comport, int baudrate)
{
/// <summary>
/// Required for Windows.Forms Class Composition Designer support
/// </summary>
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
m_ComPort = comport;
m_Baudrate = baudrate;
}
# region Structures and Classes
//[StructLayout(LayoutKind.Sequential, Pack=1)] // for desktop uncomment this line
public class OVERLAPPED
{
public int Internal;
public int InternalHigh;
public int Offset;
public int OffsetHigh;
public int hEvent;
}
//[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct DCB
{
public int DCBlength;
public int BaudRate;
public int fBinary; ///* Binary Mode (skip EOF check)
public int fParity; // Enable parity checking
public int fOutxCtsFlow; // CTS handshaking on output
public int fOutxDsrFlow; // DSR handshaking on output
public int fDtrControl; // DTR Flow control
public int fDsrSensitivity; // DSR Sensitivity
public int fTXContinueOnXoff; //Continue TX when Xoff sent
public int fOutX; //Enable output X-ON/X-OFF
public int fInX; //Enable input X-ON/X-OFF
public int fErrorChar; //Enable Err Replacement
public int fNull; //Enable Null stripping
public int fRtsControl; //Rts Flow control
public int fAbortOnError; //Abort all reads and writes on Error
public int fDummy; //Reserved
public Int16 wReserved; //Not currently used
public Int16 XonLim; //Transmit X-ON threshold
public Int16 XoffLim; //Transmit X-OFF threshold
public byte ByteSize; //Number of bits/byte, 4-8
public byte Parity; //0-4=None,Odd,Even,Mark,Space
public byte StopBits; //0,1,2 = 1, 1.5, 2
public char XonChar; //Tx and Rx X-ON character
public char XoffChar; //Tx and Rx X-OFF character
public char ErrorChar; //Error replacement char
public char EofChar; //End of Input character
public char EvtChar; //Received Event character
public Int16 wReserved1; //Fill for now.
} // end DCB Struct
#endregion
#region DllImports
[DllImport("coredll.dll")]
private static extern int SetCommState(int hCommDev, ref DCB lpDCB);
[DllImport("coredll.dll")]
private static extern int GetCommState(int hCommDev, ref DCB lpDCB) ;
[DllImport("coredll.dll")]
static extern int ReadFile(int hFile, Byte[] Buffer, int nNumberOfBytesToRead, ref int lpNumberOfBytesRead, ref OVERLAPPED lpOverlapped ) ;
[DllImport("coredll.dll")]
static extern int CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile) ;
[DllImport("coredll.dll")]
static extern int CloseHandle(int hObject) ;
#endregion
public static void CreateReceiver(string comport, int baudrate)
{
m_MySelf = new Receiver(comport, baudrate);
}
public static Receiver Current
{
get
{
return m_MySelf;
}
}
public bool StartReceiving()
{
// Let's try to close the Port if we have a handle
CloseComm(ref handleSerialPort);
handleSerialPort = CreateFile(m_ComPort, unchecked((int)0x80000000) | 0x40000000, 0, 0, 3, 0, 0);
// if (handleSerialPort < 1)
// {
//// label1.Text = "Error: Unable to open port: " + port + " " + Convert.ToString(handleSerialPort);
// return false;
// }
if (handleSerialPort != -1)
{
DCB dcb = new DCB();
// Not needed for NETCF
//dcb.DCBlength = Marshal.SizeOf(dcb);
// Get existing Comm State
GetCommState (handleSerialPort, ref dcb); // Get the default port setting information.
// Change the DCB structure settings.
dcb.BaudRate = m_Baudrate; // Set to Baud rate defined in textbox
dcb.fBinary = 1; // Binary mode; no EOF check
dcb.fParity = 1; // Enable parity checking
dcb.fOutxCtsFlow = 0; // No CTS output flow control
dcb.fOutxDsrFlow = 0; // No DSR output flow control
dcb.fDtrControl = 1; // DTR_CONTROL_ENABLE = 1 // DTR flow control type
dcb.fDsrSensitivity = 0; // DSR sensitivity
dcb.fTXContinueOnXoff = 1; // XOFF continues Tx
dcb.fOutX = 0; // No XON/XOFF out flow control
dcb.fInX = 0; // No XON/XOFF in flow control
dcb.fErrorChar = 0; // Disable error replacement
dcb.fNull = 0; // Disable null stripping
dcb.fRtsControl = 1; // RTS_CONTROL_ENABLE = 1 // RTS flow control
dcb.fAbortOnError = 0; // Do not abort reads/writes on error
dcb.ByteSize = 8; // Number of bits/byte, 4-8
dcb.Parity = 0; // 0-4=no,odd,even,mark,space
dcb.StopBits = 0; // 0,1,2 = 1, 1.5, 2
// Attempt to set new Comm state
int result = SetCommState(handleSerialPort, ref dcb);
if (result != 0)
{
//dwError = GetLastError(); // Could not configure the serial port.
//label1.Text = "Error Setting State. Result: " + result.ToString();
return false;
}
else
{
//label1.Text = "was: " + oldbaud + " baud, setting to: " + newbaud.ToString() + " baud.";
m_Worker = new Thread(new ThreadStart(this.Receive));
m_Worker.Start();
return true;
}
}
else
//label1.Text = "Error: Comm Port not open";
return false;
// label1.Text = "opened " + port + Convert.ToString(handleSerialPort);
// return true;
}
public void EndReceiving()
{
CloseComm(ref handleSerialPort);
}
private void CloseComm(ref int hComm)
{
// stop reading loop
bCycle = false;
if (hComm != -1 )
{
int result = CloseHandle(hComm);
if (result < 1)
{
//label1.Text = "Error: Failed to close " + strPort;
}
else
{
//label1.Text = "Closed " + strPort + " Successfully";
hComm = -1;
}
}
} // end CloseComm
private void Receive()
{
int iRc = -1;
bCycle = true;
int BytesToRead = 40;
int BytesActuallyRead = 0;
byte[] Buffer;
if (handleSerialPort != -1)
{
// Loop and grab data from COM buffer and display in Label control
while (bCycle)
{
Buffer = new Byte[BytesToRead];
OVERLAPPED O = new OVERLAPPED();
iRc = ReadFile(handleSerialPort, Buffer, BytesToRead, ref BytesActuallyRead, ref O);
if (iRc < 1)
{
//label1.Text = "Error: Unable to read from " + port + " " + Convert.ToString(iRc);
}
else
{
//label1.Text = Encoding.GetEncoding("ASCII").GetString(Buffer,0,BytesToRead);
if(NMEADataReceived != null)
NMEADataReceived(Encoding.GetEncoding("ASCII").GetString(Buffer, 0,BytesToRead));
}
Application.DoEvents();
}
}
} // end btnReadFile_Click
#region Component 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()
{
}
#endregion
}
}
Wenn Du weitere Fragen hast, melde dich.
Gruss Roman Müller
AW: Serielle Kommunikation
Hallo zusammen!
Zuerst einmal ein dickes Kompliment: feine Seite und top Forum!
Ich bin neu in der Mobileprogrammierung und will Daten von meinem Sender über die serielle Schnittstelle (USB) in mein TytnII einlesen und anzeigen.
Dabei bin ich auf diesen Forumeintrag gestossen.
Danke für den Code, aber kann mir da jemand kurz Nachhilfe geben, wie ich diesen in meinem Programm einbinde und die Daten daraus anzeige?
Danke.
Tom
AW: Serielle Kommunikation
Nun, der Code ist für ein GPS-Projekt gemacht, den musst du wohl etwas modifizieren. Aber was genau sind deine anforderungen?
AW: Serielle Kommunikation
Hallo yjeanrenaud!
Ja, GPS ist wahrscheinlich ein bisschen weit gegriffen...
Ich verwende einen Barcodeleser um meine Produkte zu Scannen um sie dann bei mir auf dem Mobile in die Datenbank zu lesen. Das Programm steht schon fertig, ich muss lediglich noch den Leser über seriell (USB) anschliessen und die Daten einzulesen/zu verarbeiten.
Tom
AW: Serielle Kommunikation
Hi Tom
Kannst du den Leser über einen COM-Port ansteuern?
Dann wäre System.Net.Sockets das richtige für dich!
Inkl. asynchronem Reader!
Gruss
Sven
AW: Serielle Kommunikation
Hallo ersteinmal!
Bin auf der Suche nach serieller (RS232) Kommunikation auf eurer Forum gestossen.
Hab neu ein PDA gekauft und will diesen nun mit sinnvollen Programmen quälen ;-)
Ich will mir eine Anwendung schreiben, mit der ich Daten von Geräten mit serieller Schnittstelle (z.B. Luftmesser, Waage, Wetterstation) in meinen PDA/PocketPC lesen kann.
Ist dies mit dem normalen USBPort am PDA, über welcher auch das ActivSync geht, möglich, oder brauch ich da einen mit serieller Schnittstelle?
Dumdidum sprach von Net.Sockets. Könnt ihr mir da mit Codebsp's auf die Sprünge helfen oder gibt es eine coole Site, wo ich mich schlau machen kann?
... bin noch absoluter Newbie auf diesem Gebiet "Seriell".
Thanks folks!
Entwicklergrüsse, Terry
AW: Serielle Kommunikation
Also, wenn du die USB-Schnittstelle benutzen willst um serielle Geräte anzusprechen, geht das nur, wenn du einen USB-Host besitzt. Dann kannst du einen USB2Serial-Wandler benutzen.
Andernfalls brauchst du eine "echte" serielle Schnitstelle. Manche PocketPCs bieten diese über denselben Anschluss an, da müsstest du aber spezifisch für dein Gerät forschen. Es gibt auch CF-Karten die RS232 ermöglichen, oder aber du könntest, wohl einfacher am Luftmesser etc. einen Seriell-zu-Bluetooth-Modul installieren und dann dein Programm via Bluetoothschnitstelle auf die seriellen Daten zugreifen. Die Bluetoothverbindung wird dann einfach das Kabel ersetzen, selbst wenn dein PocketPC über keine "echte" RS232-Schnittstelle verfügt.
Informationen über System.Net.Sockets findest du bei MSDN.
AW: Serielle Kommunikation
danke yjeanrenaud!
seriell-bluetooth adapter sind jedoch relativ teuer :-(
wie funktioniert dann das mit dem usb-host genau? ich habe einen hp 114.
ich muss ja lediglich daten empfangen und keine senden. die daten werden vom gerät nach der messung losgeschickt und ich öffne auf dem pda den port und lese ein. in so etwa hab ich mir das vorgestellt!?
thx
AW: Serielle Kommunikation
Hmm, so weit ich weiss, hat der HP114 keinen USB-Host.
Leider wirst du wohl also einen Seriell-Bluetooth-Adapter benutzen müssen. Ja klar, du musst nur empfangen, aber ein serielles Protokoll schreibt meistens eine Bestätigungsantwort vor. Wie dem auch sei,
du könntest glück haben und HP hat neben USB auch serielle Verbindungen eingebaut (bei früheren Modellen gab es diese, siehe Pinouts.ru) du könntest also, mit dem entsprechenden Pinout oder einem Kabel vom Hersteller, einfach dieses verwenden statt der Bluetooth-Variante.
AW: Serielle Kommunikation
danke yjeanrenaud!
demfalls wechsle ich für diese applikation glaubs besser zu meinem "alten" hp hw6515 zurück... da hab ich auch ein serielles kabel. - hauptsache ich bekomme die daten irgendwie mobile :-)
jetzt aber nochmals zum serial reader:
net.sockets/system.io.ports/usw. ich habe viele bsp's und beschreibungen im internet gelesen, doch jede sagt etwas anderes und z.T. verkehrt wie die andere. ...bin ziemlich verwirrt, bzw. verunsichert :~?
hast du ev. noch ein bsp/tipp und/oder besser, eine site mit genauen und richtigen infos für mich?!
thx!
AW: Serielle Kommunikation
es kommt darauf an, was genau du brauchst. Was willst du auslesen? wie formatiert also was für ein Protokoll?
AW: Serielle Kommunikation
ich bekomme einen stringbuffer voll daten, der ich dann mit meinem programm auseinandernehme um die richtigen werte in den dazugehörigen gui-feldern zu präsentieren.
AW: Serielle Kommunikation
Ach so. Das sollte kein Problem darstellen. Am einfachsten wohl doch mit der System.IO.Ports
Der Beispielcode zeigt dir einen seriellen Terminal. Davon wirst du dann aber nur die Hälfte benötigen.
serielle Kommunikation mit Bluetooth-Slave
Danke euch für die Antworten. Leider aber werde ich trotzdem nicht ganz gescheit...
Ich habe eine Device (Bluetooth Slave) und muss imstande sein, von diesem Daten auszulesen.
D.h. ich muss auf die Device einen Write() und einen Read() Befehl absetzen.
Die Device ist gepairt auf Com5 für Eingänge und auf Com6 für Ausgänge.
Kann mir jemand auf die Sprünge helfen?
Ich komme bis zum Port.open - muss aber den doofen PIN des Device wieder eingeben (lässt sich das verhindern?) - und kann auch etwas hinausschreiben aber sobald ich den 2. Port zum Lesen öffnen will spukt er einen Fehler (Port unknown).
Danke für eure tolle Hilfe!
Rudis