Работа с последовательным портом. - C#
Формулировка задачи:
Коллеги...подскажите пожалуйста.Как из VS2005 в C#,работать споследовательным портом,если можно по-подробней.
Может у кого нить есть хорошее описание пространств имен System.IO.Ports ? а то никакой информации не нашел,желательно с примерами.
Проблема в общем вот какая, нужно написать программу на C# для работы с промышленным контроллером нашего
производства(модуль вода -вывода).Этот модуль работает в протоколе modbus rtu.Програма должна выполнять его первоначальную настройку.То есть подключаем его к COM порту компа,запускаем прогу и настраиваем...меняем уставки
вводим в ячейки памяти контроллера необходимые значения,а так же считываем с него информацию разного рода из его ячеек.Все это надо делать через последовательные порт,а как с ним работать в C#???
Решение задачи: «Работа с последовательным портом.»
textual
Листинг программы
using System; using System.Windows.Forms; using System.IO; using System.Data; using System.Runtime.InteropServices; public int Download(byte[] Buffer, int Length) { IntPtr hPort=(IntPtr)Win32Com.INVALID_HANDLE_VALUE; IntPtr ptrUWO = IntPtr.Zero; Win32Com.DCB PortDCB = new Win32Com.DCB(); Win32Com.COMMTIMEOUTS CommTimeouts = new Win32Com.COMMTIMEOUTS(); hPort = Win32Com.CreateFile("COM1:", Win32Com.GENERIC_READ | Win32Com.GENERIC_WRITE, 0, IntPtr.Zero, Win32Com.OPEN_EXISTING, 0, IntPtr.Zero); if (hPort == (IntPtr)Win32Com.INVALID_HANDLE_VALUE) { Put_Error("Error:COM1 port could not be opened!"); return -1; } else {//порт не занят Win32Com.GetCommState(hPort,ref PortDCB); //заполняем нужные поля PortDCB.BaudRate=38400;//скорость передачи PortDCB.ByteSize = 8;//размер бита PortDCB.Parity = 0;//no parity PortDCB.StopBits = 0; //1 stopbit if (!Win32Com.SetCommState(hPort, ref PortDCB)) { Put_Error("Error:COM1 port could not be opened!"); return -1; } uint sent = 0; if((!Win32Com.WriteFile(hPort,Buffer,(uint)Length,out sent,ptrUWO))||(Length!=(int)sent)) { Put_Error("Error:Can't write file into COM1 port!"); return -1; } //закрываем порт Win32Com.CancelIo(hPort); if (!Win32Com.CloseHandle(hPort)) { Put_Error("Warning:Can't close COM1 port!"); return -1; } } return 1; } } internal class Win32Com { /// <summary> /// Opening Testing and Closing the Port Handle. /// </summary> [DllImport("kernel32.dll", SetLastError=true)] internal static extern IntPtr CreateFile(String lpFileName, UInt32 dwDesiredAccess, UInt32 dwShareMode, IntPtr lpSecurityAttributes, UInt32 dwCreationDisposition, UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile); //Constants for errors: internal const UInt32 ERROR_FILE_NOT_FOUND = 2; internal const UInt32 ERROR_INVALID_NAME = 123; internal const UInt32 ERROR_ACCESS_DENIED = 5; internal const UInt32 ERROR_IO_PENDING = 997; //Constants for return value: internal const Int32 INVALID_HANDLE_VALUE = -1; //Constants for dwFlagsAndAttributes: internal const UInt32 FILE_FLAG_OVERLAPPED = 0x40000000; //Constants for dwCreationDisposition: internal const UInt32 OPEN_EXISTING = 3; //Constants for dwDesiredAccess: internal const UInt32 GENERIC_READ = 0x80000000; internal const UInt32 GENERIC_WRITE = 0x40000000; [DllImport("kernel32.dll")] internal static extern Boolean CloseHandle(IntPtr hObject); /// <summary> /// Manipulating the communications settings. /// </summary> [DllImport("kernel32.dll")] internal static extern Boolean GetCommState(IntPtr hFile, ref DCB lpDCB); [DllImport("kernel32.dll")] internal static extern Boolean GetCommTimeouts(IntPtr hFile, out COMMTIMEOUTS lpCommTimeouts); [DllImport("kernel32.dll")] internal static extern Boolean BuildCommDCBAndTimeouts(String lpDef, ref DCB lpDCB, ref COMMTIMEOUTS lpCommTimeouts); [DllImport("kernel32.dll")] internal static extern Boolean SetCommState(IntPtr hFile, [In] ref DCB lpDCB); [DllImport("kernel32.dll")] internal static extern Boolean SetCommTimeouts(IntPtr hFile, [In] ref COMMTIMEOUTS lpCommTimeouts); [DllImport("kernel32.dll")] internal static extern Boolean SetupComm(IntPtr hFile, UInt32 dwInQueue, UInt32 dwOutQueue); [StructLayout( LayoutKind.Sequential )] internal struct COMMTIMEOUTS { //JH1.1: Changed Int32 to UInt32 to allow setting to MAXDWORD internal UInt32 ReadIntervalTimeout; internal UInt32 ReadTotalTimeoutMultiplier; internal UInt32 ReadTotalTimeoutConstant; internal UInt32 WriteTotalTimeoutMultiplier; internal UInt32 WriteTotalTimeoutConstant; } //JH1.1: Added to enable use of "return immediately" timeout. internal const UInt32 MAXDWORD = 0xffffffff; [StructLayout( LayoutKind.Sequential )] internal struct DCB { internal Int32 DCBlength; internal Int32 BaudRate; internal Int32 PackedValues; internal Int16 wReserved; internal Int16 XonLim; internal Int16 XoffLim; internal Byte ByteSize; internal Byte Parity; internal Byte StopBits; internal Byte XonChar; internal Byte XoffChar; internal Byte ErrorChar; internal Byte EofChar; internal Byte EvtChar; internal Int16 wReserved1; internal void init(bool parity, bool outCTS, bool outDSR, int dtr, bool inDSR, bool txc, bool xOut, bool xIn, int rts) { DCBlength = 28; PackedValues = 0x8001; if (parity) PackedValues |= 0x0002; if (outCTS) PackedValues |= 0x0004; if (outDSR) PackedValues |= 0x0008; PackedValues |= ((dtr & 0x0003) << 4); if (inDSR) PackedValues |= 0x0040; if (txc) PackedValues |= 0x0080; if (xOut) PackedValues |= 0x0100; if (xIn) PackedValues |= 0x0200; PackedValues |= ((rts & 0x0003) << 12); } } /// <summary> /// Reading and writing. /// </summary> [DllImport("kernel32.dll", SetLastError=true)] internal static extern Boolean WriteFile(IntPtr fFile, Byte[] lpBuffer, UInt32 nNumberOfBytesToWrite, out UInt32 lpNumberOfBytesWritten, IntPtr lpOverlapped); [StructLayout( LayoutKind.Sequential )] internal struct OVERLAPPED { internal UIntPtr Internal; internal UIntPtr InternalHigh; internal UInt32 Offset; internal UInt32 OffsetHigh; internal IntPtr hEvent; } [DllImport("kernel32.dll")] internal static extern Boolean SetCommMask(IntPtr hFile, UInt32 dwEvtMask); // Constants for dwEvtMask: internal const UInt32 EV_RXCHAR = 0x0001; internal const UInt32 EV_RXFLAG = 0x0002; internal const UInt32 EV_TXEMPTY = 0x0004; internal const UInt32 EV_CTS = 0x0008; internal const UInt32 EV_DSR = 0x0010; internal const UInt32 EV_RLSD = 0x0020; internal const UInt32 EV_BREAK = 0x0040; internal const UInt32 EV_ERR = 0x0080; internal const UInt32 EV_RING = 0x0100; internal const UInt32 EV_PERR = 0x0200; internal const UInt32 EV_RX80FULL = 0x0400; internal const UInt32 EV_EVENT1 = 0x0800; internal const UInt32 EV_EVENT2 = 0x1000; [DllImport("kernel32.dll", SetLastError=true)] internal static extern Boolean WaitCommEvent(IntPtr hFile, IntPtr lpEvtMask, IntPtr lpOverlapped); [DllImport("kernel32.dll")] internal static extern Boolean CancelIo(IntPtr hFile); [DllImport("kernel32.dll", SetLastError=true)] internal static extern Boolean ReadFile(IntPtr hFile, [Out] Byte[] lpBuffer, UInt32 nNumberOfBytesToRead, out UInt32 nNumberOfBytesRead, IntPtr lpOverlapped); [DllImport("kernel32.dll")] internal static extern Boolean TransmitCommChar(IntPtr hFile, Byte cChar); /// <summary> /// Control port functions. /// </summary> [DllImport("kernel32.dll")] internal static extern Boolean EscapeCommFunction(IntPtr hFile, UInt32 dwFunc); // Constants for dwFunc: internal const UInt32 SETXOFF = 1; internal const UInt32 SETXON = 2; internal const UInt32 SETRTS = 3; internal const UInt32 CLRRTS = 4; internal const UInt32 SETDTR = 5; internal const UInt32 CLRDTR = 6; internal const UInt32 RESETDEV = 7; internal const UInt32 SETBREAK = 8; internal const UInt32 CLRBREAK = 9; [DllImport("kernel32.dll")] internal static extern Boolean GetCommModemStatus(IntPtr hFile, out UInt32 lpModemStat); // Constants for lpModemStat: internal const UInt32 MS_CTS_ON = 0x0010; internal const UInt32 MS_DSR_ON = 0x0020; internal const UInt32 MS_RING_ON = 0x0040; internal const UInt32 MS_RLSD_ON = 0x0080; /// <summary> /// Status Functions. /// </summary> [DllImport("kernel32.dll", SetLastError=true)] internal static extern Boolean GetOverlappedResult(IntPtr hFile, IntPtr lpOverlapped, out UInt32 nNumberOfBytesTransferred, Boolean bWait); [DllImport("kernel32.dll")] internal static extern Boolean ClearCommError(IntPtr hFile, out UInt32 lpErrors, IntPtr lpStat); [DllImport("kernel32.dll")] internal static extern Boolean ClearCommError(IntPtr hFile, out UInt32 lpErrors, out COMSTAT cs); //Constants for lpErrors: internal const UInt32 CE_RXOVER = 0x0001; internal const UInt32 CE_OVERRUN = 0x0002; internal const UInt32 CE_RXPARITY = 0x0004; internal const UInt32 CE_FRAME = 0x0008; internal const UInt32 CE_BREAK = 0x0010; internal const UInt32 CE_TXFULL = 0x0100; internal const UInt32 CE_PTO = 0x0200; internal const UInt32 CE_IOE = 0x0400; internal const UInt32 CE_DNS = 0x0800; internal const UInt32 CE_OOP = 0x1000; internal const UInt32 CE_MODE = 0x8000; [StructLayout( LayoutKind.Sequential )] internal struct COMSTAT { internal const uint fCtsHold = 0x1; internal const uint fDsrHold = 0x2; internal const uint fRlsdHold = 0x4; internal const uint fXoffHold = 0x8; internal const uint fXoffSent = 0x10; internal const uint fEof = 0x20; internal const uint fTxim = 0x40; internal UInt32 Flags; internal UInt32 cbInQue; internal UInt32 cbOutQue; } [DllImport("kernel32.dll")] internal static extern Boolean GetCommProperties(IntPtr hFile, out COMMPROP cp); [StructLayout( LayoutKind.Sequential )] internal struct COMMPROP { internal UInt16 wPacketLength; internal UInt16 wPacketVersion; internal UInt32 dwServiceMask; internal UInt32 dwReserved1; internal UInt32 dwMaxTxQueue; internal UInt32 dwMaxRxQueue; internal UInt32 dwMaxBaud; internal UInt32 dwProvSubType; internal UInt32 dwProvCapabilities; internal UInt32 dwSettableParams; internal UInt32 dwSettableBaud; internal UInt16 wSettableData; internal UInt16 wSettableStopParity; internal UInt32 dwCurrentTxQueue; internal UInt32 dwCurrentRxQueue; internal UInt32 dwProvSpec1; internal UInt32 dwProvSpec2; internal Byte wcProvChar; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д