请问用c#做上位机时,串口如果发送的数据够多的话程序会死机

jinwe888 2020-02-29 05:45:54
单片机用的是波特率9600,循环不停的发送AD模块转换的2个字节的数值。用上位机程序接收的数据都没问题,但是在上位机关闭串口后程序会失去响应。如果把单片机发送的速度调低到每秒发一次的话,上位机关闭串口后能正常关闭程序,请问这是什么原因啊?
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
int num = serialPort1.BytesToRead; //获取接收缓冲区中的字节数
byte[] received_buf = new byte[num]; //声明一个大小为num的字节数据用于存放读出的byte型数据

receive_count += num; //接收字节计数变量增加nun
serialPort1.Read(received_buf, 0, num); //读取接收缓冲区中num个字节到byte数组中

sb.Clear(); //防止出错,首先清空字符串构造器
//遍历数组进行字符串转化及拼接
foreach (byte b in received_buf)
{
sb.Append(b.ToString("X2")+' ');
}

//因为要访问UI资源,所以需要使用invoke方式同步ui
this.Invoke((EventHandler)(delegate
{
//label3.Text = serialPort1.ReadExisting() ;
textBox1.AppendText(sb.ToString());
}
)
);

}
catch (Exception ex)
{
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
MessageBox.Show(ex.Message);

}
}


private void button1_Click(object sender, EventArgs e)
{
try
{
//将可能产生异常的代码放置在try块中
//根据当前串口属性来判断是否打开
if (serialPort1.IsOpen)
{
//串口已经处于打开状态
serialPort1.Close(); //关闭串口
comboBox1.Enabled = true;
comboBox2.Enabled = true;
button1.Text = "连接";
}
else
{
//串口已经处于关闭状态,则设置好串口属性后打开
comboBox1.Enabled = false;
comboBox2.Enabled = false;
serialPort1.PortName = comboBox1.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
serialPort1.DataBits = 8;
serialPort1.Parity = System.IO.Ports.Parity.None;
serialPort1.StopBits = System.IO.Ports.StopBits.One;

serialPort1.Open(); //打开串口
button1.Text = "断开";
}
}
catch (Exception ex)
{
//捕获可能发生的异常并进行处理

//捕获到异常,创建一个新的对象,之前的不可以再用
serialPort1 = new System.IO.Ports.SerialPort();
//刷新COM口选项
comboBox1.Items.Clear();
comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
//响铃并显示异常给用户
System.Media.SystemSounds.Beep.Play();
button1.Text = "连接";
button1.BackColor = Color.ForestGreen;
MessageBox.Show(ex.Message);
comboBox1.Enabled = true;
comboBox2.Enabled = true;
}
}
...全文
394 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
groveer 2020-03-02
  • 打赏
  • 举报
回复
你上面那条语句就是根据接受大小来请求分配缓冲区 如果你确定每次都是1你也可以直接写1 我对plc不熟悉 但是之前跟我对接的plc工程师是可以一次发多个字节的
jinwe888 2020-02-29
  • 打赏
  • 举报
回复
还有一个问题想请教下。我现在用的PIC的8位单片机,每次发送的数据就只能是一个字节,而且看到别的单片机好像一次也只能发送一个字节。这样这条语句int num = serialPort1.BytesToRead;每次获取的就只是1,因为每收到一个字节就发生了一次中断,就样就没搞明白,接收缓冲区起什么作用啊?请帮忙指点下,谢谢了!
jinwe888 2020-02-29
  • 打赏
  • 举报
回复
找到答案了。换成this.BeginInvoke((EventHandler)就好了。
groveer 2020-02-29
  • 打赏
  • 举报
回复
我个人感觉微软原生的串口有些问题 之前我遇到过高频率通信占用CPU过高的问题 后来使用PComm.dll这个串口库 这个链接是我写好的,直接使用就行了,可以在AnyCpu下运行(其实也是网上找的,自己稍微改改封装一下而已) 反正我是感觉这个库是很好用的

110,545

社区成员

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

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

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