Последовательный порт читает хорошо, но назначенная строка имеет мусор, C # - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь отделить входящие данные от последовательного порта и обновить текстовые поля последующими данными.Сначала я вижу, возможно ли разделение на '$', и следующее слово после разделения - "GPGGA".Если да, я хотел бы извлечь данные из этого предложения, где «,» служит разделителем.Теперь, как вы видите, я сначала обновляю все данные, считываемые последовательным портом, и это прекрасно работает.Отображается полное предложение, содержащее строку «GPGGA».Но после того, как я разделил его, часть предложения, содержащая «GPGGA», выглядит примерно так: «GPGGA, 1 \ 0 \ 0 \ 0 \ 0 \ 0 ...», когда действительно предложение, которое было только что обновлено до текстакоробка раньше была "GPGGA, 160333 ,,, ......".Я абсолютно уверен, что в предложении есть значение после GPGGA, но когда я пытаюсь посмотреть на него в режиме отладки, строка 'ser_data' и, следовательно, ее последующие подстроки все показывают тот же мусор.Итак, последнее текстовое поле, которое я хочу обновить, неизбежно заканчивается отображением только 1.

Может кто-нибудь сказать мне, почему это происходит, и как я могу это исправить.Мне срочно нужно это для моей дипломной работы.

Спасибо, Бретт

PS: я прикрепил код ниже.

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;

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

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); 
1 голос
/ 10 февраля 2012

Исправлено и в основном очищено. Это предполагает две вещи: ваша кодировка действительно 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;
            }
        }
    }
}
...