ارسال و دریافت در c# با پورت سریال

mzarkoob

New Member
با سلام
می خواستم با استفاده از ویژآل C# داده های ارسالی را که به پورت سریال کامپیوتر می فرستم را دریافت کنم و در یک text box نمایش بدم. همین طور متن نوشته شده در text box را از طریق پورت سریال ارسال کنم. یک برنامه در یک مقاله در اینترنت بود (http://www.4shared.com/file/5F3BpaY6/serialC.html) که فکر می کردم این کار را انجام می دهد. ولی وقتی پورت سریال را باز می کنم که داده ها را بخواند برنامه خطا می دهد:cry:. من این برنامه را هم ضمیمه می کنم.
اگر دوستان لطف کنند کمک کنند من این کار را انجام دهم خیلی ممنون می شوم.:rose:
 

پیوست ها

  • recive.rar
    36.3 کیلوبایت · بازدیدها: 356

the_king

مدیرکل انجمن
با سلام
می خواستم با استفاده از ویژآل C# داده های ارسالی را که به پورت سریال کامپیوتر می فرستم را دریافت کنم و در یک text box نمایش بدم. همین طور متن نوشته شده در text box را از طریق پورت سریال ارسال کنم. یک برنامه در یک مقاله در اینترنت بود (http://www.4shared.com/file/5F3BpaY6/serialC.html) که فکر می کردم این کار را انجام می دهد. ولی وقتی پورت سریال را باز می کنم که داده ها را بخواند برنامه خطا می دهد:cry:. من این برنامه را هم ضمیمه می کنم.
اگر دوستان لطف کنند کمک کنند من این کار را انجام دهم خیلی ممنون می شوم.:rose:

کد برنامه مشکل خاصی نداره، پورت COM1 رو با Baud Rate برابر با 9600 باز می کنه. البته بهتره که سایر
پارامتر های اساسی Port هم پیش از باز کردنش صریحا مشخص بشه.
کد های مربوط به try catch رو غیر فعال کنید تا دلیل بروز خطا مشخص بشه :
کد:
        private void button1_Click(object sender, EventArgs e)
        {
[COLOR="Silver"]            //try
            //{
[/COLOR]
               serialPort1.BaudRate = 9600;
                serialPort1.Parity = System.IO.Ports.Parity.None;
                serialPort1.StopBits = System.IO.Ports.StopBits.One;
                serialPort1.DataBits = 8;
                serialPort1.PortName = "com1";
                serialPort1.Handshake = System.IO.Ports.Handshake.XOnXOff;
[COLOR="Silver"]            //}
            //catch
            //{
            //    MessageBox.Show("پورت كردن باز در خطا ", "",
            //    MessageBoxButtons.OK, MessageBoxIcon.Error);
            //}[/COLOR]
        }
 

mzarkoob

New Member
با تشکر از توجهتان
همان طور که گفتید این کد ها را غیر فعال کردم البته همان خطای قبلی را میده. به این دستور خطا میده(تصویر خطا را ضمیمه کردم):

textBox1.Text += buffer[t].ToString() + " ";

لازم به ذکر است که من با میکرو دارم بیستا بیستا حرف A را می فرستم به پورت سریال به طوری که در نرم افزار هایبرترمینال ویندوز می توانم مشاهده کنم. ولی در اینجا نمی دونم از چه دستوری در استفاده کنم تا بتوانیم آن را نمایش بدیم و خطا نده:?::?:( همین طور چه دستوری که متن textbox را بتوانیم ارسال کنیم)
با تشکر
 

پیوست ها

  • error.JPG
    error.JPG
    69.9 کیلوبایت · بازدیدها: 61

the_king

مدیرکل انجمن
با تشکر از توجهتان
همان طور که گفتید این کد ها را غیر فعال کردم البته همان خطای قبلی را میده. به این دستور خطا میده(تصویر خطا را ضمیمه کردم):

textBox1.Text += buffer[t].ToString() + " ";

لازم به ذکر است که من با میکرو دارم بیستا بیستا حرف A را می فرستم به پورت سریال به طوری که در نرم افزار هایبرترمینال ویندوز می توانم مشاهده کنم. ولی در اینجا نمی دونم از چه دستوری در استفاده کنم تا بتوانیم آن را نمایش بدیم و خطا نده:?::?:( همین طور چه دستوری که متن textbox را بتوانیم ارسال کنیم)
با تشکر​

