关于C#上位机接收串口数据并绘图的问题

oykwelcome 2011-06-09 10:02:09
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也无法绘图.
...全文
954 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
yang1216 2011-06-09
  • 打赏
  • 举报
回复
for (int d = 0; d < 8; d++)
{
data.Add(serialPort.ReadByte());
}
为什么要用循环。
你先看看抛出异常的时候d等于多少。
oykwelcome 2011-06-09
  • 打赏
  • 举报
回复
用别人写的串口接收程序可以接收到数据
lovetsfuer 2011-06-09
  • 打赏
  • 举报
回复
貌似没有接收到数据,你用串口调试助手接收下数据看看什么情况
然后单步调试看看是不是能接收到数据
ghost5216 2011-06-09
  • 打赏
  • 举报
回复

ReadByte()是阻塞的
假如串口没有数据,程序还调用ReadByte()会阻塞在那,这时你串口关闭会抛出异常。
oykwelcome 2011-06-09
  • 打赏
  • 举报
回复
能不能说的具体点。 data.Add(serialPort.ReadByte());系统老是说这句话有问题“由于线程退出或应用程序请求,已放弃IO操作”
f1305147 2011-06-09
  • 打赏
  • 举报
回复
串口接收C#弄得比较好操作。因为是全封装起来了。
无非就是波特率,串口名等的设置看有没有问题。
无常名 2011-06-09
  • 打赏
  • 举报
回复
断点调试一下,看看串口收到数据没有。
bdmh 2011-06-09
  • 打赏
  • 举报
回复
收不到数据,那是你串口问题,看看串口参数设置正确吗,协议是否正确
yang1216 2011-06-09
  • 打赏
  • 举报
回复
我倒
LZ,你把我给你的文章看完了如果还在问这个问题。。。
oykwelcome 2011-06-09
  • 打赏
  • 举报
回复
我用下面这段代码可以收到数据:
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却不行
oykwelcome 2011-06-09
  • 打赏
  • 举报
回复
觉得是这段代码出了问题:
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
怎么改啊
jiangqinggao 2011-06-09
  • 打赏
  • 举报
回复
对,先看数据收到没,再考虑绘图, 绘图可以用C# 自带。
mjp1234airen4385 2011-06-09
  • 打赏
  • 举报
回复
在串口接收数据的函数里,先判断有没有数据,有的话再接收,
直接接收数据当然会出现问题。
另外串口的配置也要注意。看看波特率、奇偶校验、停止位等等是不是和设备的参数相同。
另外如果你的电脑串口是usb转的串口,也许也会有问题。
你可以先找个串口调试助手来试试,能不能接受到数据。
oykwelcome 2011-06-09
  • 打赏
  • 举报
回复
是不是draw()函数有问题啊
oykwelcome 2011-06-09
  • 打赏
  • 举报
回复
可是画图也不能显示啊
yang1216 2011-06-09
  • 打赏
  • 举报
回复
http://blog.csdn.net/wuyazhe/category/695097.aspx
oykwelcome 2011-06-09
  • 打赏
  • 举报
回复
可以详细点不,我C#不是很熟
yang1216 2011-06-09
  • 打赏
  • 举报
回复
int bytes = serialPort.BytesToRead;
buffer = new byte[bytes];
serialPort.Read(buffer, 0, bytes);
不要ArrayList,用List
list.AddRange(buffer);
oykwelcome 2011-06-09
  • 打赏
  • 举报
回复
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();
}));
}

我这样改了后可以收到数据了。但是怎么把串口的数据给 “ArrayList data = new ArrayList();”
并正确收到显示画图呢

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