首先介绍一下项目:
项目是在一台win7 32位系统的电子秤上开发的。功能是现实,从数据库中读取商品的价格,然后用C#代码读出com口的重量数据,计算出价格,并打印出来。
错误界面如下,每当用了1个小时左右,点击取商品的重量就报错。如下图:
然后代码如下:
1、声明的变量
SerialPort serialPort1 = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One); //初始化串口设置
public delegate void Displaydelegate(byte[] InputBuf);
Byte[] OutputBuf = new Byte[128];
public Displaydelegate disp_delegate;
private bool Listening = false;//是否没有执行完invoke相关操作
private bool Closing = false;//是否正在关闭串口,执行Application.DoEvents,并阻止再次invoke
private static int nums = 0;
private string lyzf;
private static int kaiguan = 1;
2、点击item的代码
//点击item
private void listView1_MouseClick(object sender, MouseEventArgs e)
{
if(kaiguan==1)
{
kaiguan = 0;
try
{
Closing = true;
while (Listening) Application.DoEvents();
//打开时点击,则关闭串口
serialPort1.Close();
Closing = false;
}
catch
{
serialPort1 = new SerialPort("COM2", 9600, Parity.None, 8, StopBits.One);
//关闭并口时发生异常,不用再次打开
}
//System.Threading.Thread.Sleep(100);
decimal zl = 0.0m;
Decimal.TryParse(label5.Text, out zl);
if (zl>0&&zl < 10)
{
ListViewHitTestInfo info = listView1.HitTest(e.X, e.Y);
if (info.Item != null)
{
Frm_QueRen f3 = new Frm_QueRen(info.Item.SubItems[1].Text.ToString(), info.Item.SubItems[2].Text.ToString(), info.Item.SubItems[3].Text.ToString(), info.Item.SubItems[4].Text.ToString(), info.Item.SubItems[5].Text.ToString(), info.Item.SubItems[6].Text.ToString(), zl, label11.Text, info.Item.SubItems[7].Text.ToString(), info.Item.SubItems