اون خطا مربوط به Open کردن نیست، مربوط به دسترسی به TextBox است.
پروژه پیوستی رو ببینید : recive.zip
 

پیوست ها

  • recive.zip
    41.5 کیلوبایت · بازدیدها: 481

mzarkoob

New Member
با سلام
خیلی ممنون از پاسختان. من برنامه را تست کردم و تا حدودی جواب میده. در این زمینه من سوالات زیادی دارم که فکر می کنم نیاز است بیشتر منابع مطالعاتی داشته باشیم. کتابهای آموزشی که ویژآل c# را گفته در این رابطه مطلبی نگفته یا من ندیدم. در این زمینه می توانید کتابی یا سایتی که دستوات مورد استفاده در پورت سریال در ویژآل c# به همراه مثالهای خوب باشه را معرفی کنید؟
با تشکر
 

the_king

مدیرکل انجمن
با سلام
خیلی ممنون از پاسختان. من برنامه را تست کردم و تا حدودی جواب میده. در این زمینه من سوالات زیادی دارم که فکر می کنم نیاز است بیشتر منابع مطالعاتی داشته باشیم. کتابهای آموزشی که ویژآل c# را گفته در این رابطه مطلبی نگفته یا من ندیدم. در این زمینه می توانید کتابی یا سایتی که دستوات مورد استفاده در پورت سریال در ویژآل c# به همراه مثالهای خوب باشه را معرفی کنید؟​
با تشکر

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

بهتره که به سایت های برنامه نویسی و نمونه کد هایی که در اینترنت هست مراجعه کنید.
بهترین مرجع گوگل است، توصیه می کنم عبارت serialPort1.BaudRate را در گوگل جستجو کنید.
اساسا کافیه که کمی با ساختار سخت افزاری پورت های سریال آشنا باشید چون آن مشخصه هایی که در کلاس
SerialPort هست دقیقا مطابق با همون ساختار است.

زیادی فنی یه و بیشتر اطلاعاتش به درد کسی که فقط می خواهد برنامه بنویسه و کیت مدار رو نمی سازه نمی خوره،
اما یک نگاهی به این مستند بندازید : Interfacing the Serial / RS232 Port
 

mzarkoob

New Member
بله. فکر کنم http://www.codeproject.com سایت خوبی باشه. با جستجوی serial port C# یه سری پروژه میاد که باید یکی یکی بررسی بشه. مثلا یک نمونه اش اینه که ضمیمه کردم. با باز کردن SerialPortListener.exe می توان چیزهایی که به پورت ارسال میشه را مشاهده کرد. من که اجرا کردم موردی نداشت. ولی نتونستم SerialPortListener.sln را باز کنم. حالا باید بیشتر جستجو کنم ببینم چه مثالهای دیگری است. قائدتا هم ابهامات زیادی پیدا میشه که مطرح می کنم.
 

پیوست ها

  • SerialPortListener_270410.zip
    15.2 کیلوبایت · بازدیدها: 276
  • SerialPortListenerApp_270410.zip
    7.5 کیلوبایت · بازدیدها: 196

mzarkoob

