PDA

View Full Version : سوال: دریافت بارکد از دستگاه usb



drawback
دوشنبه 04 آذر 1398, 15:08 عصر
سلام
من برای برقراری ارتباط با دستگاههای بارکدخوان usb مشکل دارم ، بعد از کلی دردسر و گشتن و ... با dll
microsoft point of service آشنا شدم اما مستندات جالبی پیدا نکردم
من میخوام بعد از اسکن بارکد فکوس روی هر آبجکت فرم که هست به آبجکتی که من میخوام انتقال داده بشه
تو اکثر جاها میگن فکوس رو روی تکسباکس ببر خودش میاد پر میکنه و کار خاصی نمیخواد بکنی اما جایی پیدا نکردم مثل پورت سریال کار کرده باشه و یه اکشن receive نوشته باشه
اگه میشه نمونه کدی یا راهنمایی بفرمایید

drawback
سه شنبه 05 آذر 1398, 12:03 عصر
بنظرتون نرم افزارهای حسابداری چطوری این کار رو انجام میدن؟

محمد رضا فاتحی
سه شنبه 05 آذر 1398, 14:47 عصر
چیزی که علی الحساب به نظرم میاد اینه که وقتی بارکد خونده میشه انتهاش اینترم فراخونی میشه شما بیاین تو رویداد KeyDown فرمتون Enter رو چک کنید و اگه فشرده شده فوکوس رو بدین به کنترلتون...فقط باید تو این رویداد یه متغیر بزارین که کاراکترهای عددی قبلی رو ذخیره کنه و موقع فوکوس بزاره تو تکسباکس مد نظرتون
البته راه حل دیگه هم داشته باشه فعلا اطلاعی ندارم

the king
سه شنبه 05 آذر 1398, 18:37 عصر
سلام
من برای برقراری ارتباط با دستگاههای بارکدخوان usb مشکل دارم ، بعد از کلی دردسر و گشتن و ... با dll
microsoft point of service آشنا شدم اما مستندات جالبی پیدا نکردم
من میخوام بعد از اسکن بارکد فکوس روی هر آبجکت فرم که هست به آبجکتی که من میخوام انتقال داده بشه
تو اکثر جاها میگن فکوس رو روی تکسباکس ببر خودش میاد پر میکنه و کار خاصی نمیخواد بکنی اما جایی پیدا نکردم مثل پورت سریال کار کرده باشه و یه اکشن receive نوشته باشه
اگه میشه نمونه کدی یا راهنمایی بفرمایید
چیزی که من به عنوان بارکد خوان میشناسم شبیه صفحه کلید عمل می کنه و کلید ها رو با یک سرعت خاصی میفرسته و انتهاش ممکنه کلید Enter رو حتی طبق تنظیماتش کلید دیگری رو بفرسته یا اصلا کلیدی در انتها نفرسته که واقعا برای برنامه نویس خیلی مهم نیست.
طبعا اگر شما از ابتدا یک کنترل Focus شده مثل TextBox داشته باشید و دخالتی هم نکنید محتویات اون TextBox بصورت خودکار پر میشه، اما چند تا مساله هست :

اگر قبل از اینکه بارکد خوان کارشو شروع کنه اون Focus روی کنترل رو نکرده باشید طبعا کلید ها هم در جای مناسب دریافت نمیشه، پس فایده نداره که بعد ارسال کلید Enter تازه بفکر Focus بیافتیم. باید قبل از ارسال اولین کاراکتر Focus شده باشه.
اگر در حین ارسال بارکد به هر دلیلی Focus تغییر کنه یا کاربر کلیدی فشار بده، اعم از اینکه کاربر دستش به ماوس و صفحه کلید بخوره یا برنامه ای هوس نشون دادن پیامی بکنه ارسال نیمه کاره میمونه و بارکد بصورت کامل دریافت نمیشه.
اگه توقع داشته باشیم که حتما در انتها کلید Enter ارسال بشه شاید اصلا بارکد خوان مدل فلان همچین کاری رو نکنه و تا ابد منتظر بمونیم یا مجبور بشیم خودمون بارکد دریافتی رو دستی با کلیک یا Enter تایید کنیم.


