主题:急!求助关于串口通讯的问题。。
我是要编一个串口的程序,实现收发和绘图的功能。我设置的是接收9位,可是为什么我收到的9位数和发送的顺序不一样呢?如我发“123456789”,我收到的可能是“456789123”。请问哪位高手知道这个问题出在哪里?
期待您的帮助。。。谢谢
具体程序如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading;
namespace 数据流
{
public partial class Form1 : Form
{
private List<double> dataList = new List<double>();
private int pointsTotal = 0;
Thread tt = null; //线程
int sleepTime = 800;
string fileAddress = null;
public Form1()
{
InitializeComponent();
serialPort1.Open();
this.panel1.Enabled = false;
}
private void button1_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Filter = "*.txt|*.txt";
if (saveFile.ShowDialog() == DialogResult.OK)
{
fileAddress= saveFile.FileName;
}
}
catch (Exception ex)
{
throw ex;
}
}
public void writeToDisk(string address, string writeText)
{
StreamWriter wr = new StreamWriter(address, true);
wr.Write(writeText);
wr.Close();
}
private void DataEnt()
{
MethodInvoker mi = new MethodInvoker(this.DataInvoke);
while (true)
{
this.BeginInvoke(mi);
Thread.Sleep(sleepTime);
}
}
private void DataInvoke()
{
byte[] receivedData = new byte[1024];
serialPort1.Read(receivedData, 0, 9);
string tempS = System.Text.Encoding.ASCII.GetString(receivedData);
writeToDisk(fileAddress, tempS);
this.textBox1.Text += tempS;
}
private void button2_Click(object sender, EventArgs e)
{
try
{
tt = new Thread(new ThreadStart(this.DataEnt));
tt.Start();
}
catch (Exception ex)
{
throw ex;
}
}
private void button4_Click(object sender, EventArgs e)
{
serialPort1.Write("1");
}
private void button3_Click(object sender, EventArgs e)
{
try
{
tt.Abort();
}
catch (Exception ex)
{
throw ex;
}
}
private void button5_Click(object sender, EventArgs e)
{
int i = serialPort1.ReadByte();
i -= 48;
if (i == 0)
{
MessageBox.Show("水位不符合标准,不能启动", "警告");
}
else
{
MessageBox.Show("可以启动", "提示");
}
}
private void button6_Click(object sender, EventArgs e)
{
serialPort1.Write("2");
}
private void button7_Click(object sender, EventArgs e)
{
serialPort1.Write("3");
}
private void button8_Click(object sender, EventArgs e)
{
serialPort1.Write("4");
}
private void button9_Click(object sender, EventArgs e)
{
serialPort1.Write("5");
}
private void button10_Click(object sender, EventArgs e)
{
serialPort1.Write("6");
}
private void HandleDataFromFile()
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "*.txt|*.txt";
if (open.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(open.FileName);
while (!sr.EndOfStream)
{
string temp = sr.ReadLine();
double number = double.Parse(temp);
number = System.Math.Abs(number);
number = Math.Pow(number, 3);
dataList.Add(number);
}
pointsTotal = dataList.Count;
}
}
private void button11_Click(object sender, EventArgs e)
{
this.HandleDataFromFile();
panel1.Enabled = false;
panel1.Enabled = true;
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics horizontal = e.Graphics;
Pen pen1 = new Pen(Color.Blue);
PointF[] points = new PointF[pointsTotal];
for (int i = 0; i < dataList.Count; i++)
{
points[i].X = (float)i * 2;
points[i].Y = (float)dataList[i];
}
try
{
horizontal.DrawLines(pen1, points);
}
catch (Exception ex)
{
}
}
}
}
期待您的帮助。。。谢谢
具体程序如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading;
namespace 数据流
{
public partial class Form1 : Form
{
private List<double> dataList = new List<double>();
private int pointsTotal = 0;
Thread tt = null; //线程
int sleepTime = 800;
string fileAddress = null;
public Form1()
{
InitializeComponent();
serialPort1.Open();
this.panel1.Enabled = false;
}
private void button1_Click(object sender, EventArgs e)
{
try
{
SaveFileDialog saveFile = new SaveFileDialog();
saveFile.Filter = "*.txt|*.txt";
if (saveFile.ShowDialog() == DialogResult.OK)
{
fileAddress= saveFile.FileName;
}
}
catch (Exception ex)
{
throw ex;
}
}
public void writeToDisk(string address, string writeText)
{
StreamWriter wr = new StreamWriter(address, true);
wr.Write(writeText);
wr.Close();
}
private void DataEnt()
{
MethodInvoker mi = new MethodInvoker(this.DataInvoke);
while (true)
{
this.BeginInvoke(mi);
Thread.Sleep(sleepTime);
}
}
private void DataInvoke()
{
byte[] receivedData = new byte[1024];
serialPort1.Read(receivedData, 0, 9);
string tempS = System.Text.Encoding.ASCII.GetString(receivedData);
writeToDisk(fileAddress, tempS);
this.textBox1.Text += tempS;
}
private void button2_Click(object sender, EventArgs e)
{
try
{
tt = new Thread(new ThreadStart(this.DataEnt));
tt.Start();
}
catch (Exception ex)
{
throw ex;
}
}
private void button4_Click(object sender, EventArgs e)
{
serialPort1.Write("1");
}
private void button3_Click(object sender, EventArgs e)
{
try
{
tt.Abort();
}
catch (Exception ex)
{
throw ex;
}
}
private void button5_Click(object sender, EventArgs e)
{
int i = serialPort1.ReadByte();
i -= 48;
if (i == 0)
{
MessageBox.Show("水位不符合标准,不能启动", "警告");
}
else
{
MessageBox.Show("可以启动", "提示");
}
}
private void button6_Click(object sender, EventArgs e)
{
serialPort1.Write("2");
}
private void button7_Click(object sender, EventArgs e)
{
serialPort1.Write("3");
}
private void button8_Click(object sender, EventArgs e)
{
serialPort1.Write("4");
}
private void button9_Click(object sender, EventArgs e)
{
serialPort1.Write("5");
}
private void button10_Click(object sender, EventArgs e)
{
serialPort1.Write("6");
}
private void HandleDataFromFile()
{
OpenFileDialog open = new OpenFileDialog();
open.Filter = "*.txt|*.txt";
if (open.ShowDialog() == DialogResult.OK)
{
StreamReader sr = new StreamReader(open.FileName);
while (!sr.EndOfStream)
{
string temp = sr.ReadLine();
double number = double.Parse(temp);
number = System.Math.Abs(number);
number = Math.Pow(number, 3);
dataList.Add(number);
}
pointsTotal = dataList.Count;
}
}
private void button11_Click(object sender, EventArgs e)
{
this.HandleDataFromFile();
panel1.Enabled = false;
panel1.Enabled = true;
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
Graphics horizontal = e.Graphics;
Pen pen1 = new Pen(Color.Blue);
PointF[] points = new PointF[pointsTotal];
for (int i = 0; i < dataList.Count; i++)
{
points[i].X = (float)i * 2;
points[i].Y = (float)dataList[i];
}
try
{
horizontal.DrawLines(pen1, points);
}
catch (Exception ex)
{
}
}
}
}