zoukankan      html  css  js  c++  java
  • C# 串口

    昨天做了一个C#写的串口测试程序  现在把代码贴上来

    Comm.cs

    using System;
    using System.Collections.Generic;
    using System.IO.Ports;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    
    namespace ComTest
    {
        class Comm
        {
            //事件委托
            public delegate void ComRecevied(byte[] byteBuffer);
            //public ComRecevied comRecevied;
            public event ComRecevied EventComReceived;
    
            private SerialPort serialPort;
            //配置                串口号             波特率     校验位         数据位     停止位
            public void InitCOM(string _PortName,string _baudRate,string _checkBit,string _dataBits,string _stopBit)
            {
                if (serialPort != null && serialPort.IsOpen)
                {
                    serialPort.Close();
                }
                serialPort = new SerialPort(_PortName,int.Parse(_baudRate),(Parity)Enum.Parse(typeof(Parity),_checkBit),int.Parse(_dataBits), (StopBits)Enum.Parse(typeof(StopBits), _stopBit));
                serialPort.DataReceived += SerialPort_DataReceived;
                serialPort.ReceivedBytesThreshold = 1;//设置事件发生前内部输入缓冲区的字节数为1
                serialPort.RtsEnable = true;
            }
            //数据接收
            private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                //byte[] readBuffer = new byte[serialPort.ReadBufferSize];//获取输入缓冲区的大小
                byte[] readBuffer = new byte[serialPort.BytesToRead];//获取接收缓冲区中数据的字节数
                //Console.WriteLine(serialPort.BytesToRead);
    
                //            要读取的字节数组      起始位置    总个数
                serialPort.Read(readBuffer, 0, readBuffer.Length);
                /*//----------Y-----------
                string str = Encoding.Default.GetString(readBuffer);
                string str1 = str.Substring(str.IndexOf("X")+1,3);
                string str2 = str.Substring(str.IndexOf("Y") + 1, 3);*/
                /*Console.WriteLine(str);
                Console.WriteLine(str1);
                Console.WriteLine(str2);*/
                //MessageBox.Show(str);
                EventComReceived(readBuffer);
            }
            //打开串口
            public bool OpenPort()
            {
                //写成异常处理的形式以免打不开串口导致程序崩溃
                try
                {
                    serialPort.Open();
                }
                catch { }
    
                if (serialPort.IsOpen)
                {
                    return true;
                }
                else
                {
                    MessageBox.Show("串口打开失败");
                    return false;
                }
            }
            //向串口发送数据
            public void SendCommand(string _str1,string _str2)
            {
                int a=int.Parse(_str1);
                int b = int.Parse(_str2);
                string str1 = "";
                if (a <= 9)
                {
                    str1 = "00" + a;
                }
                else if (a <= 99&&a>9)
                {
                    str1 = "0" + a;
                }
                else
                {
                    str1 = a+"";
                }
                string str2 = "";
                if (b <= 9)
                {
                    str2 = "00" + b;
                }
                else if (b <= 99 && b > 9)
                {
                    str2 = "0" + b;
                }
                else
                {
                    str2 = b + "";
                }
                string CommandString = "X"+str1+"Y"+str2;
                byte[] WriteBuffer = Encoding.ASCII.GetBytes(CommandString);
                serialPort.Write(WriteBuffer, 0, WriteBuffer.Length);
                //Console.WriteLine(WriteBuffer.Length);
            }
        }
    }

    MainWindow.xaml.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace ComTest
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            private Comm comm = new Comm();
            public MainWindow()
            {
                InitializeComponent();
                //xTxt.MaxLength = 3;
                comm.EventComReceived += Comm_EventComReceived;
            }
            //接收后触发委托事件
            private void Comm_EventComReceived(byte[] byteBuffer)
            {
    
                Dispatcher.BeginInvoke(new Action(delegate
                {
                    try
                    {
                        string str = Encoding.Default.GetString(byteBuffer);
    
                        string str1 = str.Substring(str.IndexOf("X") + 1, 3);
                        string str2 = str.Substring(str.IndexOf("Y") + 1, 3);
                        labelX.Content = "收到X:" + str1;
                        labelY.Content = "收到Y:" + str2;
                    }
                    catch { MessageBox.Show("请再打开一个窗口来测试"); }
                    
                }));
            }
    
            //设置
            private void setBtn_Click(object sender, RoutedEventArgs e)
            {
                comm.InitCOM(PortNameTxt.Text,baudRateTxt.Text,checkBitTxt.Text,dataBitsTxt.Text,stopBitTxt.Text);
                comm.OpenPort();
            }
            //发送
            private void sendBtn_Click(object sender, RoutedEventArgs e)
            {
                if (comm.OpenPort())
                {
                    comm.SendCommand(xTxt.Text,yTxt.Text);
                }
            }
            
    
            private void xTxt_TextChanged(object sender, TextChangedEventArgs e)
            {
                if (int.Parse(xTxt.Text) > 180)
                {
                    xTxt.Text = "180";
                }
                else if (int.Parse(xTxt.Text) < 0)
                {
                    xTxt.Text = "0";
                }
    
            }
    
            private void xTxt_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                Regex re = new Regex("[^0-9]+");
    
                e.Handled = re.IsMatch(e.Text);
            }
    
            private void yTxt_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                Regex re = new Regex("[^0-9]+");
    
                e.Handled = re.IsMatch(e.Text);
    
            }
    
            private void yTxt_TextChanged(object sender, TextChangedEventArgs e)
            {
                if (int.Parse(yTxt.Text) > 180)
                {
                    yTxt.Text = "180";
                }
                else if (int.Parse(yTxt.Text) < 0)
                {
                    yTxt.Text = "0";
                }
            }
        }
    }

    MainWindow.xaml

    <Window x:Class="ComTest.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:ComTest"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <Grid>
            <TextBox x:Name="PortNameTxt" Margin="59,84,0,0" TextWrapping="Wrap" Text="COM1" HorizontalAlignment="Left" Width="85" Height="23" VerticalAlignment="Top"/>
            <Label x:Name="PortNameLabel" Content="串口号" Margin="75,52,0,0" HorizontalAlignment="Left" Width="46" Height="26" VerticalAlignment="Top"/>
            <Label x:Name="baudRateLabel" Content="波特率" Margin="190,51,0,0" HorizontalAlignment="Left" Width="46" Height="26" VerticalAlignment="Top"/>
            <TextBox x:Name="baudRateTxt" Margin="174,84,0,0" TextWrapping="Wrap" Text="9600" HorizontalAlignment="Left" Width="82" Height="23" VerticalAlignment="Top"/>
            <Button x:Name="setBtn" Content="确定设置" Margin="238,163,0,0" Click="setBtn_Click" HorizontalAlignment="Left" Width="75" Height="22" VerticalAlignment="Top"/>
            <Label x:Name="xLabel_" Content="X轴" Margin="39,202,0,0" HorizontalAlignment="Left" Width="30" Height="26" VerticalAlignment="Top"/>
            <TextBox x:Name="xTxt" Margin="20,234,0,0" TextWrapping="Wrap" Text="123" HorizontalAlignment="Left" Width="69" Height="23" VerticalAlignment="Top" PreviewTextInput="xTxt_PreviewTextInput" TextChanged="xTxt_TextChanged"/>
            <Label x:Name="yLabel" Content="Y轴" Margin="127,203,0,0" HorizontalAlignment="Left" Width="29" Height="26" VerticalAlignment="Top"/>
            <TextBox x:Name="yTxt" Margin="106,235,0,0" TextWrapping="Wrap" Text="321" HorizontalAlignment="Left" Width="69" Height="23" VerticalAlignment="Top" PreviewTextInput="yTxt_PreviewTextInput" TextChanged="yTxt_TextChanged"/>
            <Button x:Name="sendBtn" Content="发送" Margin="59,278,0,0" Click="sendBtn_Click" HorizontalAlignment="Left" Width="75" Height="22" VerticalAlignment="Top"/>
            <Label x:Name="checkBitLabel" Content="校验位" Margin="301,50,0,0" HorizontalAlignment="Left" Width="46" Height="26" VerticalAlignment="Top"/>
            <TextBox x:Name="checkBitTxt" Margin="286,84,0,0" TextWrapping="Wrap" Text="None" HorizontalAlignment="Left" Width="82" Height="23" VerticalAlignment="Top"/>
            <Label x:Name="dataBitsLabel" Content="数据位" Margin="408,51,0,0" HorizontalAlignment="Left" Width="46" Height="26" VerticalAlignment="Top"/>
            <TextBox x:Name="dataBitsTxt" Margin="389,84,0,0" TextWrapping="Wrap" Text="8" HorizontalAlignment="Left" Width="82" Height="23" VerticalAlignment="Top"/>
            <Label x:Name="stopBitLabel" Content="停止位" Margin="98,133,0,0" HorizontalAlignment="Left" Width="46" Height="26" VerticalAlignment="Top"/>
            <TextBox x:Name="stopBitTxt" Margin="78,164,0,0" TextWrapping="Wrap" Text="1" Height="23" VerticalAlignment="Top" HorizontalAlignment="Left" Width="82"/>
            <Label x:Name="labelX" Content="收到X:" HorizontalAlignment="Left" Margin="286,214,0,0" VerticalAlignment="Top" Width="141"/>
            <Label x:Name="labelY" Content="收到Y:" HorizontalAlignment="Left" Margin="286,256,0,0" VerticalAlignment="Top" Width="141"/>
        </Grid>
    </Window>

    没啥想说的,先这样吧,以后有什么代码再接着往上贴

  • 相关阅读:
    Python
    Python
    Python
    Python
    Python
    Python
    Scala核心编程_第01章_Scala概述
    与富婆讨论性,死亡与生活的意义
    python邮件发送给多人时,只有第一个人能收到的问题
    少年维特的烦恼
  • 原文地址:https://www.cnblogs.com/lingLuoChengMi/p/7809806.html
Copyright © 2011-2022 走看看