C# 串口接收数据为什么特别慢

guojiaqi4 2012-08-15 11:11:37
本人自己C#写的一个串口程序,本来想用它来实时显示波形的,但是串口接收数据的时候太慢了。程序是在串口收到数据时候richtext上输出字符,115200的波特率发现每秒钟只能输出十几个“er”字符。但是用网上下的一个串口调试器,每秒钟能输出上百个字符。这是什么原因?底层的问题么?

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{

int pix_index;
bool recived=false;
int[] buff = new int[13];
int sw=1;
int index = 0;
List<float> AccX = new List<float>();
List<float> AccY = new List<float>();
List<float> AccZ = new List<float>();
List<float> GyroX = new List<float>();
List<float> GyroY = new List<float>();
List<float> GyroZ = new List<float>();
List<float> X = new List<float>();
public Form1()
{
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
string[] port = null;
try
{
port = SerialPort.GetPortNames();

}
catch (Exception ex)
{
throw new Exception("获取计算机COM口列表失败!\r\n错误信息:" + ex.Message);
}

comboBox1.Items.AddRange(port);

}

private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "连接")
{
serialPort1.PortName = (string)comboBox1.SelectedItem;
try
{
serialPort1.Open();
}
catch (Exception ex)
{
MessageBox.Show("打开出错");
}
}
else
{
button1.Text = "连接";
serialPort1.Close();
}

if (serialPort1.IsOpen)
{
button1.Text = "已连接";
zGraph1.f_ClearAllPix();
zGraph1.f_reXY();
zGraph1.f_LoadOnePix(ref X, ref GyroX, Color.Red, 2);//增加一条曲线
zGraph1.f_AddPix(ref X, ref GyroY,Color.Blue,2);
zGraph1.f_AddPix(ref X, ref GyroZ, Color.Yellow, 2);
zGraph1.f_AddPix(ref X, ref AccX, Color.Green, 2);
zGraph1.f_AddPix(ref X, ref AccY, Color.White, 2);
zGraph1.f_AddPix(ref X, ref AccZ, Color.Lime, 2);

}
}

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int tmp;
//tmp = serialPort1.ReadByte();
richTextBox1.AppendText("er ");

//switch(sw)
//{
// case 1 :
// if (tmp == 0x3f)
// sw=2;
// break;
// case 2:
// if (tmp == 0xee)
// sw = 3;
// else
// sw = 1;
// break;
// case 3:
// buff[index] = tmp;

// index++;
// if (index == 12)
// {
// index = 0;
// sw = 1;

// recived = true;
// }
// break;
//}

// if (recived)
// {
// X.Add(pix_index++);//X轴增加
// recived = false;
// GyroX.Add((short)(buff[0] << 8) + buff[1]);
// GyroY.Add((short)(buff[2] << 8) + buff[3]);
// GyroZ.Add((short)(buff[4] << 8) + buff[5]);
// AccX.Add((short)(buff[6] << 8) + buff[7]);
// AccY.Add((short)(buff[8] << 8) + buff[9]);
// AccZ.Add((short)(buff[10] << 8) + buff[11]);
// zGraph1.Refresh();//刷新显示

// richTextBox1.Text += (short)((buff[0] << 8) + buff[1]);
// richTextBox1.Text += " ";
// richTextBox1.Text += (short)((buff[2] << 8) + buff[3]);
// richTextBox1.Text += " ";
// richTextBox1.Text += (short)((buff[4] << 8) + buff[5]);
// richTextBox1.Text += " ";
// richTextBox1.Text += (short)((buff[6] << 8) + buff[7]);
// richTextBox1.Text += " ";
// richTextBox1.Text += (short)((buff[8] << 8) + buff[9]);
// richTextBox1.Text += " ";
// richTextBox1.Text += (short)((buff[10] << 8) + buff[11]);
// richTextBox1.Text += " ";
//// richTextBox1.Text += buff[12];
// // richTextBox1.Text += "\r\n";
// richTextBox1.AppendText("\r\n");
// richTextBox1.ScrollToCaret();
// }



}

private void button2_Click(object sender, EventArgs e)
{
zGraph1.f_ClearAllPix();//清除所有
}


}
}
...全文
1283 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
guojiaqi4 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:

引用 7 楼 的回复:

引用 6 楼 的回复:

引用 5 楼 的回复:

你的串口写数据 的代码在哪?

我用不到写数据,只是读数据就很慢
在DataReceiced事件里 添加Thread.sleep(100)试试

恩,我晚上回去试试,这个主要作用是什么?
使线程池中负责接收串口数据的线程休眠100毫秒,作用是分离每次接收到的……
[/Quote]
恩,谢谢,晚上回去试下
sj490790083 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 7 楼 的回复:

引用 6 楼 的回复:

引用 5 楼 的回复:

你的串口写数据 的代码在哪?

我用不到写数据,只是读数据就很慢
在DataReceiced事件里 添加Thread.sleep(100)试试

恩,我晚上回去试试,这个主要作用是什么?
[/Quote]使线程池中负责接收串口数据的线程休眠100毫秒,作用是分离每次接收到的数据,防止阻塞吧,个人理解,不知道对不对,希望能帮到你
guojiaqi4 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 的回复:

引用 5 楼 的回复:

你的串口写数据 的代码在哪?

我用不到写数据,只是读数据就很慢
在DataReceiced事件里 添加Thread.sleep(100)试试
[/Quote]
恩,我晚上回去试试,这个主要作用是什么?
sj490790083 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

你的串口写数据 的代码在哪?

我用不到写数据,只是读数据就很慢
[/Quote]在DataReceiced事件里 添加Thread.sleep(100)试试
guojiaqi4 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

你的串口写数据 的代码在哪?
[/Quote]
我用不到写数据,只是读数据就很慢
sj490790083 2012-08-16
  • 打赏
  • 举报
回复
你的串口写数据 的代码在哪?
guojiaqi4 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

232还是485协议?应该是硬件自身问题
[/Quote]
232,不是硬件问题,用串口调试器接收数据飞快
guojiaqi4 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你把代码优化一下嘛
[/Quote]
怎么优化?初学C#,求指教
sj490790083 2012-08-16
  • 打赏
  • 举报
回复
232还是485协议?应该是硬件自身问题
billlyh 2012-08-16
  • 打赏
  • 举报
回复
你把代码优化一下嘛
guojiaqi4 2012-08-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 8 楼 的回复:

引用 7 楼 的回复:

引用 6 楼 的回复:

引用 5 楼 的回复:

你的串口写数据 的代码在哪?

我用不到写数据,只是读数据就很慢
在DataReceiced事件里 添加Thread.sleep(100)试试

恩,我晚上回去试试,这个主要作用是什么?
使线程池中负责接收串口数据的线程休眠100毫秒,作用是分离每次接收到的……
[/Quote]

刚刚试了一下,还是没用

110,524

社区成员

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

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

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