پس چه کنیم؟ کلید ها رو بدون توجه به کنترلی که Focus داره در حافظه مجزایی دریافت کنیم و هر وقت دیدیم بعد یک مدت زمانی کلید جدیدی دریافت نشد یا کلید Enter دریافت شد، دریافت رو خاتمه یافته فرض کنیم و حالا از بارکد هر جا لازمه استفاده کنیم.
برای ما مهم نیست که Focus روی چه کنترلی باشه چون هر چی کلید دریافت میشه قبل از اینکه به کنترل های روی فرم برسه توسط خود فرم پردازش میکنیم، حتی وقتی یک Button روی فرم Focus داره Enter اول توسط ما پردازش میشه :


public partial class Form1 : Form
{
private StringBuilder _barcode = new StringBuilder();
private DateTime _lastTime;
private const int Timeout = 1000; // 1000 milliseconds
private const string BarcodeChars = "0123456789";

public Form1()
{
InitializeComponent();
}

private void BarcodeReceived(string barcode)
{
textBox1.Text = barcode;
}

private void Form1_Load(object sender, EventArgs e)
{
KeyPreview = true;
var timer = new Timer { Interval = 200, Enabled = true };
timer.Tick += timer_Tick;
}

private void timer_Tick(object sender, EventArgs e)
{
if (_barcode.Length > 0)
{
if (DateTime.Now.Subtract(_lastTime).TotalMillisecond s >= Timeout)
{
BarcodeReceived(_barcode.ToString());
_barcode.Length = 0;
}
}
}

protected override bool ProcessDialogKey(Keys keyData)
{
if ((keyData == Keys.Return) && (_barcode.Length > 0))
{
BarcodeReceived(_barcode.ToString());
_barcode.Length = 0;
return true;
}
return base.ProcessDialogKey(keyData);
}

protected override void OnKeyPress(KeyPressEventArgs e)
{
if (BarcodeChars.IndexOf(e.KeyChar) >= 0)
{
_lastTime = DateTime.Now;
_barcode.Append(e.KeyChar);
e.Handled = true;
}
base.OnKeyPress(e);
}
}


من Timeout رو روی یک ثانیه و کاراکتر های بارکد رو 0 الی 9 در نظر گرفتم، اگه لازمه کاراکتر های دیگه داخل بارکد رو به BarcodeChars اضافه کنید.

drawback
چهارشنبه 06 آذر 1398, 14:05 عصر
چیزی که علی الحساب به نظرم میاد اینه که وقتی بارکد خونده میشه انتهاش اینترم فراخونی میشه شما بیاین تو رویداد KeyDown فرمتون Enter رو چک کنید و اگه فشرده شده فوکوس رو بدین به کنترلتون...فقط باید تو این رویداد یه متغیر بزارین که کاراکترهای عددی قبلی رو ذخیره کنه و موقع فوکوس بزاره تو تکسباکس مد نظرتون
البته راه حل دیگه هم داشته باشه فعلا اطلاعی ندارم
تا اینجا که دیتاشیت های بارکد رو خوندم و تست زدم بارکدخوان ها فقط اعداد رو میفرستن + رویداد Enter یا خالی ( اول و انتهای بارکدخوان ها با هم فرق میکنه)
جدا از بارکدخوان خود بارکد با استاندارد تولیدیش هم میتونه موثر باشه !
مثلا Code128a با بارکدخوان ساخت چین فقط تهش "Enter" میندازه! ولی با بارکدخوان ساخت ویتنام تهش "." مینداره
نمیتونم فقط به یه کاراکتر خواص حساس باشم

drawback
چهارشنبه 06 آذر 1398, 14:16 عصر
چیزی که من به عنوان بارکد خوان میشناسم شبیه صفحه کلید عمل می کنه و کلید ها رو با یک سرعت خاصی میفرسته و انتهاش ممکنه کلید Enter رو حتی طبق تنظیماتش کلید دیگری رو بفرسته یا اصلا کلیدی در انتها نفرسته که واقعا برای برنامه نویس خیلی مهم نیست.
طبعا اگر شما از ابتدا یک کنترل Focus شده مثل TextBox داشته باشید و دخالتی هم نکنید محتویات اون TextBox بصورت خودکار پر میشه، اما چند تا مساله هست :

