WPF内实现与串口发送数据和接收数据
与串口发送数据和接收数据,在此作一个简单的Demo.此Demo可以实现按下硬件按钮,灯亮,发送灯状态数据过来。并且可以实现几个灯同时亮,发送灯的状态数据过来。PC端实现点击按钮让硬件灯亮。
此处为4个灯,发送过来的数据:0代表暗,1代表亮。列如:1010代表1号灯和3号灯亮,2号和4号灯暗。
发送过去的数据:0代表1号灯亮,1代表1号灯灭、2代表2号灯亮,3代表2号灯灭、4代表3号灯亮,5代表3号灯灭、6代表4号灯亮,7代表4号灯灭。
布局代码:
<Grid>
<TextBox HorizontalAlignment="Left" Height="23" Margin="112,59,0,0" TextWrapping="Wrap" Name="txtSend" VerticalAlignment="Top" Width="120"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="112,113,0,0" TextWrapping="Wrap" Name="txtReceive" VerticalAlignment="Top" Width="120"/>
<Button Content="发送" Name="btnSend" HorizontalAlignment="Left" Margin="83,271,0,0" VerticalAlignment="Top" Width="35" Click="btnSend_Click"/>
<Button Content="发送" Name="btnSend1" HorizontalAlignment="Left" Margin="143,271,0,0" VerticalAlignment="Top" Width="35" Click="btnSend1_Click"/>
<Button Content="发送" Name="btnSend2" HorizontalAlignment="Left" Margin="203,271,0,0" VerticalAlignment="Top" Width="35" Click="btnSend2_Click"/>
<Button Content="发送" Name="btnSend3" HorizontalAlignment="Left" Margin="263,271,0,0" VerticalAlignment="Top" Width="35" Click="btnSend3_Click"/>
<Label Name="one" Background="Red" HorizontalAlignment="Left" Margin="84,190,0,0" VerticalAlignment="Top" Height="24" Width="28"/>
<Label Name="two" Background="Red" HorizontalAlignment="Left" Margin="144,190,0,0" VerticalAlignment="Top" Height="24" Width="28"/>
<Label Name="three" Background="Red" HorizontalAlignment="Left" Margin="204,190,0,0" VerticalAlignment="Top" Height="24" Width="28"/>
<Label Name="four" Background="Red" HorizontalAlignment="Left" Margin="264,190,0,0" VerticalAlignment="Top" Height="24" Width="28"/>
</Grid>
后台代码:
先
private SerialPort Sp = new SerialPort();
public delegate void HandleInterfaceUpdataDelegate(string text);
private HandleInterfaceUpdataDelegate interfaceUpdataHandle;
String[] arr = { "0", "0", "0", "0" };//用于存储硬件上面灯状态
其次在Loaded事件添加用于更改串口参数:
//更改参数
Sp.PortName = "COM3";
Sp.BaudRate = 115200;
Sp.Parity = Parity.None;
Sp.StopBits = StopBits.One;
编写监听和发送数据事件:
private void Serial()
{
Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);
if (!Sp.IsOpen)
{
Sp.Open();
}
//用字节的形式发送数据
SendBytesData(Sp);
}
//发送二进制数据
private void SendBytesData(SerialPort Sp)
{
byte[] bytesSend = System.Text.Encoding.Default.GetBytes(txtSend.Text);
Sp.Write(bytesSend, 0, bytesSend.Length);
}
public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
/* byte[] readBuffer = new byte[Sp.ReadBufferSize];
Sp.Read(readBuffer, 0, readBuffer.Length);
//Dispatcher.Invoke(interfaceUpdataHandle, new string[]{ Encoding.UTF8.GetString(readBuffer)});
Dispatcher.Invoke(interfaceUpdataHandle, new string[] { Encoding.ASCII.GetString(readBuffer) });
//Dispatcher.Invoke(interfaceUpdateHandle, new string[] { Encoding.ASCII.GetString(buf) });*/
SerialPort serialPort = (SerialPort)(sender);
System.Threading.Thread.Sleep(100);//延缓一会,用于防止硬件发送速率跟不上缓存数据导致的缓存数据杂乱
int n = serialPort.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
//received_count += n;//增加接收计数
serialPort.Read(buf, 0, n);//读取缓冲数据
//因为要访问ui资源,所以需要使用invoke方式同步ui
interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象
// Dispatcher.Invoke(interfaceUpdateHandle, new string[] { Encoding.ASCII.GetString(buf) });
Dispatcher.Invoke(interfaceUpdataHandle, new string[] { Encoding.ASCII.GetString(buf) });
//serialPort.Close();
}
private void UpdateTextBox(string text)
{
txtReceive.Text = text;
String Receive = Convert.ToString(text);
if (Receive != "")
{
// MessageBox.Show("receive", Receive);
String Receive1 = Receive.Substring(0, 1);
String Receive2 = Receive.Substring(1, 1);
String Receive3 = Receive.Substring(2, 1);
String Receive4 = Receive.Substring(3, 1);
if (Receive1 == 1.ToString())
{
one.Background = new SolidColorBrush(Colors.MediumAquamarine);
arr[0] = 1.ToString();
}
else
{
one.Background = new SolidColorBrush(Colors.Red);
arr[0] = 0.ToString();
}
if (Receive2 == 1.ToString())
{
two.Background = new SolidColorBrush(Colors.MediumAquamarine);
arr[1] = 1.ToString();
}
else
{
two.Background = new SolidColorBrush(Colors.Red);
arr[1] = 0.ToString();
}
if (Receive3 == 1.ToString())
{
three.Background = new SolidColorBrush(Colors.MediumAquamarine);
arr[2] = 1.ToString();
}
else
{
three.Background = new SolidColorBrush(Colors.Red);
arr[2] = 0.ToString();
}
if (Receive4 == 1.ToString())
{
four.Background = new SolidColorBrush(Colors.MediumAquamarine);
arr[3] = 1.ToString();
}
else
{
four.Background = new SolidColorBrush(Colors.Red);
arr[3] = 0.ToString();
}
//String abc = Convert.ToString(arr);
//MessageBox.Show("abc", abc);
// MessageBox.Show("arr", arr);
}
}
最后button点击事件添加:
private void btnSend_Click(object sender, RoutedEventArgs e)
{
if (arr[0] == 0.ToString())
{
txtSend.Text = "0";
Serial();
}
else
{
txtSend.Text = "1";
Serial();
}
}
private void btnSend1_Click(object sender, RoutedEventArgs e)
{
if (arr[1] == 0.ToString())
{
txtSend.Text = "2";
Serial();
}
else
{
txtSend.Text = "3";
Serial();
}
}
private void btnSend2_Click(object sender, RoutedEventArgs e)
{
if (arr[2] == 0.ToString())
{
txtSend.Text = "4";
Serial();
}
else
{
txtSend.Text = "5";
Serial();
}
}
private void btnSend3_Click(object sender, RoutedEventArgs e)
{
if (arr[3] == 0.ToString())
{
txtSend.Text = "6";
Serial();
}
else
{
txtSend.Text = "7";
Serial();
}
}
要想在程序开始时就可以监听数据,在其Loaded里面添加上: Serial();
完整后台代码:
public partial class MainWindow : Window
{
private SerialPort Sp = new SerialPort();
public delegate void HandleInterfaceUpdataDelegate(string text);
private HandleInterfaceUpdataDelegate interfaceUpdataHandle;
String[] arr = { "0", "0", "0", "0" };//用于存储硬件上面灯状态
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//更改参数
Sp.PortName = "COM3";
Sp.BaudRate = 115200;
Sp.Parity = Parity.None;
Sp.StopBits = StopBits.One;
Serial();
}
private void btnSend_Click(object sender, RoutedEventArgs e)
{
if (arr[0] == 0.ToString())
{
txtSend.Text = "0";
Serial();
}
else
{
txtSend.Text = "1";
Serial();
}
}
private void btnSend1_Click(object sender, RoutedEventArgs e)
{
if (arr[1] == 0.ToString())
{
txtSend.Text = "2";
Serial();
}
else
{
txtSend.Text = "3";
Serial();
}
}
private void btnSend2_Click(object sender, RoutedEventArgs e)
{
if (arr[2] == 0.ToString())
{
txtSend.Text = "4";
Serial();
}
else
{
txtSend.Text = "5";
Serial();
}
}
private void btnSend3_Click(object sender, RoutedEventArgs e)
{
if (arr[3] == 0.ToString())
{
txtSend.Text = "6";
Serial();
}
else
{
txtSend.Text = "7";
Serial();
}
}
private void Serial()
{
Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);
if (!Sp.IsOpen)
{
Sp.Open();
}
//用字节的形式发送数据
SendBytesData(Sp);
}
//发送二进制数据
private void SendBytesData(SerialPort Sp)
{
byte[] bytesSend = System.Text.Encoding.Default.GetBytes(txtSend.Text);
Sp.Write(bytesSend, 0, bytesSend.Length);
}
public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
/* byte[] readBuffer = new byte[Sp.ReadBufferSize];
Sp.Read(readBuffer, 0, readBuffer.Length);
//Dispatcher.Invoke(interfaceUpdataHandle, new string[]{ Encoding.UTF8.GetString(readBuffer)});
Dispatcher.Invoke(interfaceUpdataHandle, new string[] { Encoding.ASCII.GetString(readBuffer) });
//Dispatcher.Invoke(interfaceUpdateHandle, new string[] { Encoding.ASCII.GetString(buf) });*/
SerialPort serialPort = (SerialPort)(sender);
System.Threading.Thread.Sleep(100);//延缓一会,用于防止硬件发送速率跟不上缓存数据导致的缓存数据杂乱
int n = serialPort.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
//received_count += n;//增加接收计数
serialPort.Read(buf, 0, n);//读取缓冲数据
//因为要访问ui资源,所以需要使用invoke方式同步ui
interfaceUpdataHandle = new HandleInterfaceUpdataDelegate(UpdateTextBox);//实例化委托对象
// Dispatcher.Invoke(interfaceUpdateHandle, new string[] { Encoding.ASCII.GetString(buf) });
Dispatcher.Invoke(interfaceUpdataHandle, new string[] { Encoding.ASCII.GetString(buf) });
//serialPort.Close();
}
private void UpdateTextBox(string text)
{
txtReceive.Text = text;
String Receive = Convert.ToString(text);
if (Receive != "")
{
// MessageBox.Show("receive", Receive);
String Receive1 = Receive.Substring(0, 1);
String Receive2 = Receive.Substring(1, 1);
String Receive3 = Receive.Substring(2, 1);
String Receive4 = Receive.Substring(3, 1);
if (Receive1 == 1.ToString())
{
one.Background = new SolidColorBrush(Colors.MediumAquamarine);
arr[0] = 1.ToString();
}
else
{
one.Background = new SolidColorBrush(Colors.Red);
arr[0] = 0.ToString();
}
if (Receive2 == 1.ToString())
{
two.Background = new SolidColorBrush(Colors.MediumAquamarine);
arr[1] = 1.ToString();
}
else
{
two.Background = new SolidColorBrush(Colors.Red);
arr[1] = 0.ToString();
}
if (Receive3 == 1.ToString())
{
three.Background = new SolidColorBrush(Colors.MediumAquamarine);
arr[2] = 1.ToString();
}
else
{
three.Background = new SolidColorBrush(Colors.Red);
arr[2] = 0.ToString();
}
if (Receive4 == 1.ToString())
{
four.Background = new SolidColorBrush(Colors.MediumAquamarine);
arr[3] = 1.ToString();
}
else
{
four.Background = new SolidColorBrush(Colors.Red);
arr[3] = 0.ToString();
}
//String abc = Convert.ToString(arr);
//MessageBox.Show("abc", abc);
// MessageBox.Show("arr", arr);
}
}
}
这样可以实现btn和硬件本身按钮同时控制灯亮灯灭。
若转载请注明转载处。
WPF内实现与串口发送数据和接收数据的更多相关文章
- Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据
1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ...
- Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据
1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源 UDP协议接 ...
- STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题
STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ...
- 如何使用python内置的request发送JSON格式的数据
使用步骤如下: 一.如果想发送json格式的数据,需要使用request模块中的Request类来创建对象,作为urlopen函数的参数 二.header中添加content-type为applica ...
- Java Socket 服务端发送数据 客户端接收数据
服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 ...
- 说说ajax上传数据和接收数据
我是一个脑袋不太灵光的人,所以遇到问题,厚着脸皮去请教大神的时候,害怕被大神鄙视,但是还是被鄙视了.我说自己不要点脸面,那是不可能的,但是,为了能让自己的技术生涯能走的更长远一些,受点白眼,受点嘲笑也 ...
- MVC系列学习(五)-传递数据 与 接收数据
1.控制器向视图传递数据 a.使用ViewData b.使用ViewBag c.使用Model 方式二: d.使用TempData 2.为什么在控制器中设置了一些属性,在视图中可以接受 3.Actio ...
- ESP8266服务器模式 发送数据和接收数据 模板1
功能如下: 1.将客户端发来的数据转发到串口:2.串口数据转发给所有客户端3.可连接4个客户端4.可设置静态IP地址5.指示灯闪烁表示无客户端连接,灯亮代表有客户端连接 /** 功能: 1.将客户端发 ...
- ASP.NET 最全的POST提交数据和接收数据 —— (1) 用url传参方式
//1.对象提交,字典方式 //接口方:public ActionResult GetArry(Car model) public void PostResponse() { HttpWebReque ...
随机推荐
- VS提示SurfFeatureDetector不是cv的成员函数 .
原因:没有把 opencv_nonfree243d.lib 加入lib库中. 还有两个头文件:#include <opencv2/nonfree/features2d.hpp>#inclu ...
- 使用ionic3快速开发webapp(一)
Ionic可以让我们使用web技术快速构建接近原生体验的跨平台移动应用. 一.安装ionic 1.需要先安装 Node.js(版本8.x之上): 2.安装cordova 和 ionic: $ npm ...
- Android多线程研究(9)——线程锁Lock
在前面我们在解决线程同步问题的时候使用了synchronized关键字,今天我们来看看Java 5.0以后提供的线程锁Lock. Lock接口的实现类提供了比使用synchronized关键字更加灵活 ...
- target属性值
有 4 个保留的目标名称用作特殊的文档重定向操作: _blank 浏览器总在一个新打开.未命名的窗体中加载目标文档. _self 这个目标的值对全部没有指定目标的 <a> 标签是默认目标, ...
- Java8获取参数名及Idea/Eclipse/Maven配置
在Java8之前,代码编译为class文件后,方法参数的类型固定,但是方法名称会丢失,方法名称会变成arg0.arg1.....而现在,在Java8开始可以在class文件中保留参数名,这就给反射带来 ...
- C#-numericUpDown-数字选择---ShinePans
program.cs using System; using System.Collections.Generic; using System.Linq; using System.Windows.F ...
- 简体和繁体加起来有六七万个汉字,所以Unicode只能排除一些几乎不用的汉字,Unicode编码的熟悉与研究过程(内附全部汉字编码列表)
我有一个问题是:是不是会有个别汉字无法在Unicode下表示,这种情况下就不能完全显示了? 各种编码查询表:http://bm.kdd.cc/ ---------------------------- ...
- LUOGU 1525 关押罪犯 - 并查集拆点(对立点) / 二分+二分图染色
传送门 分析: 并查集: 第一步先将所有矛盾从大至小排序,显然先将矛盾值大的分成两部分会更优. 普通的并查集都只能快速合并两个元素至同一集合,却不能将两个元素分至不同集合. 对于将很多数分成两个集合, ...
- 前端,Java,产品经理,微信小程序,Python等资源合集大放送
为了感恩大家长久以来的关注和支持,小编准备了一些福利,整理了包含前端,Java,产品经理,微信小程序,Python,网站源码,Android应用视频教程,微信公众平台开发教程及材料等资源合集大放送. ...
- codeblocks按c99标准编译c文件的设置
作者:朱金灿 来源:http://blog.csdn.net/clever101 早上用codeblocks编译一个c文件,出现这样一个编译错误: +'for'+loop+initial+declar ...