添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
帅气的便当  ·  用jackson的@JsonProperty ...·  1 年前    · 
聪明的柚子  ·  UiPath - issue - ...·  1 年前    · 
谦和的灌汤包  ·  Spring ...·  1 年前    · 

与串口发送数据和接收数据,在此作一个简单的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号灯灭。
布局代码:

< 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();
                // 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();
                    one.Background = new SolidColorBrush(Colors.Red);
                    arr[0] = 0.ToString();
                if (Receive2 == 1.ToString())
                    two.Background = new SolidColorBrush(Colors.MediumAquamarine);
                    arr[1] = 1.ToString();
                    two.Background = new SolidColorBrush(Colors.Red);
                    arr[1] = 0.ToString();
                if (Receive3 == 1.ToString())
                    three.Background = new SolidColorBrush(Colors.MediumAquamarine);
                    arr[2] = 1.ToString();
                    three.Background = new SolidColorBrush(Colors.Red);
                    arr[2] = 0.ToString();
                if (Receive4 == 1.ToString())
                    four.Background = new SolidColorBrush(Colors.MediumAquamarine);
                    arr[3] = 1.ToString();
                    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();
                txtSend.Text = "1";
                Serial();
        private void btnSend1_Click(object sender, RoutedEventArgs e)
            if (arr[1] == 0.ToString())
                txtSend.Text = "2";
                Serial();
                txtSend.Text = "3";
                Serial();
        private void btnSend2_Click(object sender, RoutedEventArgs e)
            if (arr[2] == 0.ToString())
                txtSend.Text = "4";
                Serial();
                txtSend.Text = "5";
                Serial();
        private void btnSend3_Click(object sender, RoutedEventArgs e)
            if (arr[3] == 0.ToString())
                txtSend.Text = "6";
                Serial();
                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();
                txtSend.Text = "1";
                Serial();
        private void btnSend1_Click(object sender, RoutedEventArgs e)
            if (arr[1] == 0.ToString())
                txtSend.Text = "2";
                Serial();
                txtSend.Text = "3";
                Serial();
        private void btnSend2_Click(object sender, RoutedEventArgs e)
            if (arr[2] == 0.ToString())
                txtSend.Text = "4";
                Serial();
                txtSend.Text = "5";
                Serial();
        private void btnSend3_Click(object sender, RoutedEventArgs e)
            if (arr[3] == 0.ToString())
                txtSend.Text = "6";
                Serial();
                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();
                // 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();
                    one.Background = new SolidColorBrush(Colors.Red);
                    arr[0] = 0.ToString();
                if (Receive2 == 1.ToString())
                    two.Background = new SolidColorBrush(Colors.MediumAquamarine);
                    arr[1] = 1.ToString();
                    two.Background = new SolidColorBrush(Colors.Red);
                    arr[1] = 0.ToString();
                if (Receive3 == 1.ToString())
                    three.Background = new SolidColorBrush(Colors.MediumAquamarine);
                    arr[2] = 1.ToString();
                    three.Background = new SolidColorBrush(Colors.Red);
                    arr[2] = 0.ToString();
                if (Receive4 == 1.ToString())
                    four.Background = new SolidColorBrush(Colors.MediumAquamarine);
                    arr[3] = 1.ToString();
                    four.Background = new SolidColorBrush(Colors.Red);
                    arr[3] = 0.ToString();
                //String abc = Convert.ToString(arr);
                //MessageBox.Show("abc", abc);
                // MessageBox.Show("arr", arr);

这样可以实现btn和硬件本身按钮同时控制灯亮灯灭。
若转载请注明转载处。

与串口发送数据和接收数据,在此作一个简单的Demo.此Demo可以实现按下硬件按钮,灯亮,发送灯状态数据过来。并且可以实现几个灯同时亮,发送灯的状态数据过来。PC端实现点击按钮让硬件灯亮。 此处为4个灯,发送过来的数据:0代表暗,1代表亮。列如:1010代表1号灯和3号灯亮,2号和4号灯暗。 发送过去的数据:0代表1号灯亮,1代表1号灯灭、2代表2号灯亮,3代表2号灯灭、4代表3号灯亮,5代表3
····从2015年到现在,将近4年没有写程序了,这次是一个朋友要我做物联网的项目,要学习一些新东西,做起来再说。 ····基于STM32的通讯调试起来还是不方便,用C#写了一个简单的收发程序,先模拟链式收发,主要是测试流程是否正常无误。后面用C写好这部分处理程序再下载到单片机上就OK了,可能是刚开始接触STM32的单片机不习惯,还是觉得这样省事。 ····在用C#写的时候,发现关闭端口出现死...
* 学C#和WPF编的第一个软件,整个编程过程,通过百度不断学习 * 作者是做硬件的,只为学习做简单的上位机程序,C#简单,开发效率高,所以选择C# * 以前没有PC端软件编程经验,所以该编程思想继承于单片机编程思想,未用到面向对象和WPF的精髓,不建议模仿,仅供参考 * 实际上到现在我还不知道面向对象是什么意思 ̄□ ̄|| * 欢迎反馈BUG QQ45213212 E-MAIL lincolne@126.com 图片看这里 http://blog.csdn.net/q45213212/article/details/35265773
一、WPF数据绑定的概要 数据绑定:是应用程序 UI 与业务逻辑之间建立连接的过程。 如果绑定正确设置并且数据提供正确通知,则当数据的值发生更改时,绑定到数据的视觉元素会自动反映更改。 数据绑定可能还意味着如果视觉元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改。 例如:如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改。 1. 数据绑定涉及到两个方面: 一个是绑定源,一个是绑定目标。绑定源即控件绑定所使用的源数据,绑定目标即数据显示的控件。 2. 对于绑定源,在WPF可以是以下四种: •CLR对象:可以绑定到CLR类的公开的属性、子属
WPF是一种基于XAML的应用程序框架,通过使用WPF,可以很容易地实现本地存储数据WPF支持多种方式来存储数据,包括XML文件,数据库和文本文件等。 使用XML文件来存储数据,可以通过使用XmlSerializer类将WPF中的对象序列化为XML格式,然后将其写入到本地磁盘。当需要读取数据时,可以使用XmlSerializer类来反序列化XML文件,以获得WPF对象的实例。 如果需要更复杂的本地数据存储,可以选择使用数据库。WPF支持多种数据库,包括Microsoft SQL Server、MySQL、SQLite和Oracle等。通过使用ADO.NET来访问数据库,可以轻松地将WPF对象保存到数据库中,并在需要时检索它们。 另外一种常用的本地数据存储方式是使用文本文件。通过将数据写入到文本文件中,可以轻松地保存WPF应用程序中的各种数据。使用WPF中的StreamWriter类可以将数据写入到文本文件中,而使用StreamReader类可以读取之前保存的数据。 总之,WPF提供了多种方式来实现本地数据存储,在开发应用程序时,可以根据应用程序的需求来选择最适合的存储方式。
ringfish: 为什么的监听事件进不去啊, Sp.DataReceived += new SerialDataReceivedEventHandler(Sp_DataReceived);直接跳过了这一步[code=plain] [/code][code=plain] [/code] WPF 自由拖拽控件 weixin_44453419: 斤斤计较军军军军军军军军军军军军军过付 WPF 自由拖拽控件 weixin_44453419: 昵称我能否给你发给你发给到你发的个