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