簡體   English   中英

C# 來自 UART 如何將讀取的數據分成字節?

[英]C# from UART How do I separate the data I read into bytes?

如果你告訴我我需要在代碼上編輯什么,我會很高興。 我想逐字節分離接收到的數據,我該怎么做?

namespace _1993
{
    public partial class Form1 : Form
    {
        string[] ports = SerialPort.GetPortNames(); //Port Numaralarını ports isimli diziye atıyoruz.
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (string port in ports)
            {
                comboBox1.Items.Add(port); // Port isimlerini combobox1'de gösteriyoruz.
                comboBox1.SelectedIndex = 0;
            }
            comboBox2.Items.Add("2400");  // Baudrate'leri kendimiz combobox2'ye giriyoruz.
            comboBox2.Items.Add("4800");
            comboBox2.Items.Add("9600");
            comboBox2.Items.Add("19200");
            comboBox2.Items.Add("115200");
            comboBox2.SelectedIndex = 2;

            label3.Text = "Bağlantı Kapalı";   //Bu esnada bağlantı yok.
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            
             // Form kapandığında Seri Port Kapatılmış Olacak.
            if (serialPort1.IsOpen == true)
            {
                serialPort1.Close();
            }

            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                string sonuc = serialPort1.ReadExisting();//Serial.print kodu ile gelen analog veriyi alıyoruz,string formatında sonuc'a atıyoruz
                
                if (sonuc != "")
                {
                    label1.Text = sonuc + ""; //Labele yazdırıyoruz. 
                    listBox1.Items.Add(sonuc); //labele yazdırdığını listboxa ekle
                    byte[] ba = Encoding.Default.GetBytes(sonuc);
                    var hexString = BitConverter.ToString(ba);
                    

                    if (ba[0] == 0XFF)
                    {
                        Console.WriteLine(ba);
                    }
                    else
                    {
                        Console.WriteLine("hatalı");
                    }


                    //Console.WriteLine(ba[0]);
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message); // basarısız olursa hata verecek.
                timer1.Stop();
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {

            timer1.Start(); //250 ms olarak ayarladım timer'ı.
            if (serialPort1.IsOpen == false)
            {
                if (comboBox1.Text == "")
                    return;
                serialPort1.PortName = comboBox1.Text;  // combobox1'e zaten port isimlerini aktarmıştık.
                serialPort1.BaudRate = Convert.ToInt16(comboBox2.Text); //Seri Haberleşme baudrate'i combobox2 'de seçilene göre belirliyoruz.
                try
                {
                    serialPort1.Open(); //Haberleşme için port açılıyor
                    label3.ForeColor = Color.Green;
                    label3.Text = "Bağlantı Açık";


                }
                catch (Exception hata)
                {
                    MessageBox.Show("Hata:" + hata.Message);
                }
            }
            else
            {
                label3.Text = "Bağlantı kurulu !!!";
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //BAĞLANTIYI KES BUTONU
            timer1.Stop();
            if (serialPort1.IsOpen == true)
            {
                serialPort1.Close();
                label3.ForeColor = Color.Red;
                label3.Text = "Bağlantı Kapalı";
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Add(label1.Text); //Okunan veri listbox'a atılıyor

        }

        private void button4_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear(); // listbox temizleniyor.
        }

        private void label2_Click(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }
    }
}

SerialPort已經返回字節讀取並返回字節。 ReadExisting使用SerialPort.Encoding將這些字節轉換為字符串。 要獲取原始字節,請改用ReadReadByte

var buffer=byte[1024];
var read=port.Read(buffer,0,buffer.Length);
if (read>0 && buffer[0] == 0XFF)
{
....
}

如果要將字節顯示或寫入控制台,則必須使用Encoding.GetString顯式將字節轉換為字符串。

var str=SerialPort.Encoding.GetString(buffer,0,read);

不過要小心。

SerialPort.Encoding的默認值為 ASCIIEncoding,即 7 位 US-ASCII 編碼。 這將破壞所有非拉丁字符。 如果端口返回非 US-ASCII 文本,您必須找到正確的編碼並使用它。 在 POS 上,這會破壞非英文產品名稱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM