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 通信,自 ...
随机推荐
- HDU 2102 A计划 (深搜)
题目链接 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主 ...
- Dream------scala--Tuple、Array、Map与文件操作
1.Tuple(元组) 一般使用中,假设一个函数返回多个值,我们可以使用tuple接受这个(val (x,y) = myfunction) package com.wls.scala.hello /* ...
- 【codeforces】【比赛题解】#854 CF Round #433 (Div.2)
cf一如既往挺丧 看丧题点我! [A]分数 Petya是数学迷,特别是有关于分数的数学.最近他学了所谓一个分数被叫做“真分数”当且仅当其分子小于分母,而一个分数被叫做“最简分数”当且仅当其分子分母互质 ...
- verilog中wire与reg类型的区别
每次写verilog代码时都会考虑把一个变量是设置为wire类型还是reg类型,因此把网上找到的一些关于这方面的资料整理了一下,方便以后查找. wire表示直通,即只要输入有变化,输出马上无条件地反映 ...
- spin_lock & mutex_lock的区别? 【转】
转自:http://blog.csdn.net/wilsonboliu/article/details/19190861 本文由该问题引入到内核锁的讨论,归纳如下 为什么需要内核锁? 多核处理器下 ...
- O_NONBLOCK与O_NDELAY有何不同?
O_NONBLOCK和O_NDELAY所产生的结果都是使I/O变成非搁置模式(non-blocking),在读取不到数据或是写入缓冲区已满会马上return,而不会搁置程序动作,直到有数据或写入完成. ...
- Java 并发--线程创建
随着处理器的多核化,为提高处理器的资源利用率应用程序的并发变应运而生了.现在的操作系统是多任务操作系统,多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的内存空间 ...
- linux查看内存、CPU占用资源最多的进程
[内存占用] #利用ps命令,默认使用ps参数会显示的结果 ps -aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 ...
- MyEclipse文本对比界面样式修改
MyEclipse刚安装好,使用文件对比的时候,发现两边的对比颜色非常浅,不同的地方不容易发现,可以通过以下配置将显示颜色调深一点. 配置 效果
- 神经网络中的激活函数tanh sigmoid RELU softplus softmatx
所谓激活函数,就是在神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端.常见的激活函数包括Sigmoid.TanHyperbolic(tanh).ReLu. softplus以及softma ...