اگر قبل از اینکه بارکد خوان کارشو شروع کنه اون Focus روی کنترل رو نکرده باشید طبعا کلید ها هم در جای مناسب دریافت نمیشه، پس فایده نداره که بعد ارسال کلید Enter تازه بفکر Focus بیافتیم. باید قبل از ارسال اولین کاراکتر Focus شده باشه.
اگر در حین ارسال بارکد به هر دلیلی Focus تغییر کنه یا کاربر کلیدی فشار بده، اعم از اینکه کاربر دستش به ماوس و صفحه کلید بخوره یا برنامه ای هوس نشون دادن پیامی بکنه ارسال نیمه کاره میمونه و بارکد بصورت کامل دریافت نمیشه.
اگه توقع داشته باشیم که حتما در انتها کلید Enter ارسال بشه شاید اصلا بارکد خوان مدل فلان همچین کاری رو نکنه و تا ابد منتظر بمونیم یا مجبور بشیم خودمون بارکد دریافتی رو دستی با کلیک یا Enter تایید کنیم.


پس چه کنیم؟ کلید ها رو بدون توجه به کنترلی که Focus داره در حافظه مجزایی دریافت کنیم و هر وقت دیدیم بعد یک مدت زمانی کلید جدیدی دریافت نشد یا کلید Enter دریافت شد، دریافت رو خاتمه یافته فرض کنیم و حالا از بارکد هر جا لازمه استفاده کنیم.
برای ما مهم نیست که Focus روی چه کنترلی باشه چون هر چی کلید دریافت میشه قبل از اینکه به کنترل های روی فرم برسه توسط خود فرم پردازش میکنیم، حتی وقتی یک Button روی فرم Focus داره Enter اول توسط ما پردازش میشه :


public partial class Form1 : Form
{
private StringBuilder _barcode = new StringBuilder();
private DateTime _lastTime;
private const int Timeout = 1000; // 1000 milliseconds
private const string BarcodeChars = "0123456789";

public Form1()
{
InitializeComponent();
}

private void BarcodeReceived(string barcode)
{
textBox1.Text = barcode;
}

private void Form1_Load(object sender, EventArgs e)
{
KeyPreview = true;
var timer = new Timer { Interval = 200, Enabled = true };
timer.Tick += timer_Tick;
}

private void timer_Tick(object sender, EventArgs e)
{
if (_barcode.Length > 0)
{
if (DateTime.Now.Subtract(_lastTime).TotalMillisecond s >= Timeout)
{
BarcodeReceived(_barcode.ToString());
_barcode.Length = 0;
}
}
}

protected override bool ProcessDialogKey(Keys keyData)
{
if ((keyData == Keys.Return) && (_barcode.Length > 0))
{
BarcodeReceived(_barcode.ToString());
_barcode.Length = 0;
return true;
}
return base.ProcessDialogKey(keyData);
}

protected override void OnKeyPress(KeyPressEventArgs e)
{
if (BarcodeChars.IndexOf(e.KeyChar) >= 0)
{
_lastTime = DateTime.Now;
_barcode.Append(e.KeyChar);
e.Handled = true;
}
base.OnKeyPress(e);
}
}


من Timeout رو روی یک ثانیه و کاراکتر های بارکد رو 0 الی 9 در نظر گرفتم، اگه لازمه کاراکتر های دیگه داخل بارکد رو به BarcodeChars اضافه کنید.
این روش رو به نوعی دیگه تست زدم و برام جالب نبود و در شرایطی درست کار نمیکرد !
من روی برنامه های حسابداری که تست زدم همه رو درست دریافت میکرد و نشون میداد
یچیزی شبیه به کاری که اونت receive پورت سریال ولی با این تفاوت که براش مهم نیست چه پورتی کانکت شده و چی میفرسته

