Winform 串口通讯之地磅
继上次的读卡之后,要做一个地磅的读取。
下面是我在读卡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 串口通讯之地磅的更多相关文章
- Winform 串口通讯之读卡器
老板给我的第一个硬件就是一个读卡器, 说让我做一下试试,于是从网上查了查就写了出来,相当的简单. 但是后来还有一个地磅的串口通讯,我整整搞了一天. 在窗体类的构造函数中写入 Form.CheckFor ...
- WinForm—串口通讯
ialPort(串行端口资源) 常用属性: BaudRate 此串行端口上要使用的波特率 DataBits 每发送/接收一个字节的数据位数目 DtrEnable 在通讯过程中是否启用数据终端就绪(St ...
- C#串口通讯
本文提供一个用C#实现串口通讯实例,亲自编写,亲测可用! 开发环境:VS2008+.net FrameWork3.5(实际上2.0应该也可以) 第一步 创建一个WinForm窗体,拉入一些界面元素 重 ...
- C#串口通讯概念以及简单实现
最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可 ...
- 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现
目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ...
- C#串口通讯实例
本文参考<C#网络通信程序设计>(张晓明 编著) 程序界面如下图: 参数设置界面代码如下: using System; using System.Collections.Generic; ...
- delphi之动态库调用和串口通讯
串口通讯: Spcomm 控件属性: CommName :表示COM1,COM2等串口的名字: BaudRate:设定波特率9600,4800等 StartComm StopComm 函数Write ...
- 用SPCOMM 在 Delphi中实现串口通讯 转
用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...
- 西门子plc串口通讯方式
西门子plc串口通讯的三种方式 时间:2015-10-25 14:31:55编辑:电工栏目:西门子plc 导读:西门子plc串口通讯的三种方式,分为RS485 串口通信.PPI 通信.MPI 通信,自 ...
随机推荐
- POJ 3164 Command Network ( 最小树形图 朱刘算法)
题目链接 Description After a long lasting war on words, a war on arms finally breaks out between littlek ...
- Linux基础-软硬连接Block概念
建立/etc/passwd的软连接文件,放在/tmp目录下 使用文件名方式建立的软连接可以跨分区,删除目标文件后,软连接文件失效 建立/etc/passwd的硬链接文件,放在/boot下,如果不成功, ...
- input 输入框 propertychange
做搜索功能的时候,经常遇到输入框检查的需求,最常见的是即时搜索,今天好好小结一下. 即时搜索的方案: (1)change事件 触发事件必须满足两个条件: a)当前对象属性改变,并且是由键盘或鼠标 ...
- MIUI7,Android版本5.0.2,一个程序发送自定义广播,另一个程序没有接收到
对照<第一行代码——Android>进行学习,第五章中说到广播包的相关知识,前面获取广播等程序例程都可以跑的通,但是在5.3.2节中,程序A发送自定义广播,并接收自定义广播,同时程序B也接 ...
- ansible的几点记录
user模块的password加密 ansible中user模块的password需要传入加密数据,可以通过这种方式快速加密: To get a sha512 password hash (rando ...
- elasticsearch5.5
1.不能以root用户运行 groupadd es #增加es组 useradd es -g es -p pwd #增加es用户并附加到es组 chown -R e ...
- (一)问候 HttpClient
第一节: HttpClient 简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并 ...
- 配置sql server 2000以允许远程访问
配置sql server 2000以允许远程访问适合故障:1. 用sql企业管理器能访问sql server 2000(因为它是采用命名管道(named pipes)方式进行方式),但用ado.net ...
- 大家来探讨下,IRepository 应该怎么定义?
ORM已EF为例子:我见的最多的是泛型的IRepository, public partial interface IRepository<T> where T : BaseEntity{ ...
- java根据日期获取周几和获取某段时间内周几的日期
整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...