最后更新这是我们固件的全部时间。 尴尬在一定程度上,但我很高兴我们能向前走,我可以把学习Java关闭一天。 我的回答如下。
UPDATE所以我或多或少地放弃了这一点。 我认为这是下降到API中的错误,但我既没有时间,资源,也没有技能设置才能到它的底部。 我认为存在一些硬件为之Windows只是给出了中指。 我已经下载了Eclipse,切换到Java,并会尝试看看是否能工程。 如果没有,你会看到我回到这里。 不过,我绝对喜欢来解决这个所以如果任何人有时间或意愿深入挖掘这一块,我很乐意看到你想出。 很显然,我会回到这里检查不时。 请确保你“@”我在你的意见,所以我提醒。
原帖
我知道有几个人处理这个问题,但我希望有人能帮助我。 我试图连接到一个COM端口,但我得到一个IO异常,当我尝试使用serialport.Open()
命令:
System.IO.IOException: The parameter is incorrect.
at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
at System.IO.Ports.InternalResources.WinIOError()
at System.IO.Ports.SerialStream.InitializeDCB(Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Boolean discardNull)
at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
at System.IO.Ports.SerialPort.Open()
at *programtitlehere.cs*:line 90
我使用Stellaris LM4F232来模拟一个COM端口。 我可以打开,访问和我得到使用白蚁(终端程序)的好成绩,但每当我试图与Visual Studio它甚至不会连接和我得到这个错误。 现在,我甚至不真的知道这是什么错误意味着,我虽然想读其他地方我还是感到失落。
任何人都可以向我解释这里发生了什么,也许我可以开始尝试算出这个? 我可以有更多的代码,但说实话没有太多存在; 通过一个串口设备的所有属性都为正常,并且仅与该设备发生(I可以使用MSP430具有相同细节没有问题)。
我的代码如下所示想看到它的人谁(注意,这只是一个“沙箱”,而不是实际的程序,但症状是相同的):
try
{
serialPort1.PortName = "COM5";
serialPort1.Open();
if (serialPort1.IsOpen == true)
{
textBox1.Text = "CONNECTED";
}
else
{
textBox1.Text = "NOT CONNECTED";
}
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.ToString(), "ERROR");
}
和其他设置与物业经理(唯一的区别是波特率设置为230400,其他都是他们默认)完成。 我可以打开了这个COM4(一个MSP430),其对于所有的意图和目的是相同的设备。 我可以用白蚁打开COM5所以我知道连接是否良好)。 不,我不是在同一时间打开它们。 如果您需要更多的信息,让我知道,我可以发布更多。
谢谢!
编辑:我在试图弄清楚这一点,并仍然没有运气三服。 我真的不明白,为什么我可以通过一个终端程序,而不是我自己的时候尽可能靠近我可以看到有绝对没有区别访问此COM。 有谁知道一个程序,可以“检查”一个COM端口,看看它的性能(除了窗口管理器我的意思)吗? 我越来越漂亮沮丧,并在静止不动是那种在我的项目,直到我想出解决办法...
EDIT2:我发现一个明显的解决办法,但我还没有得到它的工作在这里 。 现在,我得到了几个不同的IO错误,但至少它是运动(不知道这是进步)。 我还了解到,这是一个.NET的错误,因为2.0已经存在。 我仍然希望任何帮助,但如果我弄明白我会报到。 扎克的代码(上面链接的解决方法)如下所示:
using System;
using System.IO;
using System.IO.Ports;
using System.Runtime.InteropServices;
using System.Text;
using Microsoft.Win32.SafeHandles;
namespace SerialPortTester
{
public class SerialPortFixer : IDisposable
{
public static void Execute(string portName)
{
using (new SerialPortFixer(portName))
{
}
}
#region IDisposable Members
public void Dispose()
{
if (m_Handle != null)
{
m_Handle.Close();
m_Handle = null;
}
}
#endregion
#region Implementation
private const int DcbFlagAbortOnError = 14;
private const int CommStateRetries = 10;
private SafeFileHandle m_Handle;
private SerialPortFixer(string portName)
{
const int dwFlagsAndAttributes = 0x40000000;
const int dwAccess = unchecked((int) 0xC0000000);
if ((portName == null) || !portName.StartsWith("COM", StringComparison.OrdinalIgnoreCase))
{
throw new ArgumentException("Invalid Serial Port", "portName");
}
SafeFileHandle hFile = CreateFile(@"\\.\" + portName, dwAccess, 0, IntPtr.Zero, 3, dwFlagsAndAttributes,
IntPtr.Zero);
if (hFile.IsInvalid)
{
WinIoError();
}
try
{
int fileType = GetFileType(hFile);
if ((fileType != 2) && (fileType != 0))
{
throw new ArgumentException("Invalid Serial Port", "portName");
}
m_Handle = hFile;
InitializeDcb();
}
catch
{
hFile.Close();
m_Handle = null;
throw;
}
}
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int FormatMessage(int dwFlags, HandleRef lpSource, int dwMessageId, int dwLanguageId,
StringBuilder lpBuffer, int nSize, IntPtr arguments);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool GetCommState(SafeFileHandle hFile, ref Dcb lpDcb);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetCommState(SafeFileHandle hFile, ref Dcb lpDcb);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool ClearCommError(SafeFileHandle hFile, ref int lpErrors, ref Comstat lpStat);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode,
IntPtr securityAttrs, int dwCreationDisposition,
int dwFlagsAndAttributes, IntPtr hTemplateFile);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern int GetFileType(SafeFileHandle hFile);
private void InitializeDcb()
{
Dcb dcb = new Dcb();
GetCommStateNative(ref dcb);
dcb.Flags &= ~(1u << DcbFlagAbortOnError);
SetCommStateNative(ref dcb);
}
private static string GetMessage(int errorCode)
{
StringBuilder lpBuffer = new StringBuilder(0x200);
if (
FormatMessage(0x3200, new HandleRef(null, IntPtr.Zero), errorCode, 0, lpBuffer, lpBuffer.Capacity,
IntPtr.Zero) != 0)
{
return lpBuffer.ToString();
}
return "Unknown Error";
}
private static int MakeHrFromErrorCode(int errorCode)
{
return (int) (0x80070000 | (uint) errorCode);
}
private static void WinIoError()
{
int errorCode = Marshal.GetLastWin32Error();
throw new IOException(GetMessage(errorCode), MakeHrFromErrorCode(errorCode));
}
private void GetCommStateNative(ref Dcb lpDcb)
{
int commErrors = 0;
Comstat comStat = new Comstat();
for (int i = 0; i < CommStateRetries; i++)
{
if (!ClearCommError(m_Handle, ref commErrors, ref comStat))
{
WinIoError();
}
if (GetCommState(m_Handle, ref lpDcb))
{
break;
}
if (i == CommStateRetries - 1)
{
WinIoError();
}
}
}
private void SetCommStateNative(ref Dcb lpDcb)
{
int commErrors = 0;
Comstat comStat = new Comstat();
for (int i = 0; i < CommStateRetries; i++)
{
if (!ClearCommError(m_Handle, ref commErrors, ref comStat))
{
WinIoError();
}
if (SetCommState(m_Handle, ref lpDcb))
{
break;
}
if (i == CommStateRetries - 1)
{
WinIoError();
}
}
}
#region Nested type: COMSTAT
[StructLayout(LayoutKind.Sequential)]
private struct Comstat
{
public readonly uint Flags;
public readonly uint cbInQue;
public readonly uint cbOutQue;
}
#endregion
#region Nested type: DCB
[StructLayout(LayoutKind.Sequential)]
private struct Dcb
{
public readonly uint DCBlength;
public readonly uint BaudRate;
public uint Flags;
public readonly ushort wReserved;
public readonly ushort XonLim;
public readonly ushort XoffLim;
public readonly byte ByteSize;
public readonly byte Parity;
public readonly byte StopBits;
public readonly byte XonChar;
public readonly byte XoffChar;
public readonly byte ErrorChar;
public readonly byte EofChar;
public readonly byte EvtChar;
public readonly ushort wReserved1;
}
#endregion
#endregion
}
internal class Program
{
private static void Main(string[] args)
{
SerialPortFixer.Execute("COM1");
using (SerialPort port = new SerialPort("COM1"))
{
port.Write("test");
}
}
}
}
EDIT3:6日:我还在刻苦这个。 我的水口粮很低,但我仍然在挣扎。 我觉得帮助肯定是在地平线上。 谁找到本杂志把我的遗体回到加拿大,并找到妮可。 告诉她,我爱她。
但严重的是,我不知道是什么原因造成了这个问题。 我想知道,如果它纯粹是嵌入式的; 也许是因为它是USB转走,或因为该设备能够被主机也。 有没有人遇到这个问题? 这并不能解释为什么我可以使用白蚁(终端程序,对那些观众刚刚加盟美国)虽然。 我一直在试图寻找一个开放源码的终端程序是:a)工程和b)看到)。 按照往常一样,我会,如果我发现这个问题,因为我现在已经找到了无数的论坛,它的声音的人都有过这样的问题,可以追溯到到2006年报告回到这里。
EDIT4:那么按所给的意见,我下载了一个端口监控软件应用程序(我Eltima串行端口监视器),它看起来像一个波特问题:
但奇怪的是不管什么波特我将它仍然失败。 并且还可以有人解释向上/向下的事情意味着什么? 我试着用搜索引擎,但该关键字过于宽泛。 像往常一样,我会继续汇报任何改变。
此外,为了记录在案,我可以连接在一个115200波特(同白蚁)使用Eltima。 不幸的是,这并不在Visual Studio中工作。
EDIT5:我们的剧情发生意外的转折。 我被监控时白蚁连接到COM端口的问题,BLAM会发生什么! 白蚁抛出确切的同样的错误我的程序,但它忽略它。 天才,对吧? 不拘小节,但它的作品。 现在,我需要学习如何忽略的IOExceptions。 当我得到它想通了,我马上汇报。
EDIT6:所以事实证明这是一个波特率的问题,但它更深入。 我一直在使用Eltima串行端口监控软件,这是非常直观和易于使用。 我会推荐它。 经过一番研究我了解到,你不能忽视这个例外,仍然使用.NETs库连接到串行端口。 所以,我必须去深入的Win32 API和写我自己。 我发现,这个摸了几页,但说实话之前,所以它可能是前一段时间我报到,但我一定会想出解决办法并尽快给大家我从来没有做过这样的事。 有太多的谁存在这个问题。 我发现不少论坛和网站在那里我可以看到完全一样的症状,但没有人真的做了很多工作,除了说“是的,.NET很烂”。 我打算写一个完整的静态库类,然后在我的网站上公布要么,这里还有其它地方我可以。 希望.NET会注意到的(因为2.0这个bug已经存在)。 当它完成我马上汇报!
EDIT7:这比我想象的要困难得多。
EDIT8:我不知道是否有人跟随此或没有,但我想说,我仍然在,但我出城出差一个星期。 我还是乐意听到的建议和想法的替代尽管!