none
如何用rs-232來傳送,接收圖片或影像 RRS feed

  • 問題

  •  

       我想用rs-232來傳,收jpeg圖檔當接收端收到資料後要如何將圖顯示出來,我用read後的buffer轉成memorystream,在顯示,它顯示參數無效,該怎麼做比較好呢,若不是傳圖檔,而是動態影像的話又該如何呢?
    2007年11月22日 上午 02:04

所有回覆

  • 程式碼區塊
    // Get bytes return from RS232
            byte[] b = (byte[])GetRs232ReceiveBuffer();
            if(b.Length > 0)
            {
                // Open a stream for the image and write the bytes into it
                System.IO.MemoryStream stream = new System.IO.MemoryStream(b, true);
                stream.Write(b, 0, b.Length);
                
                // Create a bitmap from the stream
                Bitmap bmp = new Bitmap(stream);
    
                pictureBox.Image = bmp;
            
                // Close the stream
                stream.Close();
            }

     

     

     

    2007年11月22日 上午 02:23
  •    cmf大大 那個 "GetRs232ReceiveBuffer();" 指的是serialport讀入的buffer嗎?

       

    2007年11月22日 上午 11:52
  •  ecsv8agb 寫信:

       cmf大大 那個 "GetRs232ReceiveBuffer();" 指的是serialport讀入的buffer嗎?

       



    HI  ecsv8agb

    那個 "GetRs232ReceiveBuffer();   是指 你 從 serialport的buffer  讀入資料
    應該是說 你從 serialport 獲取一張完整的 影像畫面資料
    2007年11月22日 下午 04:26
  • Hi cmf boss:

                      我在接收端改用您的程式,執行的時候一樣在 Bitmap  bmp  =  new Bitmap (stream) ; 這裡發生參數無效的錯誤

                      這是什麼緣故?

    我寫的code:

         傳送端 :

             SerialPort COM14 = new SerialPort("COM14",115200,Parity.None, 8, StopBits.One);

             private void Start_Sending_Video_Conference()
            {
                try
               {
                 
                       ms = new MemoryStream();// Store it in Binary Array as Stream


                       IDataObject data;
                       Image bmap;
                   
                       //  Copy image to clipboard
                       SendMessage(hHwnd, WM_CAP_EDIT_COPY, 0, 0);

                       //  Get image from clipboard and convert it to a bitmap
                       data = Clipboard.GetDataObject();

                       if (data.GetDataPresent(typeof(System.Drawing.Bitmap)))
                       {
                           bmap = ((Image)(data.GetData(typeof(System.Drawing.Bitmap))));

                           bmap.Save(ms, ImageFormat.Jpeg);
                       }

                   
                       picCapture.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                       byte[] arrImage = ms.GetBuffer();
                       
                       COM14.BaseStream .Write  (arrImage ,0,arrImage .Length );
                       
                       ms.Flush();
                      
                       ms.Close();
                  
                }
                catch (Exception ex)
                {
                   
                }
            }

     

    接收端 :

          SerialPort COM14 = new SerialPort("COM14",115200,Parity.None, 8, StopBits.One);
           
            private void Start_Receiving_Video_Conference()
            {
                try
                {
                    byte[] byimage = new byte[2000];
                    int imageread;

                    while (true)
                    {
                       imageread =  COM14.BaseStream.Read(byimage, 0, byimage.Length);
                       if (imageread > 0)
                       {
                           MemoryStream stream = new MemoryStream(byimage, true);
                           stream.Write(byimage, 0, byimage.Length);
                           Bitmap bmp = new Bitmap(stream);

                           picture_comming.Image = bmp;

                           stream.Close();
                       }
                    }

                 }

              catch(Exception e){}

    2007年11月23日 上午 11:15


  • HI    ecsv8agb :

    你的 發送端  未告知  接收端 影像資料的 資料長度 

    你應該先製定 兩端的 資料 傳輸協定

    EX:

    發送端                                                                   接收端

    發送  開始傳送 影像資料 命令  ---------------------->
                                                   <------------------------    回應給發送端   可以開始傳送了
    發送   影像資料長度               ---------------------->      根據 影像資料長度  配置記憶體空間

                                                  <------------------------   回應給發送端   已收到

    發送   影像資料                    --------------------->       接收 影像資料 

    發送   影像資料 結束 命令    --------------------->     檢查所接收的 影像資料 資料長度是否符合
                                                 <------------------------   回應給發送端   已收到


    2007年11月23日 下午 01:53
  • excuse me! Mr. cmf

     

                                想再問你一些問題,就是我的圖像經由儲存成jpeg記憶体資料流的話,這個記憶體資料流的長度是否就是影像的長度,若是我已取得影像長度,那麼我在接收端直接配置其陣列大小做接收緩衝,是不是就不用制訂雙方協議,直接傳輸就可以,也就是接收端只要收到固定的數目就停止接收,然後再將收到的的資料給顯示出來,可是我用serialport.Read(byte [] buffer ,0 ,buffer.Length); 好像都沒有讀到東西,只有用像是超級終端機只能顯示字串 ,像這種二進位的資料傳輸到底還要注意什麼呢?到目前為止我還沒找到有關串列埠用二進位資料形式的範例,不知大大能否再提供一些高見

     

                                                                                      thank you !!! 

    2007年12月7日 下午 04:47
  • 你能 保證 你每次 從 RS232  讀取的資料長度 就等於 影像長度 嗎? 

     

    假設 你的影像長度為 1000KB

     

      假設  RS232   BUFF 裡  只有 10 K   那麼 你只從RS232  讀取一次   你覺得 這樣對嗎 ?

     

     

    2007年12月9日 下午 01:58
  •    那如果我將讀取的buffer設成跟資料一樣長,難道不行嗎?

      

    2007年12月9日 下午 02:08
  •  

     

     

    @@  

     

    假設 你 的buffer設成跟資料一樣長

     

    你能確定 你一次 讀取 的 長度 就 等於 影像長度嗎 ?

     

     

    2007年12月9日 下午 02:28
  • Hello Mr.cmf: 想請問一下,就是既然一次讀取的長度無法 等於 影像長度,那麼我要如何將這分段的影像資料完整的寫至MemoryStream裡呢?因為我發現在實做的時候正如您所言,雖鮑率為115200bps,但在每一次讀取的時候(debug模式)緩衝所

    顯示的位元組數目都不同,就是達不到影像資料的長度,如果是這樣我要怎麼把這影像資料完整的寫入至記憶體資料流呢?

     

                                                                                                        /\ _ /\ !!!

    2008年1月7日 上午 03:34
  • 請使佣

    SerialPort.DataReceived Event

     

    在配合

    BytesToRead    取得接收緩衝區中的資料位元組數。

     

     

     

     

     

     

    2008年1月7日 上午 04:16
  • hello Mr. cmf 以下是我用SerialPort.DataReceived Event將串列資料寫入MemoryStream的程式碼,不過好像沒有辦法連續將serialport所讀入的資料完全寫入至memorystream ㄟ!

     

       ex:  

              private SerialPort  comport  =  new  SerialPort( );

     

              public Form( )

              {

                 InitializeComponent( );

                 comport.DataReceived += new  SerialDataReceivedEventHandler(port_DataReceived);

              }

     

              private void port_DataReceived(object  sender ,  SerialDataReceivedEventArgs  e)

              {

                  int   bytes  =  comport.BytesToRead ;

                  byte[ ] bufffer  =  new  byte [ bytes] ;

                  int read = comport.Read(buffer, 0 , bytes) ;

                  pictureshow(buffer, read);

              }

     

              private void picture(byte[ ] imagedata , int read)

              {

                  MemoryStream  ms  = new  MemoryStream( );

                  ms . Write (imagedata , 0 , imagedata . Length);

                  if ( read <= 0)

                    {

                           picturebox1.image = Image.FromStream(ms);

                    }

              }

    2008年1月15日 上午 03:54
  •  ecsv8agb 寫信:

    hello Mr. cmf 以下是我用SerialPort.DataReceived Event將串列資料寫入MemoryStream的程式碼,不過好像沒有辦法連續將serialport所讀入的資料完全寫入至memorystream ㄟ!

     

       ex:  

              private SerialPort  comport  =  new  SerialPort( );

     

              private  MemoryStream  ms  = new  MemoryStream( );

     

              public Form( )

              {

                 InitializeComponent( );

                 comport.DataReceived += new  SerialDataReceivedEventHandler(port_DataReceived);

              }

     

              private void port_DataReceived(object  sender ,  SerialDataReceivedEventArgs  e)

              {

                  int   bytes  =  comport.BytesToRead ;

                  byte[ ] bufffer  =  new  byte [ bytes] ;

                  int read = comport.Read(buffer, 0 , bytes) ;

                  pictureshow(buffer, read);

              }

     

              private void picture(byte[ ] imagedata , int read)

              {

                   ms . Write (imagedata , 0 , imagedata . Length);

     

                  if ( ms.Length == 已知圖片之資料長度  )

                    {

                           ms.Position = 0;

                           picturebox1.image = Image.FromStream(ms);

                    }

              }

    2008年1月15日 上午 04:24
  • 不好意思想再請問您一下: 下面是我寫發送與接收的程式,發送端在前四個位元組為圖片資料長度接著下去為圖片資料 ;接收端在收到後先將前面四個位元組解碼成為圖片長度,之後再將圖片顯示出來,可是在執行的時候接收端卻發生在

    ms.Write(imagedata , 4 , imagedata.Length - 4 ) 這行錯誤-----> ArgumentOutOfRangeException未處理  ---->必須是非負數.參數名稱: count , 這是什麼原因呢?

     

    transmit :

         public class Form1 : System.Windows.Forms.Form
     {

          private MemoryStream mem = new MemoryStream( );

          SerialPort COM2 = new SerialPort("COM2", 115200, Parity.None, 8, StopBits.One);

         

        private void Start_Sending_Video_Conference()
            {

                       MemoryStream  ms = new MemoryStream( ); // Store it in Binary Array as Stream
                       picCapture.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg  );

                       byte[] imagedata = ms.ToArray( );

                       byte[] imagelenconvert = BitConverter.GetBytes(imagedata.Length );
                       mem.Write(imagelenconvert, 0, imagelenconvert.Length);
                       mem.Write(imagedata, 0, imagedata.Length );
                       send_data_all(mem.ToArray( ));

            }

     

           private void send_data_all(byte[] alldatawrite)
            {
                COM2.Write(alldatawrite, 0, alldatawrite.Length);
            }

     

           private void button2_Click(object sender, EventArgs e)
            {
                COM2.Open();
                Start_Sending_Video_Conference();
             
            }

     

    Receive :

              private SerialPort  comport  =  new  SerialPort( );

     

              private  MemoryStream  ms  = new  MemoryStream( ) ;

              private string error = null;

              public Form( )

              {

                 InitializeComponent( );

                 comport.DataReceived += new  SerialDataReceivedEventHandler(port_DataReceived);

              }

     

              private void port_DataReceived(object  sender ,  SerialDataReceivedEventArgs  e)

              {

                  int   bytes  =  comport.BytesToRead ;

                  byte[ ] bufffer  =  new  byte [ bytes] ;

                  int read = comport.Read(buffer, 0 , bytes) ;

                  int imagelen = Decodeimagelength( buffer);     //影像長度

                  pictureshow(buffer, imagelen);

              }

     

              private void pictureshow(byte[ ] imagedata , int read)

              {

                   ms . Write (imagedata , 4 , imagedata . Length - 4); ------------->這行有問題

     

                  if ( ms.Length == read  )

                    {

                           ms.Position = 0;

                           picturebox1.image = Image.FromStream(ms);

                    }

              }

     

              public int Decodeimagelength(byte[ ] bufferx)               // 解碼影像長度

              {

                    int datalength = 0;

                    try

                         {    // image's length

                             byte [] buffer1 = new byte [4];

                             int iix = 0;

                             while (iix < 4)

                              {

                                 buffer1.SetValue(bufferx.GetValue( iix ),iix);

                                 iix += 1;

                              }

                              datalength = (int)BitConverter. ToInt32(buffer1, 0);

                          }

                     catch (Exception ex)

                          {

                                 this.error = " error in response data length " + ex.Message.ToString();

                                 return 0;

     

                          } 

                      return datalength;                       

                 }
    2008年1月22日 上午 04:34
  • 不知該怎麼說   ?

     

    上面以跟你說了很多了

     

    妳還是要 亂寫  我也沒辦法

     

     

    SORRY   無能為力  

    2008年1月22日 上午 05:05
  • 不知道你為何會如此說我亂寫,我也是照著你所述的方式來改寫

    但還是 謝謝你      

    2008年1月22日 上午 05:14