0

これは私が書いてみたコードです。まず「LinkSprite JPEG Camera」に写真を撮るように指示し、次に JPEG ファイルの内容を読み込みます。

エラーはなく、コードは機能していますが、問題は結果が非常に遅いことです。「完了」、つまり2 分以上後に FFD9 に到達したことがわかりました。それだけの時間を経て、メッセージボックスのメッセージが浮かび上がりました。

「写真を撮る」コマンドを送信した後、カメラバッファに保存されている画像を取得し、フォームに表示したい。

私のコードは次のとおりです。

// public static byte[] ReceivedMsg = new byte[256];
// public static int factor = 0x0000;
// public static UInt16 M = 0;
// public static byte MH = (byte)((M >> 8) & 0xff);
// public static byte ML = (byte)((M >> 0) & 0xff);

private void TakeSnap_Click(object sender, EventArgs e)
{
    // First set the size of the image //
    byte[] sendCmd = new byte[9] { 0x56, 0x00, 0x31, 0x05, 0x04, 0x01, 0x00, 0x19, 0x11 };

    try
    {
        if (!(CamPort.IsOpen)) CamPort.Open(); // If the port is closed!,Open it again //
        CamPort.Write(sendCmd, 0, 9);
        Thread.Sleep(100);// Wait for the camera //
        for (int i = 0; i < 5; i++)
        {
            ReceivedMsg[i] = (byte)(CamPort.ReadByte()); // Store the returned msg //
        }
        if (ReceivedMsg[0].ToString("x") == "76" && ReceivedMsg[1].ToString("x") ==    "0" && ReceivedMsg[2].ToString("x") == "31" && ReceivedMsg[3].ToString("x") == "0" && ReceivedMsg[4].ToString("x") == "0")
        {
            try
            {
                CamPort.DiscardOutBuffer();
                CamPort.DiscardInBuffer();
                byte[] TakePicCmd = new byte[] { 0x56, 0x00, 0x36, 0x01, 0x00 };
                CamPort.Write(TakePicCmd, 0, 5);
                Thread.Sleep(100);// Wait for the camera //
                for (int i = 0; i < 5; i++)
                {
                    ReceivedMsg[i] = (byte)(CamPort.ReadByte());
                }
                if (ReceivedMsg[0].ToString("x") == "76" && ReceivedMsg[1].ToString("x") == "0" && ReceivedMsg[2].ToString("x") == "36" && ReceivedMsg[3].ToString("x") == "0" && ReceivedMsg[4].ToString("x") == "0")
                { 
                    try
                    {
                        CamPort.DiscardOutBuffer();
                        CamPort.DiscardInBuffer();
                        byte[] ReadSizeCommand = new byte[5] { 0x56, 0x00, 0x34, 0x01, 0x00 };
                        CamPort.Write(ReadSizeCommand, 0, 5);
                        Thread.Sleep(100);// Wait for the camera //
                        for (int i = 0; i < 9; i++)
                        {
                            ReceivedMsg[i] = (byte)(CamPort.ReadByte());
                        }
                        if (ReceivedMsg[0].ToString("x") == "76" && ReceivedMsg[1].ToString("x") == "0" && ReceivedMsg[2].ToString("x") == "34" && ReceivedMsg[3].ToString("x") == "0" && ReceivedMsg[4].ToString("x") == "4" && ReceivedMsg[5].ToString("x") == "0" && ReceivedMsg[6].ToString("x") == "0")
                        {   
                            int ImageSize=(((ReceivedMsg[7] & 0x00ff) << 8) | (ReceivedMsg[8] & 0x00ff));
                            try
                            {
                                CamPort.DiscardOutBuffer();
                                CamPort.DiscardInBuffer();
                                byte[] body = new byte[32];
                                byte[] header = new byte[5];
                                bool EndFlag = false;    
                                while (!EndFlag)
                                {
                                    ReadJpegFileCommand();
                                    Thread.Sleep(25);// Wait for the camera //
                                    for (int i = 0; i < 5; i++) header[i] = (byte)CamPort.ReadByte();
                                    ////// If the first 5 bytes matching [76 00 32 00 00] then read the body and display the image //////
                                    if (((int)header[0] == 0x76) && (header[1] == 0x00) && (header[2] == 0x32) && (header[3] == 0x00) && (header[4] == 0x00))
                                    {
                                        for (int i = 0; i < 32; i++)
                                            body[i] = (byte)CamPort.ReadByte();

                                        for (int i = 1; i < body.Length; i++)// check if reached to the last two bytes(FF D9) of the body //
                                        {
                                            if ((body[i - 1] == 0xFF) && (body[i - 0] == 0xD9))
                                            {
                                                EndFlag = true;
                                                MessageBox.Show("done");
                                            }
                                        }
                                    }
                                    else
                                    {
                                        MessageBox.Show("Unexpted Returned value "); // the first 5 bytes does not match the header 
                                    }
                                }
                            }

                            catch (System.Exception ex) { MessageBox.Show(ex.Message); }

                        }
                        else { MessageBox.Show("Reset the camera and start again0 !!"); }
                    }
                    catch (System.Exception ex) { MessageBox.Show(ex.Message); }
                }
                else { MessageBox.Show("Reset the camera and start again1 !!"); }
              }
            catch (System.Exception ex) { MessageBox.Show(ex.Message); }
        }
        else { MessageBox.Show("Reset the camera and try again2 !!"); }
    }
    catch (System.Exception ex) { MessageBox.Show(ex.Message); }
}

//------------------------------------------------------------------------------------//

public void ReadJpegFileCommand()
{
    try
    {
        MH = (byte)(factor / 0x100);
        ML = (byte)(factor % 0x100);
        byte[] ReadImageCommand = new byte[16] { 0x56, 0x00, 0x32, 0x0C, 0x00, 0x0A, 0x00, 0x00, MH, ML, 0x00, 0x00, 0x00, 0x20, 0x00, 0x0a };
        CamPort.Write(ReadImageCommand, 0, 16);
        factor += 0x20;
    }

    catch (System.Exception ex) { MessageBox.Show(ex.Message); }
}

カメラは: LinkSprite JPEG カメラ

カメラマニュアル

Mbed の例 (テストプログラム)

FFD9 に「すばやく」アクセスするにはどうすればよいですか。データ配列に格納されているバイトを、フォームに追加した画像として表示するにはどうすればよいですか?picturebox1

CamPortシリアル ポート コントロールの名前です。

4

1 に答える 1

0

シリアルポートはどのボーレートで動作していますか?シリアルポートは、あなたの場合は115200ボーの最高速度であっても、データの送信はそれほど高速ではありません。それでも、このようなシリアル通信では、ボーレートが高く設定されているか、両端で不一致があると、ランダムな文字がドロップされる傾向があります。

画像ボックスに表示する限り、バイト配列をある種のImageクラスオブジェクトに変換する必要があります。入力配列が正しく、文字が欠落していない場合、これは難しくありません。これを行う方法については、たくさんのチュートリアルがあります。

http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/a20fcf5f-9d32-4d32-85d0-c8dd4d978e15

http://forums.codeguru.com/showthread.php?496495-Manually-created-byte-array-to-picture-box

于 2013-01-25T17:00:04.757 に答える