using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;namespace PC上位机
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
} private void CKbutton_Click(object sender, EventArgs e) //“打开关闭串口”按钮
{
string CommNum = this.CKH.Text;
int IntBdr = Convert.ToInt32(this.BTL.Text);//将串口号和波特率存起来
if (!serialPort.IsOpen) //如果串口是关闭的
{
serialPort.PortName = CommNum;
serialPort.BaudRate = IntBdr; //设定串口号和波特率
try //try:尝试下面的代码,如果错误就跳出来执行catch里面代码
{
serialPort.Open(); //打开串口
CKbutton.Text = "关闭串口"; //改变按钮上的字符
CKH.Enabled = false;
BTL.Enabled = false;
}
catch
{
MessageBox.Show("串口打开失败了!\n\n可能是串口已补占用。");
}
}
else//如果串口是打开的
{
serialPort.Close(); //关闭串口;
CKbutton.Text = "打开串口"; //改变按钮上的字符
CKH.Enabled = true;
BTL.Enabled = true; //将串口号与波特率选择控件打开
}
}
ArrayList data = new ArrayList(); public ArrayList Data
{
get { return data; }
set { data = value; }
}
Pen myPen = new Pen(Color.Red); #region xy增益与坐标申明
private float xGain;//x增益
public float XGain
{
get { return xGain; }
set { xGain = value; }
}
private float yGain;//y增益 public float YGain
{
get { return yGain; }
set { yGain = value; }
}
private float xOrigin;//x原点 public float XOrigin
{
get { return xOrigin; }
set { xOrigin = value; }
}
private float yOrigin;//y原点 public float YOrigin
{
get { return yOrigin; }
set { yOrigin = value; }
}
private float xNext;//x新坐标 public float XNext
{
get { return xNext; }
set { xNext = value; }
}
private float yNext;//y新坐标 public float YNext
{
get { return yNext; }
set { yNext = value; }
}
private float i; public float I
{
get { return i; }
set { i = value; }
}
#endregion
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
for (int d = 0; d < 8; d++)
{
data.Add(serialPort.ReadByte());
}
} public void draw()
{ Bitmap bm = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(bm);
xGain = i;
i = (float)(i + 0.01); yGain = float.Parse(data[7].ToString());
data.Clear();
xNext = xGain + xOrigin;
yNext = yGain + yOrigin;
g.DrawLine(myPen, xOrigin, yOrigin, xNext, yNext);
xOrigin = xNext;
yOrigin = yNext;
g.Dispose();
g = this.pictureBox1.CreateGraphics();
g.DrawImage(bm, 0, 0);
g.Dispose();
//数据测试代码段:
textBox1.Invoke(new EventHandler(delegate
{
textBox1.AppendText(Convert.ToString(data[data.Count - 1]) + " ");
textBox1.ScrollToCaret();
}));
data.Clear();
} private void timer1_Tick_1(object sender, EventArgs e)
{
draw();
}
大家帮我看看这段代码,上位机接收串口数据并绘图。为什么textBox1收不到数据,pictureBox1也无法绘图.
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;namespace PC上位机
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
} private void CKbutton_Click(object sender, EventArgs e) //“打开关闭串口”按钮
{
string CommNum = this.CKH.Text;
int IntBdr = Convert.ToInt32(this.BTL.Text);//将串口号和波特率存起来
if (!serialPort.IsOpen) //如果串口是关闭的
{
serialPort.PortName = CommNum;
serialPort.BaudRate = IntBdr; //设定串口号和波特率
try //try:尝试下面的代码,如果错误就跳出来执行catch里面代码
{
serialPort.Open(); //打开串口
CKbutton.Text = "关闭串口"; //改变按钮上的字符
CKH.Enabled = false;
BTL.Enabled = false;
}
catch
{
MessageBox.Show("串口打开失败了!\n\n可能是串口已补占用。");
}
}
else//如果串口是打开的
{
serialPort.Close(); //关闭串口;
CKbutton.Text = "打开串口"; //改变按钮上的字符
CKH.Enabled = true;
BTL.Enabled = true; //将串口号与波特率选择控件打开
}
}
ArrayList data = new ArrayList(); public ArrayList Data
{
get { return data; }
set { data = value; }
}
Pen myPen = new Pen(Color.Red); #region xy增益与坐标申明
private float xGain;//x增益
public float XGain
{
get { return xGain; }
set { xGain = value; }
}
private float yGain;//y增益 public float YGain
{
get { return yGain; }
set { yGain = value; }
}
private float xOrigin;//x原点 public float XOrigin
{
get { return xOrigin; }
set { xOrigin = value; }
}
private float yOrigin;//y原点 public float YOrigin
{
get { return yOrigin; }
set { yOrigin = value; }
}
private float xNext;//x新坐标 public float XNext
{
get { return xNext; }
set { xNext = value; }
}
private float yNext;//y新坐标 public float YNext
{
get { return yNext; }
set { yNext = value; }
}
private float i; public float I
{
get { return i; }
set { i = value; }
}
#endregion
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
for (int d = 0; d < 8; d++)
{
data.Add(serialPort.ReadByte());
}
} public void draw()
{ Bitmap bm = new Bitmap(pictureBox1.Width, pictureBox1.Height);
Graphics g = Graphics.FromImage(bm);
xGain = i;
i = (float)(i + 0.01); yGain = float.Parse(data[7].ToString());
data.Clear();
xNext = xGain + xOrigin;
yNext = yGain + yOrigin;
g.DrawLine(myPen, xOrigin, yOrigin, xNext, yNext);
xOrigin = xNext;
yOrigin = yNext;
g.Dispose();
g = this.pictureBox1.CreateGraphics();
g.DrawImage(bm, 0, 0);
g.Dispose();
//数据测试代码段:
textBox1.Invoke(new EventHandler(delegate
{
textBox1.AppendText(Convert.ToString(data[data.Count - 1]) + " ");
textBox1.ScrollToCaret();
}));
data.Clear();
} private void timer1_Tick_1(object sender, EventArgs e)
{
draw();
}
大家帮我看看这段代码,上位机接收串口数据并绘图。为什么textBox1收不到数据,pictureBox1也无法绘图.
ReadByte()是阻塞的
假如串口没有数据,程序还调用ReadByte()会阻塞在那,这时你串口关闭会抛出异常。
{
data.Add(serialPort.ReadByte());
}
为什么要用循环。
你先看看抛出异常的时候d等于多少。
{
// for (int d = 0; d < 8; d++)
//{
//data.Add(serialPort.ReadByte());
//}
string data = serialPort.ReadExisting();
updateReceiveText(data);
}添加:
public void updateReceiveText(string msg)
{
textBox1.Invoke(new EventHandler(delegate
{
textBox1.AppendText(msg);
textBox1.ScrollToCaret();
}));
}我这样改了后可以收到数据了。但是怎么把串口的数据给 “ArrayList data = new ArrayList();”
并正确收到显示画图呢
buffer = new byte[bytes];
serialPort.Read(buffer, 0, bytes);
不要ArrayList,用List
list.AddRange(buffer);
直接接收数据当然会出现问题。
另外串口的配置也要注意。看看波特率、奇偶校验、停止位等等是不是和设备的参数相同。
另外如果你的电脑串口是usb转的串口,也许也会有问题。
你可以先找个串口调试助手来试试,能不能接受到数据。
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
for (int d = 0; d < 8; d++)
{
data.Add(serialPort.ReadByte());
}
}
好像data.Add并没有把数据添加到data
怎么改啊
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
// for (int d = 0; d < 8; d++)
//{
//data.Add(serialPort.ReadByte());
//}
string data = serialPort.ReadExisting();
updateReceiveText(data);
}添加:
public void updateReceiveText(string msg)
{
textBox1.Invoke(new EventHandler(delegate
{
textBox1.AppendText(msg);
textBox1.ScrollToCaret();
}));
}
但是用data却不行