串口:转换数据

时间:2014-03-23 17:24:32

标签: c# gps serial-port

我最近刚开始用c#编写代码。我接受了挑战,在工作中开发GPS程序。  我们有一个由串口提供的数据。屏幕上的表示已经编码并可以使用。  我只需要从串口获取数据并将其放入数据库中。  我拥有的信息是端口的设置(Baudrate 9600,8,parity.odd,1)。  他们还给了我syntax()的结构,它作为字节流传输。  我拥有的最后一个是正确接收数据时的截图。  http://i61.tinypic.com/2ajcpww.png

就代码而言,数据库部分根本不是问题。一旦我从串口获得了正确的数据,我就可以将其加载到de数据库中,然后将其用于演示软件。

任何有经验的人都能指导我。我需要从提供数据系统的公司那里获得更多信息。

我必须从串口读取的代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Threading;
using System.Diagnostics;

namespace ClarityListener
{
    public partial class Form1 : Form
    {
        private SerialPort comPort = new SerialPort();
        string RxString;
        string port = "COM1";

        public Form1()
        {
            InitializeComponent();

            comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int count = comPort.BytesToRead;
            byte[] data = new byte[count];
            comPort.Read(data, 0, data.Length);
            RxString = (BitConverter.ToString(data));
            this.Invoke(new EventHandler(DisplayText));
        }


        private void DisplayText(object sender, EventArgs e)
        {
            richTextBox1.AppendText(RxString);
        }


        private void button2_Click(object sender, EventArgs e)
        {
            if (comPort.IsOpen)
            {
                comPort.Close();
            }
            else if (!comPort.IsOpen)
            {

                try
                {
                    comPort.PortName = port;
                    comPort.BaudRate = 9600;
                    comPort.Parity = Parity.Odd;
                    comPort.DataBits = 8;
                    comPort.StopBits = StopBits.One;
                    comPort.Handshake = Handshake.None;
                    comPort.Open();
                }
                catch (Exception er)
                {
                    MessageBox.Show(er.Message);
                }
            }
            if (comPort.IsOpen)
            {
                richTextBox1.Clear();

            }
        }

        private void Form1_FormClosing(object sender, FormClosedEventArgs e)
        {
            if (comPort.IsOpen)
            {
                comPort.Close();
            }
            MessageBox.Show("Poort is gesloten");

            this.Dispose();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (comPort.IsOpen)
            {
                comPort.Close();
            }
            MessageBox.Show("Poort is gesloten");

            this.Close();
            this.Dispose();
        }


    }
}

最终结果应该是人类可读的(数据库)。 传输的数据类似于6005 1 500 1058 1609 0116 51°08'924 02°43'252。

这是我的程序atm从流中读取的内容:

02-71-00-00-0C-84-07-1317-11-05-23-00-76-26-8522-8C-00-00-27-FB-00-01A3-BF-0302-72-00-00-0C-85-    07-0C17-12-05-24-00-70-25-E021-3C-00-00-23-E9-00-019D-AF-0302-73-00-00-0C-8C-07-0E17-12-05-19-00-    76-25-541F-D8-00-00-17-E1-00-018F-BC-0302-74-00-00-0C-8F-07-0D17-12-05-2D-00-76-26-A823-70-00-00-    33-D0-00-01B0-AE-0302-75-00-00-0E-B4-04-C517-51-04-B6-00-70-26-0121-7B-00-00-06-7D-00-0180-5F-    0302-76-00-00-0E-B8-00-0000-00-00-00-00-00-00-0000-00-00-00-00-00-00-0111-2F-0302-77-00-00-0F-8C-    09-1013-94-05-1B-00-7D-25-3C35-0E-00-00-30-14-00-02BE-9F-0302-78-00

1 个答案:

答案 0 :(得分:0)

我转换了十六进制输出,看起来完全没废话。如果使用不正确的波特率,通常会导致这种情况。看到奇数奇偶校验(大多数都没有或甚至)也是不寻常的。请检查供应商的COM设置,因为这很可能是原因。

我大部分时间都使用串口(我自己为硬件供应商工作)并且看不到任何明显错误的代码。我通常做的唯一区别是我个人喜欢使用Encoding.Default.GetString()方法将byte []转换为字符串。

我希望这会有所帮助。