the king
چهارشنبه 06 آذر 1398, 14:21 عصر
تا اینجا که دیتاشیت های بارکد رو خوندم و تست زدم بارکدخوان ها فقط اعداد رو میفرستن + رویداد Enter یا خالی ( اول و انتهای بارکدخوان ها با هم فرق میکنه)
جدا از بارکدخوان خود بارکد با استاندارد تولیدیش هم میتونه موثر باشه !
مثلا Code128a با بارکدخوان ساخت چین فقط تهش "Enter" میندازه! ولی با بارکدخوان ساخت ویتنام تهش "." مینداره
نمیتونم فقط به یه کاراکتر خواص حساس باشم
من هم همین نظر رو دارم. به همین جهت کدی نوشتم که وابسته به اون کلید انتهایی نباشه و چه بفرسته و چه نفرسته کار نکنه.
زمانی که امکانش هست که بدون نیاز به اون کلید انتهایی برنامه نویسی کنیم دلیلی نداره که خودمون رو وابسته به یک شرایطی کنیم که اتفاق افتادنش قطعی نیست و اما و اگر داره.

drawback
چهارشنبه 06 آذر 1398, 14:22 عصر
الان داشتم یه برنامه دیگه رو برسی میکردم تو dll هایی که داره


Microsoft.PointOfService.Management
Microsoft.PointOfService
Microsoft.PointOfService.ControlBase
سری کامل
OPOS
و
Pos

استفاده میکنه ، نمیشه آنپکشم کرد دید چی نوشته و از چی استفاده کرده :لبخند::لبخند:

the king
چهارشنبه 06 آذر 1398, 14:23 عصر
این روش رو به نوعی دیگه تست زدم و برام جالب نبود و در شرایطی درست کار نمیکرد !
من روی برنامه های حسابداری که تست زدم همه رو درست دریافت میکرد و نشون میداد
یچیزی شبیه به کاری که اونت receive پورت سریال ولی با این تفاوت که براش مهم نیست چه پورتی کانکت شده و چی میفرسته

روش دیگه که بکار بردید رو که نمی دونم چیه، کدش رو که نمی بینم، ولی اگر این کد رو به همین شکل که نوشتم اجرا کردید و مشکلی داره حتما اعلام کنید تا بررسی کنیم و برطرفش کنیم.

the king
چهارشنبه 06 آذر 1398, 14:28 عصر
الان داشتم یه برنامه دیگه رو برسی میکردم تو dll هایی که داره


Microsoft.PointOfService.Management
Microsoft.PointOfService
Microsoft.PointOfService.ControlBase
سری کامل
OPOS
و
Pos

استفاده میکنه ، نمیشه آنپکشم کرد دید چی نوشته و از چی استفاده کرده :لبخند::لبخند:
اون POS for .NET ئه که مایکروسافت مستنداتش رو هم در سایتش قرار داده و بارکدخوان فقط و فقط یک بخش خیلی خیلی کوچیک از سخت افزار هایی است که باهاشون کار می کنه، POS for .NET خیلی دامنه کاریش بزرگتر از بارکد خوانی است.
با این سخت افزار ها کار می کنه، هر چیزی که توی یک فروشگاه مدرن و بزرگ میتونه باشه :


Bar Code Scanner
Belt
Bill Acceptor
Bill Dispenser
Biometrics
Bump Bar
Cash Changer
Cash Drawer
Check Scanner
Coin Acceptor
Coin Dispenser
Credit Authorization Terminal (CAT)
Electronic Journal
Electronic Value Reader/Writer
Fiscal Printer
Gate
Hard Totals
Image Scanner
Item Dispenser
Keylock
Lights
Line Display
Magnetic Ink Character Recognition Reader (MICR)
Magnetic Stripe Reader (MSR)
Motion Sensor
PIN Pad
Point Card Reader/Writer
POS Keyboard
POS Printer
Radio Frequency Identification (RFID) Scanner
Remote Order Display
Scale
Signature Capture
Smart Card Reader/Writer
Tone Indicator

the king
چهارشنبه 06 آذر 1398, 14:44 عصر
اینم یک شبیه ساز بارکد خوان. ارسال با فشار دادن ترکیب کلیدی (کلید ویندوز) + کلید Z

151037

فایل اجرایی :
151038

کد منبع :
https://github.com/mroach/barcode-simulator

drawback
چهارشنبه 06 آذر 1398, 15:19 عصر
روش دیگه که بکار بردید رو که نمی دونم چیه، کدش رو که نمی بینم، ولی اگر این کد رو به همین شکل که نوشتم اجرا کردید و مشکلی داره حتما اعلام کنید تا بررسی کنیم و برطرفش کنیم.
کد شما رو تست زدم تنها مشکلش شرط عدد بود که پاک کردم
و کد شما کار میکنه! تا وقتی که کسی به کیبورد دست نزنه