New Member
با سلام
من یه مدت روی #C کار کردم تا با کلیات و جزییات برنامه نویسی اون بیشتر آشنا بشوم. خوب در رابطه با ارسال و دریافت از پورت سریال 2 تا سوال برام پیش اومد که اگه اجازه بدید مطرح کنم.
حقیقتش من اصلاحی را که در برنامه انجام دادید را نفهمیدم چجوریه!:cry:
1- وقتی از دستور [FONT=&quot]serialPort1.Read(byte_buffer,0,10[/FONT][FONT=&quot] یا [/FONT][FONT=&quot]received_byte=serialPort1.Readbyte(); [/FONT]استفاده می کنم برای خواندن به جای حروف عدد به نمایش در می آید!! چجوری میشه به صورت ساده اون را اصلاح کرد؟ دلیلش چیه؟
من برنامه این قسمت را ضمیمه کردم. متن را در تکس باکس اول اون بالا تایپ کرده و open_write را زده ولی فقط ارسال میشه. باتون read متن را گرفته با دستور Read(byte وارد تکس باکس می کند و .. در اینجا من پایه 2 پورت سریال را به پایه 3 وصل کرده ام تا راحت بتوان تست کنم.
2- چرا در قسمت DataReceived از پورت سریال که مربوط به رویدادها میشه، می خواهیم کاری با تکس باکس انجام دهیم خطا میده؟ ولی اگر کار دیگری بخواهیم انجام بشه(مثلا تغییر رنگ یک لیبل) مشکلی نداره؟
نمی دونم در اینجا دوستمون sharin چجوری با استفاده از Invoke این مشکل را حل کردند.
با تشکر
[FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
 

پیوست ها

  • write_read.rar
    39 کیلوبایت · بازدیدها: 192

the_king

مدیرکل انجمن
با سلام
من یه مدت روی #C کار کردم تا با کلیات و جزییات برنامه نویسی اون بیشتر آشنا بشوم. خوب در رابطه با ارسال و دریافت از پورت سریال 2 تا سوال برام پیش اومد که اگه اجازه بدید مطرح کنم.
حقیقتش من اصلاحی را که در برنامه انجام دادید را نفهمیدم چجوریه!:cry:
1- وقتی از دستور [FONT=&quot]serialPort1.Read(byte_buffer,0,10[/FONT][FONT=&quot] یا [/FONT][FONT=&quot]received_byte=serialPort1.Readbyte(); [/FONT]استفاده می کنم برای خواندن به جای حروف عدد به نمایش در می آید!! چجوری میشه به صورت ساده اون را اصلاح کرد؟ دلیلش چیه؟
من برنامه این قسمت را ضمیمه کردم. متن را در تکس باکس اول اون بالا تایپ کرده و open_write را زده ولی فقط ارسال میشه. باتون read متن را گرفته با دستور Read(byte وارد تکس باکس می کند و .. در اینجا من پایه 2 پورت سریال را به پایه 3 وصل کرده ام تا راحت بتوان تست کنم.

چه کاراکتری؟ کاراکتر های ASCII؟ می توانید byte رو بصورت یک کاراکتر تبدیل کرده و نمایش بدهید اما شرط اش اینه
که بایت ها در محدوده کاراکتر های قابل نمایش باشند. در کد این شرط نوشته شده که بایت های کوچکتر از 32
بصورت معادل عددی نمایش داده شوند، چون در ویندوز کد این کاراکتر ها ظاهر نمایشی ای ندارد :
کد:
                if (buffer[t] < 32)
                {
                    s.Append(buffer[t].ToString());
                }

2- چرا در قسمت DataReceived از پورت سریال که مربوط به رویدادها میشه، می خواهیم کاری با تکس باکس انجام دهیم خطا میده؟ ولی اگر کار دیگری بخواهیم انجام بشه(مثلا تغییر رنگ یک لیبل) مشکلی نداره؟
نمی دونم در اینجا دوستمون sharin چجوری با استفاده از Invoke این مشکل را حل کردند.
با تشکر
[FONT=&quot][/FONT]
[FONT=&quot] [/FONT]
DataRecieved عملی یه که معلوم نیست کی اتفاق می افته و کی به پایان می رسه، به همین جهت با یک
نخ (Thread) جداگانه پیگیری میشه تا در حین انتظار برای دریافت اطلاعات نخ اصلی برنامه منتظر نمونه و
متوقف نشه. TextBox توسط نخ اصلی فرم مدیریت میشه و جزو منابعی است که برای دسترسی توسط سایر نخ ها
مناسب نیست. به همین جهت با استفاده از Invoke از Thread اصلی درخواست میشه که عملی رو انجام بده
که Thread فعلی درخواست انجام اش رو داره ولی خودش برای انجام دادنش دسترسی مناسب رو نداره.

برای اطلاعات بیشتر در مورد Thread و Invoke رجوع شود به :
سوال در مورد Thread
 

mzarkoob

New Member
خوب الان ما با استفاده از invoke می توانیم دریافت انجام بدیم و روی تکس باکس هم نشون بدیم.
الان یکی دو روزه دارم به ارسال خط به خط به پورت سریال کار می کنم گیر کرده!! حالا میگم گیر کجاست:
می خواهم یک فایل متنی را باز کنم که داخل یک تکس باکس یا .. نشون بده و محتویات داخل تکس باکس را یک خط یک خط بفرستم روی پورت سریال. خوب با استفاده از :
کد:
richTextBox1.Text = System.IO.File.ReadAllText(openFileDialog1.FileName);
یک صفحه باز میشه،فایلمان را باز می کنیم و داخل ریچتکس باکس نشون میده. البته ابتدا این دستور را اجرا می کردم که خطا می داد و دلیلشو نفهمیدم چرا!:
کد:
openFileDialog1.ShowDialog();
            richTextBox1.LoadFile(openFileDialog1.FileName);
حالا می خواهیم محتویات نشان داده شده را خط به خط ارسال کنیم. از خط اول تا خط آخر هر بار که یک باتون را زدیم یک خط. خوب اگه در باتون داشته باشیم:
کد:
serialPort1.WriteLine(richTextBox1.Text);
وقتی باتون را بزنیم فقط خط آخر ارسال میشه! می خوام از خط اول ارسال بشه. راه حل به نظر شما چیه؟ مسئله اینه که نمی دونم کجای یک منبع این موضوع شرح داده شده
با تشکر
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خوب الان ما با استفاده از invoke می توانیم دریافت انجام بدیم و روی تکس باکس هم نشون بدیم.
الان یکی دو روزه دارم به ارسال خط به خط به پورت سریال کار می کنم گیر کرده!! حالا میگم گیر کجاست:
می خواهم یک فایل متنی را باز کنم که داخل یک تکس باکس یا .. نشون بده و محتویات داخل تکس باکس را یک خط یک خط بفرستم روی پورت سریال. خوب با استفاده از :
کد:
richTextBox1.Text = System.IO.File.ReadAllText(openFileDialog1.FileName);
یک صفحه باز میشه،فایلمان را باز می کنیم و داخل ریچتکس باکس نشون میده. حالا می خواهیم محتویات نشان داده شده را خط به خط ارسال کنیم. از خط اول تا خط آخر هر بار که یک باتون را زدیم یک خط. خوب اگه در باتون داشته باشیم:
کد:
serialPort1.WriteLine(richTextBox1.Text);
وقتی باتون را بزنیم فقط خط آخر ارسال میشه! می خوام از خط اول ارسال بشه. راه حل به نظر شما چیه؟ مسئله اینه که نمی دونم کجای یک منبع این موضوع شرح داده شده
با تشکر

RichTextBox برای نمایش متن داخل فایل مناسبه اما وقتی دکمه رو فشار می دهید باید مشخص باشه که قبلا
چه سطری ارسال شده و حالا باید کدوم سطر ارسال بشه، در RichTextBox هم میشه سطر رو مشخص کرد
اما در کل برای اینکار مناسب نیست. باید کدی در بدنه کلاس فرم اضافه کنید که مشخص کننده شماره سطری
باشه که باید ارسال بشه :
کد:
        private void button1_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.Text = System.IO.File.ReadAllText(openFileDialog1.FileName);
                richTextBox1.HideSelection = false;
                SelectLine(0);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (richTextBox1.SelectionStart < richTextBox1.Text.Length)
            {
                int lineNumber = richTextBox1.GetLineFromCharIndex(richTextBox1.SelectionStart);
                string text = richTextBox1.Lines[lineNumber];
[COLOR="Gray"]                MessageBox.Show(text);[/COLOR]
                SelectLine(lineNumber + 1);
            }
        }

        private void SelectLine(int lineNumber)
        {
            if (richTextBox1.Lines.Length > lineNumber)
            {
                richTextBox1.SelectionStart = richTextBox1.GetFirstCharIndexFromLine(lineNumber);
                richTextBox1.SelectionLength = richTextBox1.Lines[lineNumber].Length;
            }
            else
            {
                richTextBox1.SelectionStart = richTextBox1.Text.Length;
                richTextBox1.SelectionLength = 0;
            }
        }
 

mzarkoob

New Member
خیلی ممنون . فکر کنم چیزی را که می خوام این محقق می کنه. با هر بار کلیک روی باتون 2 یک پنجره کوچیک باز میشه و اون خطی که آبی شده در تکس باکس را نشون میده و یک خط میره پایین:green: ان شاءالله که بتونم تعمیمش بدم.
 

جدیدترین ارسال ها

بالا