Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
串口读取正常,但分配的字符串有垃圾,C#_C#_Textbox_Gps_Serial Port - Fatal编程技术网

串口读取正常,但分配的字符串有垃圾,C#

串口读取正常,但分配的字符串有垃圾,C#,c#,textbox,gps,serial-port,C#,Textbox,Gps,Serial Port,我正在尝试从串行端口分割传入数据,并用后续数据更新文本框。我首先看看是否可以对“$”进行拆分,以及拆分后的下一个单词是否是“GPGGA”。如果是,我想从这句话中提取数据,其中“,”用作分隔符。 现在,如您所见,我首先更新串行端口读取的所有数据,这很好。显示包含“GPGGA”行的完整句子。但在我拆分它之后,包含“GPGGA”的句子部分看起来像“GPGGA,1\0\0\0\0…”,而之前刚刚更新到文本框的句子是“GPGGA,160333,,,,,,…”。我绝对肯定在这个句子中GPGGA后面有一个值,

我正在尝试从串行端口分割传入数据,并用后续数据更新文本框。我首先看看是否可以对“$”进行拆分,以及拆分后的下一个单词是否是“GPGGA”。如果是,我想从这句话中提取数据,其中“,”用作分隔符。 现在,如您所见,我首先更新串行端口读取的所有数据,这很好。显示包含“GPGGA”行的完整句子。但在我拆分它之后,包含“GPGGA”的句子部分看起来像“GPGGA,1\0\0\0\0…”,而之前刚刚更新到文本框的句子是“GPGGA,160333,,,,,,…”。我绝对肯定在这个句子中GPGGA后面有一个值,但是当我试图在调试模式下查看它时,字符串“ser_data”以及随后的子字符串都显示相同的垃圾。因此,我想要更新的最后一个文本框最终必然只显示1

谁能告诉我为什么会发生这种情况,以及我如何纠正它。我的论文工作急需它

谢谢, 布雷特

附言:我在下面附上了代码

private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        byte[] bData = null;
        bData = new byte[40];
        serialPort.Read(bData, 0, 40);
        string ser_data = System.Text.Encoding.GetEncoding("utf-8").GetString(bData);
        txtAck.Invoke(new UpdateTextCallback(this.UpdateTextAck), new object[] { ser_data });
        string[] str = null;
        str = new string[40];
        string[] str_ack = null;

        str = ser_data.Split('$');
        if (str.Length > 1)
        {
            for (int i = 1; i < str.Length; i++)
            {
                string temp1 = null;
                temp1 = str[i];
                if (temp1.StartsWith("GPGGA"))
                {
                    string[] temp2 = null;
                    temp2 = temp1.Split(',');

                    StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);

                    if (temp2.Length > 1)
                    {
                        string Time_GPS = temp2[1];
                        txtEasting.Invoke(new UpdateTextCallback(this.UpdateTextEast), new object[] { Time_GPS });
                        string text = "Time : " + Time_GPS;
                        // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);
                        objWriter.WriteLine(text);
                    }
                    if (temp2.Length > 2)
                    {
                        string Lat = temp2[2];
                        txtLatitude.Invoke(new UpdateTextCallback(this.UpdateTextLat), new object[] { Lat });
                        string text = " Latitude : " + Lat;
                        // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);
                        objWriter.WriteLine(text);
                    }
                    if (temp2.Length > 4)
                    {
                        string Long = temp2[4];
                        txtLongitude.Invoke(new UpdateTextCallback(this.UpdateTextLong), new object[] { Long });
                        string text = " Longitude : " + Long;
                        // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);
                        objWriter.WriteLine(text);
                    }
                    if (temp2.Length > 9)
                    {
                        string Alt = temp2[9];
                        txtNorthing.Invoke(new UpdateTextCallback(this.UpdateTextNorth), new object[] { Alt });
                        string text = " Altitude : " + Alt;
                        // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);
                        objWriter.WriteLine(text);
                    }
                    string Text = "." + '\n';
                    objWriter.WriteLine(Text);
                    objWriter.Close();

                    temp2 = null;
                    flag_status = 0;
                }
                temp1 = null;
            }
        }
        str = null;
