第一次接觸串口,寫點東西加深自己對串口的印象:
通過參考一些網上的實例,我明白了串口怎么簡單的進行通信交流,但是我所需要的還是圖片等大文件在串口中的傳輸,串口傳輸是通過二進制位進行單位傳輸的,所以傳輸速度比較慢,在一開始,我將圖片轉換成二進制,然后傳輸,在另一端口,接收到二進制數據並轉換成圖片形式,代碼如下:
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(丟棄來自串行驅動程序的傳輸緩沖區的數據)---這里提到的是“傳輸緩沖區”