как можно в net2005(C#) работать с rs232 получать и принимать данные, команды
"x3group" <50219@users.rsdn.ru> wrote in message
news:1889652@news.rsdn.ru...
> как можно в net2005(C#) работать с rs232 получать и принимать данные, команды
RS232 это не LPT порт.
Posted via RSDN NNTP Server 2.0
Это да он СОМ, но увидел я это только после того как отослал сообщение
Здравствуйте, wellwell, Вы писали:
W>"x3group" <50219@users.rsdn.ru> wrote in message news:1889652@news.rsdn.ru...
>> как можно в net2005(C#) работать с rs232 получать и принимать данные, команды
W>RS232 это не LPT порт.
X>как можно в net2005(C#) работать с rs232 получать и принимать данные, команды
Способов много.
Чтение данных с последовательного порта (1)
Для чтения данных с последовательного порта можно использовать ActiveX компонет MSComm.
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace MSCOMMTest
{
public class Form1 : System.Windows.Forms.Form
{
private AxMSCommLib.AxMSComm axMSComm1;
private System.Windows.Forms.ListBox lbLog;
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
private void InitializeComponent()
{
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
this.axMSComm1 = new AxMSCommLib.AxMSComm();
((System.ComponentModel.ISupportInitialize)
(this.axMSComm1)).BeginInit();
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
this.axMSComm1.Enabled = true;
this.axMSComm1.Location = new System.Drawing.Point(160, 72);
this.axMSComm1.Name = "axMSComm1";
this.axMSComm1.OcxState =
((System.Windows.Forms.AxHost.State)(
resources.GetObject("axMSComm1.OcxState")));
this.axMSComm1.Size = new System.Drawing.Size(38, 38);
this.axMSComm1.TabIndex = 0;
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
((System.ComponentModel.ISupportInitialize)
(this.axMSComm1)).EndInit();
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
void InitPort()
{
// Задаем номер порта
axMSComm1.CommPort = 1;
// Закрыть порт, если он открыт
if (axMSComm1.PortOpen) axMSComm1.PortOpen = false;
// Trigger the OnComm event whenever data is received
axMSComm1.RThreshold = 1;
// Настройка порта: 9600, no parity, 8 bits, 1 stop bit
axMSComm1.Settings = "9600,n,8,1";
// Режим приема данных - бинарный или текстовый
axMSComm1.InputMode =
MSCommLib.InputModeConstants.comInputModeBinary;
//axMSComm1.InputMode =
MSCommLib.InputModeConstants.comInputModeText;
// Режим ожидания данных
axMSComm1.InputLen = 0;
// Не игнорировать 0x00
axMSComm1.NullDiscard = false;
// Добавляем обработчик получения данных
axMSComm1.OnComm += new System.EventHandler(this.OnComm);
// Открываем порт
axMSComm1.PortOpen = true;
}
// Обработчик получения данных данных
private void OnComm(object sender, EventArgs e)
{
Application.DoEvents();
// Обрабока изменения состояния линии CTS
if (axMSComm1.CommEvent ==
(short)MSCommLib.OnCommConstants.comEvCTS)
{
Log("Изменение состояния линии CTS");
}
// Если есть данные в буфере
if (axMSComm1.InBufferCount > 0)
{
// Если включен режим comInputModeText
// мы получим строку
if (axMSComm1.Input is String)
{
string Input = (string) axMSComm1.Input;
Log(Input);
}
// Если включен режим comInputModeBinary мы получим
// System.Array
else
{
byte [] Input = (byte[])axMSComm1.Input;
foreach (byte b in Input)
{
Log(string.Format("{0}", b));
}
}
}
}
private void Log(string str)
{
lbLog.Items.Add(str);
lbLog.SelectedIndex = lbLog.Items.Count-1;
}
}
}
Чтение данных с последовательного порта (2)
Чтение данных можно реализовать с помощью импортированных функций Win32.
private void button1_Click(object sender, System.EventArgs e)
{
CommPort port = new CommPort(1, 9600, 8,
Parity.No, StopBits.Bits1);
if (port.Open())
{
byte[] data = port.Read(100);
foreach (byte b in data)
{
listBox1.Items.Add(string.Format("{0}", b));
}
port.Close();
}
}
using System;
using System.Runtime.InteropServices;
namespace ReadCDC
{
public enum Parity : byte
{
No = 0,
Odd = 1,
Even = 2,
Mark = 3,
Space = 4
}
public enum StopBits : byte
{
Bits1 = 0,
Bits1_5 = 1,
Bits2 = 2
}
class CommPort
{
private int PortNum;
private int BaudRate;
private byte ByteSize;
private Parity parity;
private StopBits stopBits;
private int hPortHanle = INVALID_HANDLE_VALUE;
public CommPort(int PortNum, int BaudRate, byte ByteSize,
Parity parity, StopBits stopBits)
{
this.PortNum = PortNum;
this.BaudRate = BaudRate;
this.ByteSize = ByteSize;
this.parity = parity;
this.stopBits = stopBits;
}
public bool Open()
{
// Открытие порта
hPortHanle = CreateFile("COM" + PortNum ,GENERIC_READ |
GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
if(hPortHanle == INVALID_HANDLE_VALUE)
{
return false;
}
// Настройка порта
DCB dcbCommPort = new DCB();
GetCommState(hPortHanle, ref dcbCommPort);
dcbCommPort.BaudRate = BaudRate;
dcbCommPort.Parity = (byte)parity;
dcbCommPort.ByteSize = ByteSize;
dcbCommPort.StopBits = (byte)stopBits;
if (!SetCommState(hPortHanle, ref dcbCommPort))
{
return false;
}
return true;
}
// Возврашает true, если порт открыт
public bool IsOpen()
{
return(hPortHanle!=INVALID_HANDLE_VALUE);
}
// Закрытие порта
public void Close()
{
if (IsOpen())
{
CloseHandle(hPortHanle);
}
}
// Чтение данных
public byte[] Read(int NumBytes)
{
byte[] BufBytes;
byte[] OutBytes;
BufBytes = new byte[NumBytes];
if (hPortHanle!=INVALID_HANDLE_VALUE)
{
int BytesRead=0;
ReadFile(hPortHanle, BufBytes, NumBytes, ref BytesRead, 0);
OutBytes = new byte[BytesRead];
Array.Copy(BufBytes, OutBytes, BytesRead);
}
else
{
throw(new ApplicationException("Порт не был открыт"));
}
return OutBytes;
}
// Передача данных
public void Write(byte[] WriteBytes)
{
if (hPortHanle!=INVALID_HANDLE_VALUE)
{
int BytesWritten = 0;
WriteFile(hPortHanle,WriteBytes,WriteBytes.Length,
ref BytesWritten, 0);
}
else
{
throw(new ApplicationException("Порт не был открыт"));
}
}
// Описание констант Win32 API
private const uint GENERIC_READ = 0x80000000;
private const uint GENERIC_WRITE = 0x40000000;
private const int OPEN_EXISTING = 3;
private const int INVALID_HANDLE_VALUE = -1;
[StructLayout(LayoutKind.Sequential)]
public struct DCB
{
public int DCBlength;
public int BaudRate;
/*
public int fBinary;
public int fParity;
public int fOutxCtsFlow;
public int fOutxDsrFlow;
public int fDtrControl;
public int fDsrSensitivity;
public int fTXContinueOnXoff;
public int fOutX;
public int fInX;
public int fErrorChar;
public int fNull;
public int fRtsControl;
public int fAbortOnError;
public int fDummy2;
*/
public uint flags;
public ushort wReserved;
public ushort XonLim;
public ushort XoffLim;
public byte ByteSize;
public byte Parity;
public byte StopBits;
public char XonChar;
public char XoffChar;
public char ErrorChar;
public char EofChar;
public char EvtChar;
public ushort wReserved1;
}
[DllImport("kernel32.dll")]
private static extern int CreateFile(
string lpFileName,
uint dwDesiredAccess,
int dwShareMode,
int lpSecurityAttributes,
int dwCreationDisposition,
int dwFlagsAndAttributes,
int hTemplateFile
);
[DllImport("kernel32.dll")]
private static extern bool GetCommState(
int hFile, // дескриптор файла (порта)
ref DCB lpDCB // структура DCB
);
[DllImport("kernel32.dll")]
private static extern bool SetCommState(
int hFile, // дескриптор файла (порта)
ref DCB lpDCB // структура DCB
);
[DllImport("kernel32.dll")]
private static extern bool ReadFile(
int hFile, // дескриптор файла (порта)
byte[] lpBuffer, // буфер
int nNumberOfBytesToRead, // размер буфера
ref int lpNumberOfBytesRead,// реально прочитано
int lpOverlapped // 0 для синхронных операций
);
[DllImport("kernel32.dll")]
private static extern bool WriteFile(
int hFile, // дескриптор файла (порта)
byte[] lpBuffer, // буфер данных
int nNumberOfBytesToWrite, // число байт данных
ref int lpNumberOfBytesWritten, // реально переданное
// число байт
int lpOverlapped // 0 для синхронных операций
);
[DllImport("kernel32.dll")]
private static extern bool CloseHandle(
int hObject // дескриптор файла (порта)
);
}
}
Чтение данных с последовательного порта (3)
В C# 2.0 (Visual Studio 2005) имеется специальный компонент System.IO.Ports.SerialPort. События DataReveived, ErrorReceived и PinChanged позволяют реализовать всю необходимую функциональность.