C#で簡単な上位コンピューターを書く方法

上位コンピュータのインターフェースは次のとおりです

 それは少し醜いですが、独自に設計することができます。ここでは機能の実現に焦点を当てます

コードを直接アップロードし、VS を開いて新しいプロジェクトを作成し、Windows ウィンドウ アプリケーション (NET. Framework) を選択して適切なプロジェクトを作成します。

 ビューを選択し、ツールボックスを開きます (ショートカット Ctrl + Alt + x)

 ツールボックスに「GroupBox」と入力し、それをインターフェースにドラッグし、適切なサイズを調整し、矢印を GroupBox のフレームに向けます。

 右クリックしてプロパティインターフェイスを開き、[テキスト]でインターフェイスに表示されているテキストを書き換え、[フォント]でフォントサイズを変更します。

 ツールボックスを再度開き、「ladel」と入力し、「6」をインターフェイスにドラッグし、上記の操作に従ってテキストを対応する名前に変更します。

 ツールボックスを開き、comboBoxと入力し、5をインターフェースにドラッグアンドドロップし、それぞれに順番に対応させます

 ツールボックスに「serialPort」と入力し、インターフェイス上にドラッグすると、シリアル ポートの情報を取得するために使用される次のインターフェイスが表示されます。

ウィンドウの空白スペースをダブルクリックするか、右クリックしてコードインターフェイスに入ります

 text_Serial_port() メソッドを追加してコンピューターのシリアル ポートを取得し、Form1_load でメソッドを呼び出します。

 private void text_Serial_port()
        {
            string[] ports = System.IO.Ports.SerialPort.GetPortNames(); //获得可用的串口
            for (int i = 0; i < ports.Length; i++)
            {
                comboBox1.Items.Add(ports[i]);
            }
            comboBox1.SelectedIndex = comboBox1.Items.Count > 0 ? 0 : -1;//如果里面有数据,显示第0个
        }
private void Form1_Load(object sender, EventArgs e)
        {
            text_Serial_port();
        }

実行すると、次のインターフェイスが表示されます。右側のインターフェイスが表示された場合は、コンピュータに仮想シリアル ポートがないことを意味します。仮想シリアル ポートをクエリして、関連リソースを取得できます。

 上記の作業が完了したら、インターフェースに戻り、停止位置のコンボボックスに矢印を合わせ、右クリックしてプロパティを開き、アイテム (コレクション) を見つけ、右側の (...) をクリックしてエディターを開きます。そこに次のデータを入力します(コピーするだけで、自動的に並べ替えられます)。

 

 ストップビット:


1.5
2

データビット:

8
7
6
5

 ボーレート:

1382400 
921600 
460800 
256000 
230400 
128000 
115200 
76800 
57600 
43000 
38400 
19200 
14400 
9600 
4800 
1200

パリティ:

なし
奇数パリティ
偶数パリティ

すべての入力が完了したら、次の画面を実行します

 コードに初期化メソッドを追加し、Form1_load のメソッドを呼び出して、次の結果を実行します。

            private void Form1_Load(object sender, EventArgs e)
        {
            text_Serial_port();
            Initialization();
        }

        //初始化
        private void Initialization()
        {
            comboBox2.Text = "1";
            comboBox3.Text = "8";
            comboBox4.Text = "115200";
            comboBox5.Text = "奇校验";

        }

 

 ツールボックスを開き、「Button」と入力し、それを見つけてインターフェイスにドラッグし、サイズを調整して、プロパティのテキストに書き換えます(シリアルポートを開きます)

 

 矢印を Button に向け、ダブルクリックしてコード インターフェイスに入り、それに Button メソッドを追加してシリアル ポートを開きます。

 //串口的开关
        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "打开串口")
            {
                try
                {
                    serialPort1.PortName = comboBox1.Text;//获取要打开的串口
                    serialPort1.BaudRate = int.Parse(comboBox4.Text);//获得波动率
                    serialPort1.DataBits = int.Parse(comboBox3.Text);//获得数据位
                    //设置停止位
                    if (comboBox2.Text == "1")
                    {
                        serialPort1.StopBits = StopBits.One;
                    }
                    else if (comboBox2.Text == "1.5")
                    {
                        serialPort1.StopBits = StopBits.OnePointFive;
                    }
                    else if (comboBox2.Text == "2")
                    {
                        serialPort1.StopBits = StopBits.Two;
                    }
                    //设置奇偶校验
                    if (comboBox5.Text == "无")
                    {
                        serialPort1.Parity = Parity.None;
                    }
                    else if (comboBox5.Text == "奇校验")
                    {
                        serialPort1.Parity = Parity.Odd;
                    }
                    else if (comboBox5.Text == "偶校验")
                    {
                        serialPort1.Parity = Parity.Even;
                    }
                    serialPort1.Open();//打开串口
                    button1.Text = "关闭串口";
                }
                catch (Exception err)
                {
                    MessageBox.Show("打开失败" + err.ToString(), "提示!");
                }
            }
            else
            {
                //关闭串口
                try
                {
                    
                        serialPort1.Close();//关闭串口

                }
                catch (Exception) { }
                button1.Text = "打开串口"; //按钮显示打开
            }
        }

 ツールボックスに「TextBox」と入力し、インターフェースにドラッグし、コンポーネントの上にある小さな矢印をクリックして、「MultiLine」にチェックを入れて、サイズを調整します。

 TextBox のプロパティを開き、BackColor で画面の色を調整し、ForeColor でフォントの色を調整します。ここではインターフェイスに黒、フォントに青を選択します。

 

 マウスの矢印をシリアルポートに合わせて右クリックしてプロパティを開き、プロパティ ページの稲妻をクリックして、以下の DataReceived を見つけます。

 

 ダブルクリックしてコードインターフェイスに入り、情報を受信する方法を追加します

