如何通过 WinFormApp 中的串行端口逐字节显示图像,其字节数来自 WinFormApp?//

本文关键字:WinFormApp 字节数 图像 显示 何通过 串行端口 字节 显示图 | 更新日期: 2023-09-27 17:56:14

这是我尝试编写的代码。我首先告诉"LinkSprite JPEG相机"拍照,然后我读取JPEG文件内容。

没有错误并且代码正在工作,但问题是结果来得非常慢,我已经看到"完成",即在 9 分钟后达到 FFD2 多分钟。消息框的消息在很长一段时间后出现。

我想在发送"拍照"命令后获取存储在相机缓冲区中的图像,并将其显示在表单中。

我的代码是:

// 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); }
}

相机是:链接精灵JPEG相机

相机手册

Mbed示例(测试程序)

如何"快速"到达 FFD9,然后如何将存储在数据数组中的字节显示为我添加到表单picturebox1中的图像?

CamPort是串行端口控件的名称。

如何通过 WinFormApp 中的串行端口逐字节显示图像,其字节数来自 WinFormApp?//

您的串行端口以什么波特率运行?串行端口在传输数据方面不是很快,即使在其最高速度(在您的情况下为 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。