drawback
چهارشنبه 06 آذر 1398, 15:39 عصر
اینم یک شبیه ساز بارکد خوان. ارسال با فشار دادن ترکیب کلیدی (کلید ویندوز) + کلید Z

151037

فایل اجرایی :
151038

کد منبع :
https://github.com/mroach/barcode-simulator
من هر چقدر با این نرم افزار کار کردم هیچ اتفاقی نیوفتاد

drawback
چهارشنبه 06 آذر 1398, 15:39 عصر
اون POS for .NET ئه که مایکروسافت مستنداتش رو هم در سایتش قرار داده و بارکدخوان فقط و فقط یک بخش خیلی خیلی کوچیک از سخت افزار هایی است که باهاشون کار می کنه، POS for .NET خیلی دامنه کاریش بزرگتر از بارکد خوانی است.
با این سخت افزار ها کار می کنه، هر چیزی که توی یک فروشگاه مدرن و بزرگ میتونه باشه :


Bar Code Scanner
Belt
Bill Acceptor
Bill Dispenser
Biometrics
Bump Bar
Cash Changer
Cash Drawer
Check Scanner
Coin Acceptor
Coin Dispenser
Credit Authorization Terminal (CAT)
Electronic Journal
Electronic Value Reader/Writer
Fiscal Printer
Gate
Hard Totals
Image Scanner
Item Dispenser
Keylock
Lights
Line Display
Magnetic Ink Character Recognition Reader (MICR)
Magnetic Stripe Reader (MSR)
Motion Sensor
PIN Pad
Point Card Reader/Writer
POS Keyboard
POS Printer
Radio Frequency Identification (RFID) Scanner
Remote Order Display
Scale
Signature Capture
Smart Card Reader/Writer
Tone Indicator

اینم تست میزنم ببینم این یکی رو حداقل میتونم جواب بگیرم یا نه :گریه:

the king
چهارشنبه 06 آذر 1398, 16:48 عصر
من هر چقدر با این نرم افزار کار کردم هیچ اتفاقی نیوفتاد

اجراش می کنید، در قسمت Add Code یک شماره بارکد دلخواه می نویسید و Enter رو میزنید که به لیست اضافه بشه. بعد برنامه #C خودتون رو باز می کنید و موقعی که فرم برنامه خودتون Focus داره یک ترکیب کلیدی رو فشار میدید.
ترکیب کلیدی (کلید ویندوز) + کلید Z رو که همزمان فشار بدید اون بارکد دلخواه ارسال میشه و فرم میگیرتش.

drawback
چهارشنبه 06 آذر 1398, 16:49 عصر
هیچ رقمه این pos for .net یا همون point of service دستگاه رو نمیشناسه

drawback
چهارشنبه 06 آذر 1398, 16:53 عصر
اجراش می کنید، در قسمت Add Code یک شماره بارکد دلخواه می نویسید و Enter رو میزنید که به لیست اضافه بشه. بعد برنامه #C خودتون رو باز می کنید و موقعی که فرم برنامه خودتون Focus داره یک ترکیب کلیدی رو فشار میدید.
ترکیب کلیدی (کلید ویندوز) + کلید Z رو که همزمان فشار بدید اون بارکد دلخواه ارسال میشه و فرم میگیرتش.
بله ، این کار رو میکنم ولی چیزی فرستاده نمیشه
نشانگر متن از چشمک زدن دست میکشه ولی متنی ارسال نمیشه

the king
چهارشنبه 06 آذر 1398, 17:32 عصر
بله ، این کار رو میکنم ولی چیزی فرستاده نمیشه
نشانگر متن از چشمک زدن دست میکشه ولی متنی ارسال نمیشه

کد برنامه رو که تغییر ندادید؟ لطفا برنامه Notepad یا Microsoft Word رو باز کنید رو اونجا در حالی که برنامه Barcode Simulator یک بارکد ثبت شده داره و پنجره اش بسته نشده ترکیب کلیدی رو فشار بدید.
اگر به Notepad و برنامه های مشابه چیزی ارسال نشد معلومه که کلید Win تون مشکلی با این برنامه داره.