//读取并显示接收的信息
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int len = serialPort1.BytesToRead; //获取可以读取的字节数

            byte[] buff = new byte[len];
            serialPort1.Read(buff, 0, len);//把数据读取到数组中
            string reslut = Encoding.Default.GetString(buff);
            //将byte值根据为ASCII值转为string
            Invoke((new Action(() =>
            {
                //还应该添加16制转化
                textBox1.AppendText(" " + reslut);     //追加显示在界面上        
            }
            )));

        }

仮想アシスタント XCOM をダウンロードして効果をテストし、シリアル ポート (1 つは COM1、もう 1 つは COM3) を開き、データを送信し、データが表示されるかどうかを確認します。

次に、クリアデータと 16 進数表示を追加し、ツールボックスでチェックボックスを見つけてインターフェイスにドラッグし、テキストを「16 進数表示」に変更します。

 コードに16進数のメソッドを追加し、先ほどserialPort1_DataReceivedのifに判定を追加します。

 //16进制显示字符串
        private string byteToHexstr(byte[] buff)
        {
            string str = "";
            try
            {
                if (buff != null)
                {

                    for (int i = 0; i < buff.Length; i++)
                    {
                        //char a = (char)buff[i];
                        //str += a.ToString();
                        str += buff[i].ToString("x2");
                        str += " ";//两个之间用空格
                    }
                    //str = new string(buff);
                    return str;
                }
            }
            catch (Exception)
            {
                return str;
            }
            return str;
        }

 判断があれば

//读取并显示接收的信息
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int len = serialPort1.BytesToRead; //获取可以读取的字节数

            byte[] buff = new byte[len];
            serialPort1.Read(buff, 0, len);//把数据读取到数组中
            string reslut = Encoding.Default.GetString(buff);
            //将byte值根据为ASCII值转为string
            Invoke((new Action(() =>
            {
                if (checkBox1.Checked)//16进制转化
                {
                    textBox1.AppendText(" " + byteToHexstr(buff));
                }
                else
                {
                    textBox1.AppendText(" " + reslut);
                }
            }
            )));

        }

 テスト: 仮想シリアル ポート アシスタント 01 02 03 04 05 で 16 進数の送信を確認し、ホスト コンピューターでの 16 進数の表示を確認します。

表示が成功したら、ツールボックスでボタンを見つけてインターフェース上にドラッグし、テキストを「データのクリア」に変更し、ダブルクリックしてメソッドを追加します。

//清除接收
        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Clear(); 
        }   

 メッセージを送信する機能を追加する

ツールボックスから TextBox を見つけてインターフェイスにドラッグし、CheckBox を見つけて名前を 16 進数の Send に変更し、2 つのボタンを追加して「Send Information」と「Clear Data」という名前に変更します。

 16進数の文字列変換メソッドを1つ追加

        //字符串转16进制
        private byte[] strToHexbytes(string str)
        {
            str = str.Replace(" ", "");//清除空格
            byte[] buff;
            if ((str.Length % 2) != 0)
            {
                buff = new byte[(str.Length + 1) / 2];
                try
                {
                    for (int i = 0; i < buff.Length; i++)
                    {
                        buff[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);
                    }
                    buff[buff.Length - 1] = Convert.ToByte(str.Substring(str.Length - 1, 1).PadLeft(2, '0'), 16);
                    return buff;
                }
                catch (Exception err)
                {
                    MessageBox.Show("含有f非16进制的字符", "提示");
                    return null;
                }
            }
            else
            {
                buff = new byte[str.Length / 2];
                try
                {
                    for (int i = 0; i < buff.Length; i++)
                    {
                        buff[i] = Convert.ToByte(str.Substring(i * 2, 2), 16);
                    }
                    //buff[buff.Length - 1] = Convert.ToByte(str.Substring(str.Length - 1, 1).PadLeft(2, '0'), 16);
                }
                catch (Exception err)
                {
                    {
                        MessageBox.Show("含有非16进制的字符", "提示");
                        return null;
                    }
                }
            }

            return buff;
        }

情報の送信方法を追加し、Button3 をダブルクリックしてコード インターフェイスに入り、イベントを追加します


        private void button3_Click(object sender, EventArgs e)
        {
            
                Task.Run(() => {
                    send_();
                });
        }

        string data_;
        //发送数据  
        private void send_()
        {
            data_ = textBox2.Text.ToString();
                try
                {
                    if (data_.Length != 0)
                    {
                        data_ += " ";
                        if (checkBox2.Checked) //16进制发送
                        {
                            serialPort1.Write(Encoding.Default.GetString(strToHexbytes(data_)));
                        }
                        else
                        {
                            serialPort1.Write(data_);
                            //byte[] byteArray = Encoding.Default.GetBytes(shuju);//Str 转为 Byte值
                            //serialPort1.Write(byteArray, 0, byteArray.Length, 0, null, null); //发送数据         
                        }
                    }

                }
                catch (Exception) { }         
        }

最後にデータをクリアするメソッドを追加します

        //清除数据
        private void button4_Click(object sender, EventArgs e)
        {
            textBox2.Clear();
        }

この時点で、簡単なホスト コンピュータが準備できました。不備があれば指摘してください。

おすすめ

転載: blog.csdn.net/weixin_73771688/article/details/130903050