Как работать с RS-232(LPT порт)
От: x3group  
Дата: 10.05.06 06:42
Оценка:
как можно в net2005(C#) работать с rs232 получать и принимать данные, команды
Re: Как работать с RS-232(LPT порт)
От: wellwell Австралия https://www.softperfect.com
Дата: 10.05.06 09:22
Оценка:
"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
Re[2]: Как работать с RS-232(LPT порт)
От: Аноним  
Дата: 10.05.06 10:17
Оценка:
Это да он СОМ, но увидел я это только после того как отослал сообщение

Здравствуйте, wellwell, Вы писали:

W>"x3group" <50219@users.rsdn.ru> wrote in message news:1889652@news.rsdn.ru...

>> как можно в net2005(C#) работать с rs232 получать и принимать данные, команды

W>RS232 это не LPT порт.
Re: Как работать с RS-232(LPT порт)
От: Pavel_Agurov Россия  
Дата: 13.05.06 14:02
Оценка: 3 (1)
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 позволяют реализовать всю необходимую функциональность.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.