我最近刚开始用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
答案 0 :(得分:0)
我转换了十六进制输出,看起来完全没废话。如果使用不正确的波特率,通常会导致这种情况。看到奇数奇偶校验(大多数都没有或甚至)也是不寻常的。请检查供应商的COM设置,因为这很可能是原因。
我大部分时间都使用串口(我自己为硬件供应商工作)并且看不到任何明显错误的代码。我通常做的唯一区别是我个人喜欢使用Encoding.Default.GetString()方法将byte []转换为字符串。
我希望这会有所帮助。