private void serialPort\u DataReceived(对象发送方,SerialDataReceivedEventArgs e)
{
字节[]bData=null;
bData=新字节[40];
serialPort.Read(bData,0,40);
string ser_data=System.Text.Encoding.GetEncoding(“utf-8”).GetString(bData);
Invoke(newupdatetextcallback(this.UpdateTextAck),新对象[]{ser_data});
字符串[]str=null;
str=新字符串[40];
字符串[]str_ack=null;
str=seru data.Split(“$”);
如果(str.Length>1)
{
对于(int i=1;i1)
{
字符串时间_GPS=temp2[1];
Invoke(newupdatetextcallback(this.updatetextast),新对象[]{Time\u GPS});
string text=“时间:”+Time\u GPS;
//StreamWriter objWriter=new System.IO.StreamWriter(@“D:\Server.txt”,true);
objWriter.WriteLine(文本);
}
如果(temp2.Length>2)
{
字符串Lat=temp2[2];
Invoke(newupdatetextcallback(this.UpdateTextLat),新对象[]{Lat});
string text=“纬度:”+Lat;
//StreamWriter objWriter=new System.IO.StreamWriter(@“D:\Server.txt”,true);
objWriter.WriteLine(文本);
}
如果(temp2.Length>4)
{
字符串长度=temp2[4];
Invoke(newupdatetextcallback(this.UpdateTextLong),新对象[]{Long});
string text=“经度:”+长;
//StreamWriter objWriter=new System.IO.StreamWriter(@“D:\Server.txt”,true);
objWriter.WriteLine(文本);
}
如果(temp2.Length>9)
{
字符串Alt=temp2[9];
Invoke(新的UpdateTextCallback(this.UpdateTextNorth),新对象[]{Alt});
string text=“高度:”+Alt;
//StreamWriter objWriter=new System.IO.StreamWriter(@“D:\Server.txt”,true);
objWriter.WriteLine(文本);
}
字符串Text=“.”“+”\n';
objWriter.WriteLine(文本);
objWriter.Close();
temp2=null;
flag_status=0;
}
temp1=null;
}
}
str=null;

SerialPort.Read不一定能读取您要求的字符数

您需要保存返回值,即读取的字符数

   // nBytesRead will be between 0 and 40, depending on how many bytes were waiting.
   int nBytesRead = serialPort.Read(bData, 0, 40); 
   // Only decode the number of bytes actually retrieved.
   string ser_data = System.Text.Encoding.GetEncoding("utf-8").GetString(bData, 0, nBytesRead); 

SerialPort.Read不一定读取您要求的字符数

您需要保存返回值,即读取的字符数

   // nBytesRead will be between 0 and 40, depending on how many bytes were waiting.
   int nBytesRead = serialPort.Read(bData, 0, 40); 
   // Only decode the number of bytes actually retrieved.
   string ser_data = System.Text.Encoding.GetEncoding("utf-8").GetString(bData, 0, nBytesRead); 

修复并主要清理。这假设两件事:您的编码实际上是UTF-8,并且您的行以换行符结尾

private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    serialPort.Encoding = ASCIIEncoding.UTF8;
    string ser_data = serialPort.ReadLine();
    txtAck.Invoke(new UpdateTextCallback(this.UpdateTextAck), new object[] { ser_data });

    string[] str = ser_data.Split(new char[] { '$' }, 2);
    if (str.Length > 1)
    {
        for (int i = 1; i < str.Length; i++)
        {
            string temp1 = str[i];
            if (temp1.StartsWith("GPGGA"))
            {
                StreamWriter objWriter = new StreamWriter(@"D:\Server.txt", true);
                try
                {
                    string[] temp2 = temp1.Split(',');
                    if (temp2.Length > 1)
                    {
                        string Time_GPS = temp2[1];
                        txtEasting.Invoke(new UpdateTextCallback(this.UpdateTextEast), new object[] { Time_GPS });
                        string text = "Time : " + Time_GPS;
                        // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);
                        objWriter.WriteLine(text);
                    }
                    if (temp2.Length > 2)
                    {
                        string Lat = temp2[2];
                        txtLatitude.Invoke(new UpdateTextCallback(this.UpdateTextLat), new object[] { Lat });
                        string text = " Latitude : " + Lat;
                        // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);
                        objWriter.WriteLine(text);
                    }
                    if (temp2.Length > 4)
                    {
                        string Long = temp2[4];
                        txtLongitude.Invoke(new UpdateTextCallback(this.UpdateTextLong), new object[] { Long });
                        string text = " Longitude : " + Long;
                        // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);
                        objWriter.WriteLine(text);
                    }
                    if (temp2.Length > 9)
                    {
                        string Alt = temp2[9];
                        txtNorthing.Invoke(new UpdateTextCallback(this.UpdateTextNorth), new object[] { Alt });
                        string text = " Altitude : " + Alt;
                        // StreamWriter objWriter = new System.IO.StreamWriter(@"D:\Server.txt", true);
                        objWriter.WriteLine(text);
                    }
                    objWriter.WriteLine(".\n");
                }
                finally
                {
                    objWriter.Close();
                }

                flag_status = 0;
            }
        }
    }
}
private void serialPort\u DataReceived(对象发送方,SerialDataReceivedEventArgs e)
{
serialPort.Encoding=ascienceoding.UTF8;
字符串ser_data=serialPort.ReadLine();
Invoke(newupdatetextcallback(this.UpdateTextAck),新对象[]{ser_data});
string[]str=ser_data.Split(新字符[]{'$'},2);
如果(str.Length>1)
{
对于(int i=1;i1)
{
字符串时间_GPS=temp2[1];
Invoke(newupdatetextcallback(this.updatetextast),新对象[]{Time\u GPS});
string text=“时间:”+Time\u GPS;
//StreamWriter objWriter=new System.IO.StreamWriter(@“D:\Server.txt”,true);
objWriter.WriteLine(文本);
}
如果(temp2.Length>2)
{
弦板条