C# 串行端口。接收到的数据未触发(.net 4.5)

C# 串行端口。接收到的数据未触发(.net 4.5),c#,serial-port,C#,Serial Port,我使用的是.NET4.5,因为我知道一些关于.net对rad串行数据的代码实现错误的互联网讨论,所以我使用了下面的代码 然而,问题是,尽管我可以看到我创建了一个COM端口连接(到正确的COM端口号),但它从未在收到数据时触发。 数据接收基于一个简单的Arduino应用程序(Arduino监视器确实显示数据通过串行发送),但.net从不在串行事件发生时触发 我在eventread上设置了断点,它永远不会被命中 我在这里看过其他类似的讨论,但到目前为止,它们并没有解决我遇到的问题。我尝试了各种串行线

我使用的是.NET4.5,因为我知道一些关于.net对rad串行数据的代码实现错误的互联网讨论,所以我使用了下面的代码

然而,问题是,尽管我可以看到我创建了一个COM端口连接(到正确的COM端口号),但它从未在收到数据时触发。 数据接收基于一个简单的Arduino应用程序(Arduino监视器确实显示数据通过串行发送),但.net从不在串行事件发生时触发

我在eventread上设置了断点,它永远不会被命中

我在这里看过其他类似的讨论,但到目前为止,它们并没有解决我遇到的问题。我尝试了各种串行线路设置组合,相信下面的设置是正确的。 对于Arduino零件,生产线设置为:

Serial.begin(9600);
我这样称呼我的类:`infraredsensormysens=newinfraredsensor(“COM4”,9600);'


我没有主意了(头发快把我逼疯了),是什么导致了这种行为?

最后我花了两天时间

在arduino代码中,我现在使用

serial.print("Mytext\n");  // using \n to be sure of escape character
对于串行线配置,我现在使用

this.comport = COMport;
this.Port = new SerialPort(comport);
this.Port.BaudRate = baudrate;
this.Port.DataBits = 8;
this.Port.Parity = Parity.None;
this.Port.StopBits = StopBits.One;
this.Port.Handshake = Handshake.None;
this.Port.RtsEnable = true;
      //  Port.NewLine = "\n";
       //   Port.ReceivedBytesThreshold = 2; // + linefeed 
        this.Port.DataReceived += new new SerialDataReceivedEventHandler(ReadEvent);

....
..
SerialDataReceivedEventHandler(ReadEvent);
//code didnt change inside but the method has changed see the +=

当有数据通过串行端口时,
DataReceived
事件触发,但它可以随机触发。因此,您可以在一个事件中获取部分消息,在另一个事件中获取另一半消息。你应该有一把钥匙,知道你什么时候掌握了全部信息。因此,构建您的字符串,直到您拥有整个消息,然后根据消息执行某些操作

例如,我的设备的消息在有换行符时完成。所以我的代码看起来像:

char ESC = (char)27;
char CR = (char)13;
char LF = (char)10;
StringBuilder sb = new StringBuilder();

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string Data = serialPort1.ReadExisting();

    foreach (char c in Data)
    {
        if (c == LF)
        {
            sb.Append(c);

            //we have our message, do something, maybe like
            if (sb.ToString().Contains("A"))
            {
                //print A
            }
            else
            {
                //print B
            }
        }
        else
        {
            sb.Append(c);
        }
    }
}

您是否尝试过移动
Port.DtrEnable=truePort.Open()
之前的代码>到?我以前从未使用.NET进行过串行通信,但如果不是像这样愚蠢的事情,我也不会感到惊讶。除此之外,我建议下载某种串行数据嗅探器,以确保端口实际接收数据。确保您的
COMport
字符串在设备管理器中正确/匹配。我曾经体验过Windows在移除和重新插入设备时更改端口名称,尽管它插入了相同的端口。虽然,这可能是我所处的环境所特有的,所以用(大)茶匙的盐来吃。@Clint是的,我试过了,我也不确定,但有些人建议用另一种talk@marcushobson我可以清楚地看到它的COM4,arduino IDE也使用COM4。我还确定IDE没有锁定端口4,我断开连接并重新启动,我甚至可以验证我是否有连接,因为port.IsOpen在类的构造函数中工作正常。即使它会在“\n”上触发,我有点怀疑。。这样就不会导致我现在的代码失败,因为“\n”不是A或B。虽然这是一个我感兴趣的主题,但因为.net 4.0中的组件有时会丢失字节,这在我的prj中是不允许的
char ESC = (char)27;
char CR = (char)13;
char LF = (char)10;
StringBuilder sb = new StringBuilder();

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string Data = serialPort1.ReadExisting();

    foreach (char c in Data)
    {
        if (c == LF)
        {
            sb.Append(c);

            //we have our message, do something, maybe like
            if (sb.ToString().Contains("A"))
            {
                //print A
            }
            else
            {
                //print B
            }
        }
        else
        {
            sb.Append(c);
        }
    }
}