问题描述
考虑:
Baud rate 19200
RTS on
DTR on
Data bits=8, Stop bits=1, Parity=None
Set chars: Eof=0x00, Error=0x2A, Break=0x2A, Event=0x00, Xon=0x11, Xoff=0x13
Handflow: ControlHandShake=(DTR_CONTROL), FlowReplace=(TRANSMIT_TOGGLE, RTS_CONTROL),
XonLimit=0, XoffLimit=4096
确定,因此使用端口扫描器我发现,一个USB设备需要这些设置,以方便导入。我可以重新创建其中的大部分如下:
OK, so using a port scanner I've found that a USB device needs these settings to facilitate an import. I can recreate most of these as follows:
port = new SerialPort("COM4");
port.DtrEnable = true;
port.RtsEnable = true;
port.Handshake = Handshake.None;
port.BaudRate = 19200;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.DataBits = 8;
port.Open();
byte[] a = new byte[2] { 0x0 , 0x1 };
port.Write(a, 0, 1);
port.Write(a, 0, 1);
port.Write("mem");
port.Write("mem");
string output = port.ReadExisting();
System.Diagnostics.Debug.WriteLine("Found: " + output);
不过,所产生的代码是这些:
However, the codes produced are these:
Set chars: Eof=0x1A, Error=0x00, Break=0x00, Event=0x1A, Xon=0x11, Xoff=0x13
XonLimit=1024, XoffLimit=1024
我要如何改变X的限制,每个字符代码,使这有工作的机会吗?
How do I change the X limits, and each of the character codes so that this has a chance of working?
该职位的的 的是到目前为止,我已经找到了最接近的事情,但我不明白。
The post SerialPort 0x1A character reading problem is the closest thing I've found so far, but I don't understand it.
推荐答案
您可以扩展在C#中添加到的SerialPort - 看的的 的
You can add an extension to the serialPort in C# - see Xon/Xoff values in NET2.0 SerialPort class.
有关其他字段,您可以更改:
For the other fields you can change:
dcbType.GetField("XonChar"); // "XonChar", "XoffChar", "ErrorChar", "EofChar", "EvtChar"
代码:
Code:
using System;
using System.ComponentModel;
using System.IO.Ports;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Security;
using System.Security.Permissions;
using Microsoft.Win32.SafeHandles;
class Program
{
static void Main(string[] args)
{
using (var port = new SerialPort("COM1"))
{
port.Open();
port.SetXonXoffChars(0x12, 0x14);
}
}
}
internal static class SerialPortExtensions
{
[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
public static void SetXonXoffChars(this SerialPort port, byte xon, byte xoff)
{
if (port == null)
throw new NullReferenceException();
if (port.BaseStream == null)
throw new InvalidOperationException("Cannot change X chars until after the port has been opened.");
try
{
// Get the base stream and its type which is System.IO.Ports.SerialStream
object baseStream = port.BaseStream;
Type baseStreamType = baseStream.GetType();
// Get the Win32 file handle for the port
SafeFileHandle portFileHandle = (SafeFileHandle)baseStreamType.GetField("_handle", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(baseStream);
// Get the value of the private DCB field (a value type)
FieldInfo dcbFieldInfo = baseStreamType.GetField("dcb", BindingFlags.NonPublic | BindingFlags.Instance);
object dcbValue = dcbFieldInfo.GetValue(baseStream);
// The type of dcb is Microsoft.Win32.UnsafeNativeMethods.DCB which is an internal type. We can only access it through reflection.
Type dcbType = dcbValue.GetType();
dcbType.GetField("XonChar").SetValue(dcbValue, xon);
dcbType.GetField("XoffChar").SetValue(dcbValue, xoff);
// We need to call SetCommState but because dcbValue is a private type, we don't have enough
// information to create a p/Invoke declaration for it. We have to do the marshalling manually.
// Create unmanaged memory to copy DCB into
IntPtr hGlobal = Marshal.AllocHGlobal(Marshal.SizeOf(dcbValue));
try
{
// Copy their DCB value to unmanaged memory
Marshal.StructureToPtr(dcbValue, hGlobal, false);
// Call SetCommState
if (!SetCommState(portFileHandle, hGlobal))
throw new Win32Exception(Marshal.GetLastWin32Error());
// Update the BaseStream.dcb field if SetCommState succeeded
dcbFieldInfo.SetValue(baseStream, dcbValue);
}
finally
{
if (hGlobal != IntPtr.Zero)
Marshal.FreeHGlobal(hGlobal);
}
}
catch (SecurityException) { throw; }
catch (OutOfMemoryException) { throw; }
catch (Win32Exception) { throw; }
catch (Exception ex)
{
throw new ApplicationException("SetXonXoffChars has failed due to incorrect assumptions about System.IO.Ports.SerialStream which is an internal type.", ex);
}
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetCommState(SafeFileHandle hFile, IntPtr lpDCB);
}
这篇关于串口 - 我怎么设置字符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!