• 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(丢弃来自串行驱动程序的传输缓冲区的数据)---这里提到的是“传输缓冲区”

  • 相关阅读:
    Setting the Scope of COM Objects in ASP Pages
    不注册调用ActiveX Dll
    完成端口>TransmitFile 和 TransmitPackets (收集)
    浅谈网络游戏《天龙X部》的文件加密格式
    防止被偷窥和修改 Office文档保护秘笈
    oracle日期时间函数大全
    (C#)Windows Shell 外壳编程系列5 获取图标
    在Delphi中关于UDP协议的实现
    《黑手党2》全部50本花花公子杂志收集攻略
    TThread —— 线程类详解
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/9361421.html
Copyright © 2020-2023  润新知