【c#串口程序开发】| 代码+思路+问题总结

串口程序开发
1. 串口程序界面
2. 串口开发步骤
3. 问题总结
4. 涉及到技术
*

串口程序界面

在这里插入图片描述

串口开发步骤

1、新建一个串口对象

private SerialPort port = new SerialPort();`

2、获取串口的参数

 //获取com
 string[] portname = SerialPort.GetPortNames();
 for (int i = 0; i < portname.Length; i++)
            {
                cmb_com.Items.AddRange(SerialPort.GetPortNames());
            }
//获取波特率,以下两种写法都可以
//cmb_potelv.Items.Add("9600");
int potrlv = port.BaudRate;
//获取数据位、校验位、停止位和获取波特率方法一样,此处不在写

3、开启串口

//判断串口打开情况
if(!port.IsOpen)
{
	port.Open();
}

4、获取电子秤返回的数据

//a、利用委托、事件来接收返回数据
//b、定义一个委托
//c、创建方法
//d、实例化委托的对象
//e、将委托的对象与方法关联起来

///
 //声明委托
delegate void UpdateTextEventHandler(string text);
//创建委托对象
UpdateTextEventHandler updateText; 
//创建接收返回数据的方法,serialPort有一个接收方法的事件
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (!sp_open_flag)
            {
                MessageBox.Show("请先连接!");
                return;
            }

            //线程休息时间
            System.Threading.Thread.Sleep(500);
            string receiveStr = "";
            try
            {
                isReceiving = true;
                //接收数据
                receiveStr = port.ReadExisting();
                //需要对收到的数据格式去处理
            }
            catch (Exception ee)
            {
                MessageBox.Show(ee.Message + "请待秤保持为稳定时开始称重!");
                isReceiving = false;
            }
            finally
            {
                isReceiving = false;
            }


public void ChangeText(string sdzyhzData)
        {
            tb_hand_afweight.Text = sdzyhzData;
            try
            {
                if (!recestrArr[1].Contains("ST,+") || !recestrArr[1].Contains(" "))
                {
                    return;
                }
                Double actual_injectValue = Convert.ToDouble(tb_hand_afweight.Text) - Convert.ToDouble(tb_injeect_bfweight_1.Text);
                tb_actual_injectValue.Text = actual_injectValue.ToString();
            }
            catch (Exception ee)
            {
                 //问题出在这里
                //MessageBox.Show(ee.Message);
            }
        }
//将委托对象和实现方法相互连接
updateText = ChangeText;
//事件绑定
this.port.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort_DataReceived);
5、向电子秤发送数据
6*********关闭串口连接**********
//问题一:当我连接未关闭时,上传一次数据后,程序就会一直不停报错:输入字符格式有误,我初始以为是我对接收的数据没有处理好,导致。经过排查后,发现当我未关闭连接时,他会一直调用changText方法,而我用弹框方式去处理这个问题,所以导致不断接收数据不断弹出提示框导致程序崩溃。解决办法就是将messageBox.show()这个方法去掉了
//问题二:原先我以为关闭串口只需要向对数据库操作开启关闭一样,直接用port.Close();但是,这么直接关闭串口连接的后果就是程序出现假死状态。
//百度了一下之后,给出的解释是:原本串口接收事件中含有invoke来执行委托:Invoke()当你直接关闭串口连接时,其他进程比如接收、发送进程还在接收数据,   这种方式会阻塞当前的线程,会阻塞串口的关闭,从而造成程序假死状态。
解决方法:
//采用线程的轮询模式,BeginInvoke开启线程后,调用EndInvoke来处理结果
IActionResult iar = tb_hand_afweight.BeginInvoke(updateText, afWeight.ToString());//开线程,串口线程,获取电子秤补液后数据



//关闭连接完整代码
        private void btn_close_Click(object sender, EventArgs e)
        {
            try
            {
                if (sp_open_flag == false)
                {
                    MessageBox.Show("当前未打开连接,无需关闭!");
                    return;
                }
                //线程的轮询模式,BeginInvoke开启线程后,调用EndInvoke来处理结果
                while (!iar.IsCompleted)
                {
                    //未完成,执行下面的语句
                    sp_open_flag = false;
                }
                //执行完成调用EndInvoke获取结果
                tb_hand_afweight.EndInvoke(iar);
                //如果直接关闭串口,会造成程序假死,关闭串口前需要先等待其他发送、接受信息的线程先完成当前线程操作次啊能关闭串口程序
                //while (isReceiving) Application.DoEvents();
                if (sp_open_flag == true)
                {
                    port.Close();
                    port.Dispose();
                }
                sp_open_flag = false;
}
### 问题总结
1、接收不到电子秤发送的数据
2、关闭连接假死
3、解决问题1后,在线程部署程序时,电子秤与电脑连接,接收不到数据(原因:串口线插错了,气死)
#### 涉及技术


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值