PDA

View Full Version : Transfered wav file to hex file



mohsen_2005
جمعه 08 مهر 1384, 12:03 عصر
با عرض سلام
من یک فایل با پسوند wav با سرعت 8 k bit و بصورت مونو ذخیره کرده ام و میخواهم فایل مورد نظر را بصورت یک فایل هگز دربیاورم چگونه باید از فایل مورد نظر بخونم.
در ضمن وقتی فایل را بصورت باینری باز میکنم به ازای یک حرف بعضی وقتها چندین hex تولید مینماید.
ممنون میشم راهنماییم کنید

Inprise
شنبه 09 مهر 1384, 14:29 عصر
چیزی بنام "فایل هگز" معنی فنی نداره . بگو دقیقا" جکار میخواهی بکنی تا جواب بگیری .

mohsen_2005
یک شنبه 10 مهر 1384, 11:58 صبح
من رشتم الکترونیکه فایل هگز جهت انتقال اون به پورت سریال است و من لازم دارم تا اونو بتونم به یک سیستم مدیا پلیر خروجی انتقال بدم
ممنون

Inprise
یک شنبه 10 مهر 1384, 13:49 عصر
فایل مورد نظرت رو روی مود باینری باز کن - بخون - بفرست .

mohsen_2005
یک شنبه 10 مهر 1384, 21:52 عصر
مهندس جان من همین کار را کردهام ولی به ازائ بعضی کدها درست کار نمی کند علت چیست؟؟؟؟؟؟؟؟؟؟

mohsen_2005
دوشنبه 11 مهر 1384, 08:45 صبح
کسی نیست به من جواب بدهد دوست عزیز یک بار خودت امتحان کن ببین چه مشکلی برات پیش میاد!!!!!!!!!!!!!!!!!!!!!!

Inprise
دوشنبه 11 مهر 1384, 16:40 عصر
-درخواست یا سوالت رو تکرار نکن . اگر کسی قرار باشه جواب بده به اولی جواب خواهد داد.
- قاعدتا" خوندن باینری فایل و ارسال اون به Player باید کافیه باشه و اگر نیست یا داری روند خوندن رو بد انجام میدی یا ارسال به Player مشکل داره یا Player ات یک مشکلی داره ؛ باید بیشتر توضیح بدی ، نمونه کدت رو بگذاری ، فایل صوتی مشکلدار رو ضمیمه کنی و غیره تا بشه کمک کرد ، و الا بندگان خدا علم غیب ندارند .

روز خوش

