|
|
哈囉!想請教一下大家
串口攝像頭我所使用的是 PTC06 這款攝像頭
主要是想透過ARDUINO控制攝像頭,將得到的資料傳入C#中做處理輸出成JPEG檔
這是arduino的程式碼
#include <SoftwareSerial.h>
#define rxPin 3
#define txPin 2
byte len[2]; // get total length
byte comingbyte;
byte zero = 0x00;
int count =0 , k=0 , j=0;
int h =0x0000;
char HL,LL;
boolean EndFlag=0;
int num=0;
void camReset();
void camSnap();
void camReadlength();
void camReaddata();
void camClear();
void camCompress();
void camSize();
void ReturnValue();
SoftwareSerial mySerial = SoftwareSerial(2,3);
void setup() {
Serial.begin(115200);
mySerial.begin(115200);
delay(2500); // delay 2.5 second
}
void loop() {
byte a[32];
int i =0 ;
camSize();
delay(200);
//Serial.print("Set image_size 160*120 : ");
ReturnValue();
//Serial.println("");
camReset();
delay(900);
//Serial.print("Reset cam : ");
ReturnValue();
//Serial.println("");
camClear();
delay(100);
//Serial.print("Clear cam : ");
ReturnValue();
//Serial.println("");
camSnap();
delay(100);
//Serial.print("Start to Snap : ");
ReturnValue();
//Serial.println("");
camReadlength();
delay(100);
// Serial.print("Read image length : ");
while(mySerial.available() > 0)
{
comingbyte = mySerial.read();
if(num==7)
{ len[0] = comingbyte; }
if(num==8)
{ len[1] = comingbyte; }
if(comingbyte < byte(0x10))
// Serial.print("0");
// Serial.print(comingbyte,HEX);
num++;
}
/* Serial.println();
Serial.print("Address is : ");
Serial.println(len[0],HEX);
Serial.print("Address is : ");
Serial.print(len[1],HEX);
Serial.println();*/
/*----------------------------------------------------*/
// Read image data
//Serial.println("Read image data : ");
delay(2000);
while(!EndFlag)
{
j = 0 ;
k = 0 ;
count=0;
camReaddata();
delay(300);
while(mySerial.available() > 0)
{
comingbyte = mySerial.read();
k++;
delay(1);
if((k>5)&&(j<32)&&(!EndFlag))
{
a[j]=comingbyte;
if((a[j-1]==0xFF)&&(a[j]==0xD9)) //FFD9 Finished
{
EndFlag=1;
}
j++;
count++;
}
}
for(j=0;j<count;j++)
{
if(a[j]<0x10)
{
Serial.print("0");
}
Serial.print(a[j],HEX); // observe the image through serial port
//Serial.println("");
}
}
while(1);
}
void ReturnValue()
{
while(mySerial.available() > 0)
{
comingbyte = mySerial.read();
// if(comingbyte < byte(0x10))
// Serial.print("0");
// Serial.print(comingbyte,HEX);
}
}
得到的數據會是:
FFD8FFFF0024288064830000008000000080000000000080007800A0801E00321285510451820080FFDB808400080506305830A170B01818182CD8D8C66C98F80A8517101187131B181D1C8D181A1A8F2295251E2029208D1A933326942D2E3031981D9235393519B6F606E6160C0C18D83861311818CCCCD94CECE6E6E6E6FE2E972E2E972E2E2E972E9E2E972E2E2E972E2E972E2E972E2E2E972E962E2E972E972E2E972E2E2E972E2E2E2E2EFFFE0005800080FFC000110800BC00A003C021800291016062C0C480A28000C0C160C060C0C060C0C080000080008001817603820506070809850B01006060C060C0C0C0C040C08080008000000102038205060708840A8B100081010303810481058504048000017DC081810004110512213141061351B007A27114998191A1842342B1E01552D1F8249B62728209851617188C1A2526322C991956B3DE3396D3368DAD9ADA34B169DA355A35B51A974DFD636465B36768696AB974757637B76F6F70E171B81C5C4E9C378EAE67EE0E2EFF9AA2A3D2A5A6A7D4A9D5B2B3B4B5DBB7B8DCBAC2E1C4C5C63C2F9E9EDE3DBDFDD6EBD8D9DAE1F1E3E4E5F3E7E8E9EAF1F2F9F4F5FBF7F8F9FD118002010282040304830504048001817700010281110405C8CCC389415107617189223281841442C8A1B1C16164666A7CC5B1B9D18A169234E125F81718198D269728299535363738393A43A2454647A449A45354AA5657586B6B6C6CD9DB766DDADA2EB737F777786F6F7038B838B8382E9C9CDC39B939EE0E2E4E4E1B47573377874BA727FFB3DAB5B6B7DCB9DCC2C3E2C5C6C7C8E4CAD2D3EAD5D6D7D8ECDAE2E3F2E5F2E7E8F4EAF2F9F4F5F6F7FCF9FAFF7BC082800AFFDA000C6060C0C0C46062C006FEF2F9AC0E99D29B7F89CF8AA4A791F7ADD2B9E8E4B530F9E3F9B98DC162DB8C7678C13ED26442E443671DB98AAAD4CDF474BE0BD51A546D67E67664F7C6D657FF75D8B71499A49D9B3DEAA22290C7A9AEF6A9C10A6048DACBED28EFECF2B6CF3B248C38A04632F841558FCA76EAA4F2E5B97F9DB569BE8EB1B45F73D3F7A74B9FF852D85CDBC6158C2AC0AA3A00309555D32241A46810D351B59308FFD0F2DD5BAF306D75121F51C166D9C28787BAC8418C95C86B9FAACD159AEAC5D4FCD8CA217F980646E17DBC3EB5787830BBCECC9EF627CDDF8E16D76FCC5ABC1A1D26B776A3DEB903C4E4FF80BECD44DDCCA535BAA93A6AB1363A3E759D6A97D1A4EF5976F3994E54AED3755BDBBCCD2473B776F9B3306D6F335950C3166C8CF06B48CB764BB32A8AC6AE72DFD91B59D839AC47AB97AD8F33A756A79B02A234F53480EC76D2F3810D26A2B94023FFF4F987B24893B0809590E1CC8200E6D0E669640AE6C00ED2F51590D2F64E9D1A4BB22147CCC38FCAA1FB941786DDD76C839E52EB742D2F62F8E9E4B6B7174EABD919C89AC5BDB7C7ACFF00DF2674BADE1ADA2746B376FF80688D59A2809DE1B62A9BB9863695EFD5875041A8F265739056F53EFA130F31A3460F3574BCD791D49DCB71CF4DB6E1A09C5F9939AB796B61BFDC37B598F8C79F5861DC7D4577A8BEF5561DE36AEB53C612F52212B6BBC9A1A98AD739A1919ABC34085DD4DDA810D6B582A700127802C8D1FFE9F3EB2B3439796E6B00BE76BEAC57C7BFE3B890E3EA33AEFBFBBDA3979F9597FC22B36F603719DD19B89EF822BE02C30B8EE074FAB3B16695CEDA5E45ECC64E47AE66D629A8B4C4EBBD72EBDCCCFD43E0F2EFA980323EED62E4F2B11C1CA8177D0A6BEEB9D0E8BB1BB16BF48FCCB0770EC7AD51D674D6B782C1BA97CEF0EE0E9513771BAB457D389F66F686E1BD7E22BAEBCCC3BC6F7A779CB3E6A3E9F55D94D36BD109EAE935ACB4F4EE766581D6E0CA85B2C3CBC0E0F7AED80F981D28D6372B933846C4D56AA0D581B18353835003C1505FDE82A333FBEB46B97B7CF1F964FE5F54E4E8523FFFE9E4227656AD5FB3DD6EA8068E8DA79E9C1EA083FD578FAFCEBFB4C1ECB4A6186E3DF67600FABF0A87A1955632DF55C719DEA725BE63E0DFFE7BF5C2B6371F98BDB058FECC546327AE69B35B8B47232687CAE141B680BBCFE9A84B6EA16E8B9EB84EB57613A238B3A1F0EAB0BAE924C9DCB6390CB9E01E87F9F5C3B5F0F8733857BBA97643B5EAC43A69EB725A1F3CB377C760C7B5ACD26D6EB0B979733FDABA5C5E37F3C5CCB8ADFD9D469AEBC7EAD0F5C5ECE5D5ED03F075383D61B73B6963E0C78FCBCCD04C5F32C8C9A0114F304497C78033AEEA87D42FC51E84F1F62A9EAEC39FFFD4E2752948BB1A598E6E87730E983F4A78D3CBE4ABCF0CB6C7565CCDE4D42776CDA16A6BD7F47334BB3B3B6A7D31E65383B6B6764DD797A6BB7BCADA77948576D4BA6C748F51A9C5DAC6D989616E8B11CC0BC78BCE36C527B56595FEB2C6359C0D5A27EF34CAAD17049AB2D6E4B195E171FCACE2AD18647333B0BCDE2C8E56FF598EFED646BFC32CE286D2B285ACE985890EFFFF00C2BA826AD117BBF7A557C53DAF802457BAB86571D7FA77FD80FB29A6A54163275ADD240BBA3CB72DFAA9D4B844106F23F361F90AE575B0D5F0A7702ECA72318DDCFEE9F27F3C7EC576F07666A23BB8FEEFD670D4FCD96BB26EEA80699B1DDBBA0CDCDAD83ABD770FC6F7FEA2DA716FDCC725C70DF283D0FE8CB854EF7BC2779C6B79A537DEF9D1A51FCC62AFED3C6D8FC901C136B74F242F6D875B976F27BB236BCEE630F596FA629B8A7681C050A38E77E96C73FADAC06381CC80868FB86076E01FD2DAD5EAD1D9D8C85E9E8F98C707A784290115C9CA955616039F9BE96A71D6E8302C03199BEB514F767090899D8F80528126C94DDDE94B27A7A73E957564EEC2CBC07FD6E0AF55A7769E84A398F3468C67C1E4FF849CFCA9906ABD2472C9FFA8EDDC0EA4F5AEADB1FB40D36D0D0B71B6D86D5E1C5FB735BC6576E7E3756FF273697B3569F2C4D663FFFBCF2952D5EAAA5EA9A39ED919B990B7BF07F2A8B2D4B382529B00B238E0D6FD5C952D131C66B51939BC73B5E969B10B7764726F60D0F24FCE6E960CD99DFB762685A00E00181599C9A4B2A2929C24A4818494E164C09CA468F30D801E6D65B5979359840BE41F7B14D205DB6065F861AF27CBEB9708FFD7F3E55B9F99D6407658834FDE293EDC19FF80C7B69FFC11D322D6EDEC6A146467C9EF87706BCBBAC949D08A57D493A3B388DEC29B2F2FDED4F8C6FA1DA35D4BCD562D89B755A98F466CD6787BB93679DBE5D666DA05F3DB7385503CCF6EDB16A6EC8D99992C6E9CFF07C85D9626D7C986B7B6CDE24090D7E69D0671AE8E8D623D7BF1C5D73BF9E376D4DB67CAEBE69A49A9093DEAA33C3E6978FFF460F8BC1D96860D2C9A8EA6A77629C00DCDC88A91D9E9D2A9B4E9BEA133F3DE3ABA31DBE64FDDDAB3C7F6ECD076F2FBB6687CCA47E7E3C8B79D3FCBF856B68656E8C79C009BC7E3CFF2D739A5F1D4EE24A1F334BE3FE5DBA28ACDBF32327C7F7000D6AE46FED6E6DECE2698B276C6AB7AB684EF8E4F7CFFFAD41C4C47FBB0ED4DD894AA999EA0800EA78074A676DBD1DE86AB01523F9498E302BAB2ED86CA5ACA94D3EB618E07BE8B9E9C7F5FB5D1A439ACE36F36655F4C96570F4A37EB8B43F797ABB5232706B85247701CF8767F8500949F3BD0D9A91907F8C1A5708EBFD6C8C9E52066399F6CAB2B9783E5FFFAEAF52238E18EC18022965FBDA57136EF9DAF4AA60FFFE8F356066D786060E1C7AF538ADB7EBFB42D1A38A05886F5E2B89BA42B9D8EC92449E90D97D7899B76D9EA14E576D572A3B01CBBAEB7A4874ED6FA67C526335B498885B9D76D6EAFFE320F35ABBFB46FA179C7C7683C67D3F2F1BA8675207BF2AFA147FB7A7F4AECF177C3FCABC3D4F4E4EC0DCE0F3B1B8FFBDFA1FCFEDAA3ECB5CD6926B120F9E3760BC8C7A52EFF807A96A2F51E247C75CFD2B29D0D8D5ADB3773690C8CD8DA32F3B78363CE4ED3317E646CC8BA9C46076C87A86E67EC19C1E7ED6570C3E5C1837646F57AAACF27BD9305B4A5C09E9AA6EC59D94D203FD2F9ED33B6973BF224E3762CA3BD5E59622DCB1BC6C65B14FA691AD47ACCD7A6263BB86875F9A3914CFB762C993FC2DDEF87B27CB41CDABEBDB04CE6AF1AD7E6CC774CA17C6FF125647876423201C360F33F5ED56771F83569C57C6E3818B7B4F7267B2FBA60D732CC9476AC65C945F4637CE660FDE8E0FD30BD7A728E274F185A39B56F757AD6E2F6BD38A49954965207A04FB55AAED0C053D2D4C88CD3C0FE91901396C0E2A2BBE0D2B055C8B71FB561F7CD807FFFD3F2FA536F92D21500537B5757F30BC7BAB78CAFFE41C05ED8F7AE68C5A5578CE6CAD91FDED824103D65B4B4BD59D80C1BFB396DF8BBB4E54D6DBC4333D6F3B278B9553ABE71C1EAE4B1DE007DDE09E03CBF74EF7616AE4961E1BBCD8B431ADDE082FF00EE24838FBF6ABDD877E9E79FEDEA9A6CF2C5853EC7936C7626A99E89AEC2346CF7717EE875609F4D9786662FE4D4C47680A08F58BF95560B8F8F1EB3C168BF2AC83C3671F0717E7470DC78BCDA3BBC06763520F8B3CFF96D8BFDF2B4B05C53F8C6C63BC4A13FECCD899C0D95F1F6C8FF7600F783FE9A7207307C7CD66B5FA3FF0077E369C7E01998B1EDF1FF00DFB37680FE34B93CC5CC42BF1ECFDAFD1FFFE0D387C3EBD7A2F60F7F7CF4F48EC7FFD4F927BA95C751CD5373B89BADB6BBF1AB8627CB4B3655EFB7E2E9AB34DB736FEE760C0B81B982897B67BFF3D798A265EEF6AF0E40B0E8909C5DC2C0CA8A0E8A4E547E84B47E8A1CE941AD44FD37B17F6E6C74322EEC3FCFF9F4ACB7EF5CD1CBF8762AF825ADDA8DEB5A5BB28A13B9F23E3D6F7D3EBE346FB0B8B3585FCC960CCD7654FEDCBFEF87FF8088C1FE6AE5D7A4C4DBA59D950A275A95B4818A8CEAA94844C878A90531850D3B3484699AD661EB408FFFD5F8F2B82082DCBCD457E5AA3031F3884F35C277322ACF39AC151D33579A77F2D3F38A6EAF032FD5F71FC4C8FA895BB5DE83AD6A7B9AEEC4B691A320A3C6823A63C5F3FD8F8AD17BD992D4D944858BC8A77F74BD3DB836CB7359E34F3BAE5C4933FDE4E391CF99AED7E1B4AC5676F584F946E303D09DF6FFAA6F6251DBE1D9F65652A4B2E8BA5534C09548A9D5EA80FA6A9035810CF9D6977FBD811ACFC78AC2F9A49D1FFFEC19FFFFD9
我的作法是
C#程式碼:
string hexdata -->儲存從攝像頭得到的資料
1. 先將HEX 轉成 BYTEARRAY
private byte[] HexStringToByteArray(string Hexstring) // HEXString to ByteArray
{
byte[] buffer;
if (Hexstring.Length % 2 == 0)
{
buffer = new byte[Hexstring.Length / 2];
for (int i = 0; i < Hexstring.Length; i += 2)
buffer[i / 2] = Convert.ToByte(Hexstring.Substring(i, 2), 16);
}
else
{
MessageBox.Show("Error : odd number");
buffer = new byte[Hexstring.Length / 2 + 1];
}
return buffer;
}
2. 再轉成JPG圖檔
byte[] imagedata = HexStringToByteArray(hexdata);
string pathfiles = @"C:\Users\user\Desktop\";
File.WriteAllBytes(pathfiles + "img001.jpg", imagedata);
但圖檔無法顯示,使用photoshop開啟會出現
[無法開啟檔案,因為JPEG標記區段長度過短,檔案可能被截去或不完全。]的訊息
請問是哪裡有錯誤嗎???? 謝謝! |
|