首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

C#串口传递bmp图片遇到的有关问题

2012-03-11 
C#串口传递bmp图片遇到的问题过程分为三步:1.先将bmp图片的bitmap转化为byte[],(该byte[]里的值是每个像素

C#串口传递bmp图片遇到的问题
过程分为三步:
1.先将bmp图片的bitmap转化为byte[],(该byte[]里的值是每个像素点的rgb值)
2.然后通过串口传送byte[],
3.再将接收到的byte[]还原为bitmap。

出现的问题是第3步还原出来的图片和原图不一致。

为了检查问题出在哪里,传送前将byte[]转化为textbox.text,再传,接收后显示的text是正常的。下面是部分代码,帮帮忙看看吧:
发送

C# code
private void button3_Click(object sender, EventArgs e)        {            richTextBox2.Text = "";                        if (bmp1 != null)            {                Bitmap result = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);                result = (Bitmap)bmp1.Clone();                Rectangle rect = new Rectangle(0, 0, result.Width, result.Height);                System.Drawing.Imaging.BitmapData bmpData = result.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, result.PixelFormat);                IntPtr ptr = bmpData.Scan0;                int bytes = bmpData.Stride * bmpData.Height;                byte[] rgbValues = new byte[bytes];//将bmp图片里的纯图像数据存进rgbvalues                System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);                //测试时候若将rgbvalues转为richtextbox.text传送,在接收端接收的没错                //for (int i = 0; i < rgbValues.Length; i++)                //{                //    richTextBox2.Text = richTextBox2.Text + rgbValues[i].ToString() + ",";                //}                System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);                result.UnlockBits(bmpData);                pictureBox1.Image = result;                serialPort1.Write(rgbValues, 0, rgbValues.Length);            }        }

接收
C# code
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)        {            if (closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环               try              {                                Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。                   int n = serialPort1.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致                   byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据                serialPort1.Read(bufchar, 0, n);//读取缓冲数据                  builder.Remove(0, builder.Length);//清除字符串构造器的内容                //因为要访问ui资源,所以需要使用invoke方式同步ui。                   this.Invoke((EventHandler)(delegate                  {                      //测试中若接收发送的text,则接收后按字符串显示是没有问题的                    //直接按ASCII规则转换成字符串                       //builder.Append(Encoding.ASCII.GetString(buf));                    //追加的形式添加到文本框末端,并滚动到最后。                       //this.richTextBox3.AppendText(builder.ToString());                    Bitmap result = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);                    Rectangle rect = new Rectangle(0, 0, width, height);                    System.Drawing.Imaging.BitmapData bmpData = result.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);                    IntPtr ptr = bmpData.Scan0;                    System.Runtime.InteropServices.Marshal.Copy(buf, 0, ptr, n);                    result.UnlockBits(bmpData);                    pictureBox2.Image = result;                }));              }              finally              {                  Listening = false;//我用完了,ui可以关闭串口了。               }          }


[解决办法]
C#没用过,不过VC我有传过。发送端你是文本形式发送的,还是ASCII码。例如发的是 0000 0100 
还是'4'
[解决办法]
出现的问题是第3步还原出来的图片和原图不一致。

----------
是图像模糊还是偏移?

热点排行