seyedof
دوشنبه 11 مهر 1384, 16:47 عصر
سلام
احتمالا با بایتهایی که از 127 بیشتر هستند مشکل دارید. دلیلش اینکه که یا توی کد ارسالتون از نوع char استفاده کرده اید یا پورت سریال رو با استاندارد 7 بیتی باز کردید نه ۸ بیتی (

Blaster
دوشنبه 11 مهر 1384, 22:05 عصر
اگر می خوای Hex بفرستی باید اون رو به شکل Ascii تبدیل کنی وبعد اون رو ارسال کنی، یعنی 21h رو به صورت یک String حاوی "21" تبدیل کنی و بعد ارسال کنی . این روش معمول بین دوستان الکترونیکی هست . در هر صورت این تبدیلات در سخت افزار مورد نظر انجام میشه و باید بین دو طرف استفاده کننده از پورت سریال به طور توافقی مشخص بشه.

mohsen_2005
سه شنبه 12 مهر 1384, 10:58 صبح
با تشکر از تمامی دوستانی که به من راهنمایی کردم و معذرت از اینکه سوالم را تکرار کردم قصد بی احترامی نداشتم و مطمئنن سوال من ناقص بوده. اینو هم به تازه واردی من ببخشید.

و فکر میکنم حق با مدیر بخش بوده چون دقیقن همین مشکل را دارم یعنی از 127 به بعد را نمیتوانم بخونم و حتی اگر بجای کاراکتر یک اینتیجر نیز تعریف بکنم مشکلم حل نمیشه چیکار باید بکنم ؟؟
کدهایی را که خودم نوشتم براتون می فرستم.
FILE *in,*out;
char ch;
in=fopen("c:one.wav","rb");
out=fopen("c:tow.txt","w");
while(!feof(in))
{
ch=getc(in);
fprintf(out,"%x",ch);
}
fcloseall();
ممنون میشم جواب بدهید.
اینم یه قسمت از کد ورودی که من می خونم .
RIFF¤Ô__WAVEfmt ________@___@_______data€Ô__€€€€€€ €€€€€€€€€€€€€€€€ €€€€€€€€€€€€€
و اینم کد خروجی تولید شده
52494646ffffffa4ffffffd40057415645666d742010000101 0401f00401f00108064617461ffffff80ffffffd400fffff
االبته اگر به جای هگز اینتیجر بگذارم کد بزرگتر از 127 تولید نمینماید و کد بالایی هم به ازاء یک کد خاص که خالی است چندیدن کد ffff تولید مینماید.
ممنون میشم راهنماییم کنید.

راستی با تشکر از کاربر blaster و جواب ایشان بهشون می گم که برای انتقال اطلاعات بصورت سریال اینکه من بصورت استرینگ دربیارم و بفرستم نه بهینه است و نه منطقی.
مهمترین دلیلش این است که مثلن اگر شما بخواهید یک عدد فلوت را انتقال دهید این عدد در حالت عادی چهار بایت است ولی وقتی بصورت استیرینگ انتقال میدهید اماکن دارد یک بار 4 بایت و یک بار ده بایت باشد و مطمئنن دقت کار نیز پایین میاد.
و تازه اگر بخواهید این اعداد را جایی هم ذخیره کنید مثلن یک eeprom خارجی تازه دردسر شروع میشه که اونوقت یک بایت هم یک بایته:

راستی اگر کسی یه متنی درباره نوع ذخیره اطلاعات فایلهای موسیقی wav و mp3 دارد ممنون میشم در اختیار من بذاره و بخصوص درباره بایتهای تعیین کننده توع فرمت wav.

ممنون از همه دوستان.

seyedof
شنبه 16 مهر 1384, 10:02 صبح
سلام
پورت رو به صورت هشت ان یک باز کنید نه مثلا هفت ان دو ! ببخشید نتونستم انگلیسی تایپ کنم. اینها پارامترهای برقراری ارتباط سریال هست که فکر کنم بدونید N یعنی پریتی نمیخواهید و هشت یعنی اینکه بیتهای داده هاتون ۸ بیتی است. مشکل شما اینه که چون پورت ارتباط ۷ بیتی باز شده نمیتونه اطلاعات ۸ بیتی رو بفرسته یعنی بایتهای بیشتر از ۱۲۷ رو.
حالا من نمیدونم که توی کدوم محیط برنامه نویسی میکنید ولیکن فکر کنم با یک سرچ کوچیک توی گوگل به راحتی بتونید روتینهای مربوط به پورت سریال رو با امکان تنظیم نوع ارتباط هشت ان یک پیدا کنید من تا اینجاش هستم که مشکل رو پیدا کردم و راهنمایی کنم بقیه با خودتون.
کار راحتیه.
ممنون علی

mohsen_2005
شنبه 16 مهر 1384, 22:48 عصر
علی اقا ممنون از جوابتون
راستشو بخواین من تمام این پروتکلهای ارتباطی رو کار کردم و دقیقن میدونم پریتی و سایر اونها تو تنظیمات چیه ولی مشکل من همون کد هگزی است که میسازم چون کد هگزی که با ویژوال سی میسازم بیشتر از 127 نداره یعنی هفت بیتیه و سوالم دقیقمن اینه که تو اون برنامه ای که نوشتم به جای کاراکتر چه متغیری باید بگذارم تا جواب بدد ممنون میشم جواب بدهید. البته امیدوارم منظورم رو درست رسونده باشم. بای

seyedof
یک شنبه 17 مهر 1384, 03:10 صبح
سلام
unsigned char
ممنون علی

Blaster
دوشنبه 18 مهر 1384, 11:29 صبح
دوست عزیز فرقی نداره از چه نوع متغیری استفاده می کنی ! فقط قبل از ارسال اون کاراکتر رو با 7F (برای اطمینان) AND بیتی کن.

mohsen_2005
دوشنبه 18 مهر 1384, 12:48 عصر
ببخشید من الان جواب گرفتم ولی دلیل اینکار شما رو متوجه نمیشم چرا باید اینکار را کرد منظورم
and
بیتی است
ممنون میشم جواب بدهید.
بای

Blaster
سه شنبه 19 مهر 1384, 16:40 عصر
دوست عزیز برای کامپیوتر و پورت سریال char با unsigned char هیچ فرقی نداره . اینها فقط توسط کامپایلر معنی پیدا می کنه ! اون and بیتی با 7F هم باعث می شه که بیت اخر کاراکتر مورد نظر همیشه صفر بشه در نتیجه شما هیچ وقت کد بیشتر از 127 روی پورت نخواهید داشت !

mohsen_2005
سه شنبه 19 مهر 1384, 17:00 عصر
ممنون از جواب شما

seyedof
سه شنبه 19 مهر 1384, 17:17 عصر
سلام
خب اینطوری که داده ها خراب میشن. شما دارید یک بیت با ارزش از اطلاعات رو حذف میکنید.
ممنون علی

Blaster
چهارشنبه 20 مهر 1384, 11:20 صبح
سلام،
جناب seyedof عزیز ،بعضی مواقع اون بیت با ارزش معنایی مشخصی روی پورت پیدا می کنه . مثلا نشان دهنده آدرسه .و باتوجه به خطاهای نرم افزاری ممکنه که اون بیت با ارزش یه جایی اشتباهی ست بشه و باعث بروز مشکل بشه .برای همین قبل از ارسال اون روی پورت باید حذف بشه. یا الگوریتمی که کاراکترها رو برای پورت اماده می کنه باید این اطمینان رو بده که هیچ کاراکتری ، کدی بالای 127 نداشته باشه . برای همینه که اطلاعات اغلب به صورت Ascii ارسال میشه.

mohsen_2005
پنج شنبه 21 مهر 1384, 01:21 صبح
نظر من هم همین است این برای وقتی درست است که ما تمام اطلاعات را بصورت استرینگ دراورده و بعد بفرستیم ولی خیلی وقتها ایطوری نیست مثلن همین کار من خیلی اطلاعات من بیشتر از 127 است بخاطر همین باعث از بین رفتن اطلاعات میشود.
با تشکر

seyedof
پنج شنبه 21 مهر 1384, 15:07 عصر
سلام
ولله من خیلی اینکارو کردم و مشکلی هم نداشته. وقتی پورت در مود ۸ بیتی کار میکنه یعنی ۸ بیت Data و این یعنی اوون ۸ بیت داده هستند نه اطلاعات کنترلی. اگر این چیزی که شما میگین درست باشه پس باید فاتحه پورت rs232 رو خوند.
مشکل در یکی از جاهایی است که مثلا میخواهید اطلاعات رو ارسال کنید. شاید از نوع signed استفاده شده و بعد به نوع unsigned تبدیل شده. این تبدیل میتونه عدد رو خراب کنه.
خودم شخصا اینکارو ۲-۳ بار انجام دادم واسه همین هم مطمئنم که اگر اشکالی وجود نداشته باشه حتما کار میکنه.
ممنون علی

Blaster
دوشنبه 25 مهر 1384, 10:10 صبح
سلام ،
تبدیل عدد signed به unsigned عدد رو خراب می کنه ولی برای برنامه نه پورت سریال ! چون این دو عدد اصولا به یک شکل در حافظه ذخیره میشن . به عنوان مثال 1- و 255 در یک بایت به صورت 1111 1111 ذخیره میشن . پس فرقی نداره که ما 1- یا 255 رو ارسال کنیم . قبلا هم اشاره کردم که این یک قرارداد بین دو طرف استفاده کننده از پورت هست . یعنی اینکه عددی که به صورت 1111 1111 دریافت شده رو 1- یا 255 تفسیر کنند.

seyedof
دوشنبه 25 مهر 1384, 10:44 صبح
سلام
به شرط اینکه جایی تبدیل صورت نگیره یعنی مثلا یک بافر در حافظه باشه و آدرسش رو بدیم و بفرستیم روی پورت. ولی اگه توی برنامه تبدیل شده باشه خرابش میکنه.
ممنون علی

Blaster
سه شنبه 26 مهر 1384, 11:31 صبح
سلام،
کاملا درسته . و اگر هم داخل برنامه تبدیل بشه باید فرم باینری اعداد حفظ بشه.