C#串口圖片傳輸以及對串口緩沖區的簡單理解


第一次接觸串口,寫點東西加深自己對串口的印象:

通過參考一些網上的實例,我明白了串口怎么簡單的進行通信交流,但是我所需要的還是圖片等大文件在串口中的傳輸,串口傳輸是通過二進制位進行單位傳輸的,所以傳輸速度比較慢,在一開始,我將圖片轉換成二進制,然后傳輸,在另一端口,接收到二進制數據並轉換成圖片形式,代碼如下:

private void Sendpicture() {
            int i = 0;
            if (!port.IsOpen)
            {
                MessageBox.Show("端口已被關閉!");
                return;
            }
            UpdateStutas();
            ///清理殘余的緩沖區
            port.DiscardInBuffer();
            port.DiscardOutBuffer();
            //寫入圖片信息從固定文件夾中得到信息
            FileStream fs = new FileStream(@"E:\圖片轉換測試\發送圖片\1.jpg", FileMode.Open, FileAccess.Read);
           
            //將其讀作二進制數UTF-8編碼
            BinaryReader br = new BinaryReader(fs);
            int length = (int)fs.Length;
            List<byte> buf = new List<byte>();//填充到這個臨時列表中  
            while (length > 0)
            {
                byte tempByte = br.ReadByte();
                    buf.Add(tempByte);
                    length--;
               }
                   
            fs.Close();
            br.Close();
            //轉換列表為數組后發送  
            port.Write(buf.ToArray(), 0, buf.Count);
            //記錄發送的字節數  
            sendnum.Text = "發送字節數:" + buf.Count;
        }

        public void RecivePicdata(object sender, SerialDataReceivedEventArgs e) {
            ///數據長度
            int count = port.BytesToRead;
            string msg = null;
            //{
            byte[] buff = new byte[count];
            ///接收數據
            port.Read(buff, 0, count);

            //將字節數據轉換為二進制數據
           FileStream fs = new FileStream(@"E:\圖片轉換測試\接收圖片\2.jpg", FileMode.Append, FileAccess.Write); //創建1.jpg圖片
            BinaryWriter bw = new BinaryWriter(fs);
            foreach (byte buf in buff)
            {
                bw.Write(buf);

        
            }
            fs.Close();
            bw.Close();
       

 
        }

在這之中我還發現了一個非常困擾我的問題,就是串口的緩沖區問題,在一開始,我所傳輸圖片只收到4096個字節,郁悶了很久才明白是緩沖區的原因,串口默認緩沖區是4k,而在緩沖區之外的數據就直接清除了,所以如果單次傳輸大文件時,要重新設置串口的輸入緩沖區ReadBufferSize和輸出緩沖區WriteBufferSize這兩個屬性,下面是串口的幾個緩沖區,第一次接觸,當初對我真是折磨王啊。

串口屬性:BytesToRead(獲取接收緩沖區中數據的字節數)--這里提到的是“接收緩沖區”

串口屬性:ReadBufferSize(獲取或設置 System.IO.Ports.SerialPort 輸入緩沖區的大小)---這里提到的是“輸入緩沖區”

串口屬性:BytesToWrite(獲取發送緩沖區中數據的字節數)---這里提到的是“發送緩沖區”

串口屬性:WriteBufferSize(獲取或設置串行端口輸出緩沖區的大小)---這里提到的是“輸出緩沖區”

串口屬性:DiscardOutBuffer(丟棄來自串行驅動程序的傳輸緩沖區的數據)---這里提到的是“傳輸緩沖區”

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM