继上次的读卡之后,要做一个地磅的读取。

下面是我在读卡Demo上改的读取地磅的。

地磅是一直向串口发送数据的,所以需要截取数据来一直判断数据是否合法,然后计算出结果。

其中遇到了一个小问题,文末有介绍。

本人初学菜鸟,大牛们有意见欢迎评论。

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading; namespace WindowsFormsApplicationcs
{
public partial class FormMain : Form
{
//声明端口对象
SerialPort myport = null;
//处理数据的数据数组
byte[] buf = new byte[];
//声明委托类型
public delegate void Displaydelegate(byte[] buf);
//委托变量
public Displaydelegate disp_delegate; public FormMain()
{
InitializeComponent();
//安全线程外更新空间
//Form.CheckForIllegalCrossThreadCalls = false;
} //窗口加载
private void FormMain_Load(object sender, EventArgs e)
{
Form.CheckForIllegalCrossThreadCalls = false;
txtPort.Text = "COM3";
myport = new SerialPort();
disp_delegate = new Displaydelegate(DispUI);
} //打开串口按钮
private void button1_Click(object sender, EventArgs e)
{
try
{ //设置串口端口
myport.PortName = txtPort.Text.ToString();
//设置比特率
myport.BaudRate = Convert.ToInt32(cmbBaud.Text);
//设置数据位
myport.DataBits = Convert.ToInt32(cmbBits.Text);
//设置停止位
switch (cmbStopBits.SelectedIndex)
{
case : myport.StopBits = StopBits.None; break;
case : myport.StopBits = StopBits.One; break;
case : myport.StopBits = StopBits.OnePointFive; break;
case : myport.StopBits = StopBits.Two; break;
} //设置奇偶校验位
switch (cmbParity.SelectedIndex)
{
case : myport.Parity = Parity.Even; break;
case : myport.Parity = Parity.Mark; break;
case : myport.Parity = Parity.None; break;
case : myport.Parity = Parity.Odd; break;
case : myport.Parity = Parity.Space; break;
} //缓冲区只接受一个字符
myport.ReceivedBytesThreshold = ;
//接收事件添加委托
myport.DataReceived += new SerialDataReceivedEventHandler(this.myport_DataReceived);
//打开串口
myport.Open();
if (myport.IsOpen)
{
MessageBox.Show("端口已打开");
this.tstldqzt.Text = "当前状态:端口已打开";
}
else
{
MessageBox.Show("端口未能打开!");
}
}
catch (Exception ex)
{
MessageBox.Show("端口打开出现错误!\n" + ex.Message.ToString());
}
} //委托方法
//接收数据
private void myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep();
if (myport.BytesToRead > )//如果缓冲区内有数据
{
myport.Read(buf, , );//从缓冲区读取数据到buf暂存数组,
} if (buf[] == 0x02)//如果开头等于2,则表明是信息开始 0x02
{
try
{
while (myport.BytesToRead == );
myport.Read(buf, , );//从缓冲区读取一条正确数据到buf暂存数组
string s = string.Empty; for (int i = ; i < ; i++)
{
s += (char)buf[i];
} StringBuilder b = new StringBuilder(""); if (s.Substring(, ) == "-")
b.Append("-"); int strint = Convert.ToInt32(s.Substring(,));
int dianint = Convert.ToInt32(s.Substring(,)); switch (dianint)
{
case : strint = strint / ; break;
case : strint = strint / ; break;
case : strint = strint / ; break;
case : strint = strint / ; break;
}
b.Append(strint);
txtReceive.Text += "开始" + b + "结束\r\n"; //this.Invoke(disp_delegate, buf);
}
finally
{
myport.DiscardInBuffer();//清空缓冲区
}
}
} //更新ui方法
public void DispUI(byte[] buf)
{ } //关闭方法
private void button2_Click(object sender, EventArgs e)
{
myport.Close();
if (!myport.IsOpen)
{
this.tstldqzt.Text = "当前状态:端口已关闭";
MessageBox.Show("端口已关闭");
}
} //清屏按钮
private void button3_Click(object sender, EventArgs e)
{
this.txtReceive.Clear();
} //菜单栏关于
private void tsmiabout_Click(object sender, EventArgs e)
{
frmAbout frmabout = new frmAbout();
frmabout.ShowDialog();
} //菜单栏保存结果
private void tsmisave_Click(object sender, EventArgs e)
{
if (this.txtReceive.Text == "")
{ MessageBox.Show("当前结果为空,请先测试"); }
string path = Directory.GetCurrentDirectory() + "\\端口测试结果.txt";
File.WriteAllText(path, this.txtReceive.Text.ToString(), Encoding.ASCII);
} }
}

这里其实有个问题,就是一个窗口一般会涉及到多个串口设备的通讯,

公司目前的需求也不例外,可以看到我使用了一个thread.sleep,

这样虽然当时解决了问题,但是当一个窗口有多个串口通讯更新ui的时候应该会出现问题,

但因为当时手头没有设备也没做进一步的测试,。

因为不加这句话就会无法实时更新ui,当时打了一个多小时的短点记了好多数据,

才确定了不是数据处理那部分的问题,思考一下原因应该是while把线程堵死了,一直在做运算。

但是使用invoke不是新开线程委托吗?为什么也是更新不了ui。

百度了发现如下解释

invoke是在拥有此控件的基础窗口句柄的线程上指定指定的委托

begininvoke是在创建此控件的基础窗口句柄的线程上异步执行指定的委托

使用begininvoke应该就可以不干扰其他的串口通讯更新ui了

Winform 串口通讯之地磅的更多相关文章

  1. Winform 串口通讯之读卡器

    老板给我的第一个硬件就是一个读卡器, 说让我做一下试试,于是从网上查了查就写了出来,相当的简单. 但是后来还有一个地磅的串口通讯,我整整搞了一天. 在窗体类的构造函数中写入 Form.CheckFor ...

  2. WinForm—串口通讯

    ialPort(串行端口资源) 常用属性: BaudRate 此串行端口上要使用的波特率 DataBits 每发送/接收一个字节的数据位数目 DtrEnable 在通讯过程中是否启用数据终端就绪(St ...

  3. C#串口通讯

    本文提供一个用C#实现串口通讯实例,亲自编写,亲测可用! 开发环境:VS2008+.net FrameWork3.5(实际上2.0应该也可以) 第一步 创建一个WinForm窗体,拉入一些界面元素 重 ...

  4. C#串口通讯概念以及简单实现

    最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可 ...

  5. 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现

    目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ...

  6. C#串口通讯实例

    本文参考<C#网络通信程序设计>(张晓明  编著) 程序界面如下图: 参数设置界面代码如下: using System; using System.Collections.Generic; ...

  7. delphi之动态库调用和串口通讯

    串口通讯: Spcomm 控件属性: CommName  :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...

  8. 用SPCOMM 在 Delphi中实现串口通讯 转

      用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...

  9. 西门子plc串口通讯方式

    西门子plc串口通讯的三种方式 时间:2015-10-25 14:31:55编辑:电工栏目:西门子plc 导读:西门子plc串口通讯的三种方式,分为RS485 串口通信.PPI 通信.MPI 通信,自 ...

随机推荐

  1. 59、synchronized同步代码块

    synchronized同步方法的问题 有些情况下,在方法上面加synchronized同步,会有性能问题.请看下面代码,来计算下两个线程执行的耗时: package com.sutaoyu.Thre ...

  2. 003_Mac挂载NTFS移动硬盘读取VMware虚拟机文件

    一.Mac 挂载NTFS移动硬盘进行读写操作 (Read-only file system) 注意如下图所示先卸载,然后按照下图的命令进行挂载.然后cd /opt/003_vm/   &&am ...

  3. openstack发展历程及其架构简介

    1.0 Openstack介绍 OpenStack既是一个社区,也是一个项目和一个开源软件,它提供了一个部署云的操作平台或工具集.其宗旨在于,帮助组织运行为虚拟计算或存储服务的云,为公有云.私有云,也 ...

  4. 使用mongoose操作mongodb数据库

    1.如何启动mongodb数据库 参考地址:http://www.runoob.com/mongodb/mongodb-window-install.html 在数据库安装的地方,bin文件夹,输入 ...

  5. .Net程序集强签名详解

    强签名: 1. 可以将强签名的dll注册到GAC,不同的应用程序可以共享同一dll. 2. 强签名的库,或者应用程序只能引用强签名的dll,不能引用未强签名的dll,但是未强签名的dll可以引用强签名 ...

  6. oracle一些笔记

    1.字符串类型字段 区分大小写 where table_name = 'MIDDLE' 2.execute immediate '' bulk collect into v_xxx_tab 3.列别名 ...

  7. 关于主键的设计、primary key

    主键:用于唯一标识一个表中一行数据. 外键:用于建立两个表之间的关系,A表中有一列是B表中的主键,那么A表中这列的数据就受到B表主键的约束. 那么关于主键应该如何设计呢,这里我说下优缺点: 1.用自动 ...

  8. Java @SuppressWarnings

    @SuppressWarnings() 注解以@开头可以接受参数 @SuppressWarnings("unchecked") 不受检查的警告信息应该被抑制 //: holding ...

  9. redis主从,哨兵(windows版)

    一.下载 由于redis官方并不支持windows操作系统,所以官网上是下不到的,需要到gitlab上下载,下载地址如下: https://github.com/MicrosoftArchive/re ...

  10. GreenPlum学习笔记:create table创建表

    二维表同样是GP中重要的存储数据对象,为了更好的支持数据仓库海量数据的访问,GP的表可以分成: 面向行存储的普通堆积表 面向列存储的AOT表(append only table) 当然AOT表也可以是 ...