151039

drawback
پنج شنبه 07 آذر 1398, 08:50 صبح
کد برنامه رو که تغییر ندادید؟ لطفا برنامه Notepad یا Microsoft Word رو باز کنید رو اونجا در حالی که برنامه Barcode Simulator یک بارکد ثبت شده داره و پنجره اش بسته نشده ترکیب کلیدی رو فشار بدید.
اگر به Notepad و برنامه های مشابه چیزی ارسال نشد معلومه که کلید Win تون مشکلی با این برنامه داره.

151039
:لبخند: ممنون از پیگیریتون ، برنامه رو تغییر ندادم ، کد رو دستکاری نکردم ، تو Notepad ، word ، Wordpad تست زدم ، فقط نشانگر مکان نمای متن قفل میشه ! ، کلیدهای کیبرد کار میکنه ! این برنامه کلا با چیزی که من میخوام زمین تا آسمون فرق داره ! من دستگاهش رو دارم میخوام بفهمم چطور ازش به سیستم من داده ارسال شده!

رامین مرادی
پنج شنبه 07 آذر 1398, 09:40 صبح
کد برنامه رو که تغییر ندادید؟ لطفا برنامه Notepad یا Microsoft Word رو باز کنید رو اونجا در حالی که برنامه Barcode Simulator یک بارکد ثبت شده داره و پنجره اش بسته نشده ترکیب کلیدی رو فشار بدید.
اگر به Notepad و برنامه های مشابه چیزی ارسال نشد معلومه که کلید Win تون مشکلی با این برنامه داره.

151039


من با دوتا سیستم تست کردم(لپتاب وpc ) رو هیچکدوم برنگردوند.

Mahmoud.Afrad
یک شنبه 10 آذر 1398, 05:05 صبح
سلام
من برای برقراری ارتباط با دستگاههای بارکدخوان usb مشکل دارم ، بعد از کلی دردسر و گشتن و ... با dll
microsoft point of service آشنا شدم اما مستندات جالبی پیدا نکردم
من میخوام بعد از اسکن بارکد فکوس روی هر آبجکت فرم که هست به آبجکتی که من میخوام انتقال داده بشه
تو اکثر جاها میگن فکوس رو روی تکسباکس ببر خودش میاد پر میکنه و کار خاصی نمیخواد بکنی اما جایی پیدا نکردم مثل پورت سریال کار کرده باشه و یه اکشن receive نوشته باشه
اگه میشه نمونه کدی یا راهنمایی بفرمایید

فعلا شما یک ویرایشگر متن (مثلا notepad ) باز و با دستگاه یک بارکد را اسکن کنید ببینید چیزی توی ویرایشگر درج میشه یا نه.

ROSTAM2
یک شنبه 10 آذر 1398, 07:46 صبح
سلام. من ی بارکدخون دارم که کابلش قدیمیه و خراب شده و ک ps2 هستش و می خوام تبدیلش کنم به usb برای خرید کابل مورد نظر آیا مدل بارکدخون (barcode scanner) هم مهمه؟؟ به فرض مثال من میدونم دستگاه metrologic هستش ولی مدلش نمی دونم! :متفکر:

md3848
یک شنبه 10 آذر 1398, 14:39 عصر
سلام/خو تبدیل ps2 to usb بخر و تمام.
البته سوکت یه بحثیه - پروتکول یه بحث دیگه، شاید سوکتش ps2 باشه اما پروتکولش مثلا سریال باشه :لبخند:

drawback
دوشنبه 11 آذر 1398, 07:55 صبح
فعلا شما یک ویرایشگر متن (مثلا notepad ) باز و با دستگاه یک بارکد را اسکن کنید ببینید چیزی توی ویرایشگر درج میشه یا نه.
سلام ، بله ارسال میشه حتی کدی که The King (https://barnamenevis.org/member.php?259237-the-king) گذاشتن کار میکنه ، ولی من دنبال گرفتن خود بارکد از اسکنر هستم نه چیز دیگه

و یه نکته ی دیگه اینکه پروتوکلی که استفاده شده usb هست و سریال و اترنت نیست