-
مشکل با پرت com
با سلام
من میخواستم که 1 برنامه برای کار با پرت کام تو net. بنویسم.البته تا حدودی این کار رو انجام دادم ولی با مشکلاتی روبرو شدم که از این قرار هست:
من با استفاده از کد زیر پرت رو باز میکنم و توش مینویسم البته پرت کام رو هم با یک کابل موس به 1 بردبورد وصل کردم که اگر جریان برقرار شد 1 ال ای دی روشن بشه.
تو 2 تا از این سیما همیشه جریان هست که شمارشون 3و7(یعنی پین 3 و 7) هست.سیم شماره 5 که گرند هست هم به برد وصله ولی سیم شماره 7 که باید اطلاعات از درون آن ارصال بشه هیچ تغییری نمیکنه.
حالا نمیدونم مشکل کد هست یا بردم؟ اگر میتوونید توو حل این مشکل کمکم کنید.
کد:
using System;
using System.Data;
using System.Text;
using System.Drawing;
using System.IO.Ports;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using SerialPortTerminal.Properties;
namespace SerialPortTerminal
{
public enum DataMode { Text, Hex }
public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error };
public partial class frmTerminal : Form
{
private SerialPort comport = new SerialPort();
private Color[] LogMsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red };
private bool KeyHandled = false;
/// <summary> Send the user's data currently entered in the 'send' box.</summary>
private void SendData()
{
if (CurrentDataMode == DataMode.Text)
{
//Create an ASCII encoding variable
Encoding ascii = Encoding.ASCII;
//Create an Unicode variable
Encoding unicode = Encoding.Unicode;
//Convert the string into a byte[]
byte[] unicodeBytes= unicode.GetBytes(txtSendData.Text);
//Perform the conversion from one encoding to the other
byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
//Convert the new byte[] into a char[] and then into a string.
//This is a slightly different approach to converting to illustrate
//the use of GetCharCount/GetChars
char[] asciiChar = new char[ascii.GetCharCount(asciiBytes,0,asciiBytes.Length)];
ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChar, 0);
string sNEW = new string(asciiChar);
//Send the user's text straight out the port
comport.WriteLine(sNEW);
}
else
{
try
{
//Convert the user's string of hex digits (ex: B4 CA E2) to a byte array
byte[] data = HexStringToByteArray(txtSendData.Text);
//Send the binary data out the port
comport.Write(data, 0, data.Length);
}
} txtSendData.SelectAll();
}
}
}
-
دوستان شرمنده اشتباها جواب سوال دیگه ای رو اینجا پست کردم
خیلی خیلی شرونده .
-
کدش اوون قسمتی که قرمز هستش مهمه بقیه خیلی مهم نیست.
به اوون دقت کنید...
-
سلام
حدس میزنم کد را از جایی Copy و Paste کرده اید، چون کد ناقص است.
1- پارامترهای اتصال (شماره پورت، نرخ سرعت و...) اصلاً تنظیم نشده اند.
2- پورت هیچ کجا باز نمیشود!!! مگر میشود به پورت بسته چیزی ارسال کرد؟!
3- دستور try آخر ایراد املایی دارد و احتمالاً در زمان Copy و Paste یکی از بلوکهای catch یا finally اش حذف شده.
کد زیر کمی زیاد است ولی در عوض به سه شیوه مختلف داده ها را ارسال میکند و در صورت خطا آنرا گزارش میدهد تا نحوه صحیح استفاده از دستور try هم مشخص شود.
من پورت را قبل از ارسال باز کرده و در پایان میبندم ولی شما میتواند این اعمال را در شروع و پایان برنامه انجام دهید ...
کد:
private System.IO.Ports.SerialPort comport;
private void SendData()
{
if (this.comport == null){
this.comport = new System.IO.Ports.SerialPort("COM2", 9600, System.IO.Ports.Parity.Even, 8, System.IO.Ports.StopBits.None);
//this.comport.WriteBufferSize = 1;
}
// // // // // // // // // // // // // // // // // //
try{
if (!this.comport.IsOpen) this.comport.Open();
byte[] buffer;
//Write 1
this.comport.Write("Mahdi");
//Write 2
buffer = new byte[] {1, 2, 3, 4, 5};
this.comport.Write(buffer, 0, buffer.Length);
//Write 3
buffer = System.Text.Encoding.ASCII.GetBytes("Mahdi-Ascii");
this.comport.Write(buffer, 0, buffer.Length);
}
catch (System.Exception ex) {
System.Windows.Forms.MessageBox.Show(this, ex.Message, "Error");
}
finally {
if (this.comport.IsOpen) this.comport.Close();
}
}
وسیله نهایی تان چیست؟
-
من گفته شما رو در رابطه با کامل نبودن کد قبول دارم چرا که این کد خیلی بیشتر از اونی هست که من اینجا گذاشتم. ولی من پرت رو ابتدا مقدار دهی میکنم بعد از اوون هم بازش میکنم و توش مینویسم.
ولی این مشکل من رو حل نمیکند چرا که مشکل من اینه که چه چیزی باید درون پرت بنویسم؟
و چرا در 2 سیم من همیشه جریان هست ولی در آن سیم که باید اطلاعات را که میخواهم بفرستم هیچ اتفاقی نمیفتد؟
در ضمن من 1 بردبورد دارم که در آن فقط میخواهم توانایی روشن کردن 1 ال ای دی رو پیدا کنم!!
اگر بتونی کمکم کنی خیلی ممنون میشم.
-
سلام
در مورد مشکل جریان سه احتمال دارد.
1- یا کد مشکل دارد و درست اجرا نمیشود که گمان کنم کد خودم عاری از این بند باشد!
2- یا به علت بافرینگ اینطور میشود و کلاسس صبر میکند تا داده ها به حد مشخصی برسد و بعد ارسال را شروع کند،
که من این را قبلاً هم پیشبینی کرده بودم ولی اطمینان نداشتم و کد this.comport.WriteBufferSize = 1 برای همین منظور است یعنی اگر دو اسلش اول این خط را در کدهای من بردارید بافرینگ خاموش میشود و شاید مشکل حل شود.
3- سرعت انتقال دیتا بسیار بالاتر از آن است که اگر LED به پورت متصل باشد شما روشن شدن آن را ببینید!
اگر قصدتان کنترل راحت LED است باید بگویم که پورت COM مناسب نیست (یعنی میشود ولی کمی قطعه دیجیتالی نیاز دارد) و اگر هم مناسب باشد نیاز به یک آی.سی شیفت رجیستر دارید تا وضعیت را حذف کند و بتوانید به راحتی LED را کنترل کنید.
اگر پورت برایتان مهم نیست من در لینک زیر شرحی کوتاه بر درگاه سنترونیکس یا همان LPT خودمان داده ام که فکر کنم حلال مشکل شما باشد.
h02.ir/Paper.aspx?Item=LPT-Programming
-
عرض کنم خدمتتون که من کد شما رو امتحان کردم ولی بازم جواب نگرفتم.به نظرت چقدر احتمال داره که بعلت بالا بودن سرعت اطلاعات led نتونه روشن بشه؟ اگر سر راهش 1 مقاومت بزارم مشکل حل میشه؟اگر این کار رو کردم و نشد اوون موقع چه چیزی رو امتحان کنم؟:41:
-
سلام
در درگاه سنترونیکس وقتی پینی را تغییر میدهید تا دستور صریح بعدی وضعیت حفظ میشود.
و اون نظریه سرعت بالا فقط مربوط به درگاه سریال است و تازه، شاید صحیح باشد.
اگر با توضیحاتی که در لینک داده ام و به کمک پورت Lpt باز هم نتوانسته اید Led را روشن کنید، حتماً و بلاشک جایی را اشتباه کرده اید.
لینک را مجدداً مرور کنید و با دقت بیشتری عمل کنید.
-
راه دیگه ایی وجود نداره؟؟؟
-
سلام
میبخشید در شد، کار داشتم.
کار کردن با Lpt خیلی راحت است، اگر جواب نمیدهد باید اشکال کارتان را پیدا کنید؟! نه اینکه صورت مسئله را پاک کنید.
اصلاً پایه های Led را درست وصل میکنید؟؟؟