繁体   English   中英

串口:转换数据

[英]Serial port : converting data

我只是最近才开始用C#编写代码。 我面临着开发工作中的GPS程序的挑战。 我们拥有由串行端口提供的数据。 屏幕上的表示已全部编码,可以使用。 我只需要从串行端口获取数据并将其放入数据库中即可。 我所拥有的信息是端口的设置(波特率9600、8,parity.odd,1)。 他们还给了我语法()的结构,它以字节流的形式传输。 我最后要说的是屏幕快照,显示数据正确接收后的样子。 http://i61.tinypic.com/2ajcpww.png

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

任何有经验的人都能在我的途中引导我。 我还需要从提供数据系统的公司那里找到更多信息。

我必须从串行端口读取的代码是这样的:

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

我转换了十六进制输出,看起来像是胡说八道。 如果使用错误的波特率,通常会导致这种情况。 奇数奇偶校验(大多数为零或偶数)也很不寻常。 请与供应商检查COM设置,因为这很可能是原因。

我大多数时候都使用串行端口(我自己是为硬件供应商工作的),看不到您的代码明显有问题。 与我通常所做的唯一区别是,我个人喜欢使用Encoding.Default.GetString()方法将byte []转换为字符串。

我希望这有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM