PDA

View Full Version : سوال: SerialPort



python_85
دوشنبه 14 مرداد 1392, 22:40 عصر
سلام
من می خوام یکسری بسته اطلاعاتی رو از پورت کام بخونم و یه سری نمودار رو از روی این دیتا ها آنلاین نشون بدم
با خوندن اطلاعات مشکلی ندارم
مشکلم نویزی که تو بسته هام وجود داره
تقریبا(البته رندوم) از هر 1000 بسته 10 تاش دارای نویز هستند.
نکته جالب اینه که پورت رو با کدویژن و یه تستر که با پایتون نوشتم تست کردم دیتا ها بدون نویز بودن!!!!! :عصبانی++: :گیج: :گیج::عصبانی++:
آیا مشکل از کامپوننت سریال .net هست؟؟؟
می خواستم بپرسم تا حالا کسی به این مشکل بر خورد کرده؟راه حلی براش وجود داره؟

m.khani_121
دوشنبه 14 مرداد 1392, 22:59 عصر
تو هر بسته پورت رو باز و بسته میکنی ؟

python_85
دوشنبه 14 مرداد 1392, 23:14 عصر
نه
از طریق رویداد data receive از رسیدن داده ها مطلع می شم و پورت رو می خونم

در ضمن یه تستر واسه سمت ارسال کننده دیتا با خود .net نوشتم که همون بسته رو روی پورت ارسال می کنه نو این تست تو دیتا ها نویز وجود نداره
فقط وقتی که دیتا از طریق میکرو ارسال میشه برنامه دات نتیم با مشکل نویز مواجه میشه

m.khani_121
دوشنبه 14 مرداد 1392, 23:28 عصر
نویز به طول کابلتم بستگی داره ، در ضمن تو طول فرستادن دیتا پورت نباید باز و بسته بشه . تو sleep ، DataReceived گذاشتی ؟

python_85
دوشنبه 14 مرداد 1392, 23:35 عصر
همون طوری که گفتم پورت رو باز و بسته نمی کنم و از sleep هم استفاده نکردم!
تو حالتی که با پایتون و کدویژن چک می کنم با حالت دات نتی شرایط یکسان هستند

بازم ممنون

m.khani_121
دوشنبه 14 مرداد 1392, 23:42 عصر
یه sleep 300 بزار

کدتا بزار ببینم

hojjatshariffam
سه شنبه 15 مرداد 1392, 00:51 صبح
من فکر کنم از تنظیمات پورت سریالت باید باشه
احتمالا تو یه سری تنظیمات رو ست نمی کنی و دفالت از دات نت استفاده میشه ، برا همون یه سری از داده هات به عنوان نویز شناسایی می شن (مثلا دیتا بیت ، پریتی و سرعت ارسال و دریافت)
همه تنظیمات رو خودت دستی با کد ست کن
در ضمن اگه تیکه کدتو بزاری بهتر جواب می گیری اینجا

sadeghjun
سه شنبه 15 مرداد 1392, 01:48 صبح
سلام
به این تاپیک (http://barnamenevis.org/showthread.php?386851-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D8%A8%D8%A7-%D9%BE%D9%88%D8%B1%D8%AA-%D8%B3%D8%B1%DB%8C%D8%A7%D9%84)یه سری بزن من یه زمانی روش کار کردم

python_85
سه شنبه 15 مرداد 1392, 11:54 صبح
من فکر کنم از تنظیمات پورت سریالت باید باشه
من هم همین فکر رو می کردم(الانم احتمال می دم) اما برنامه وقتی با یه برنامه دات نتی که خودم اونو نوشتو و داده های میکرو رو شبیه سازی می کنه کار می کنه هیچ مشکلی وجود نداره
تنظیمات رو با تنظیمات خود کدویژن مقایسه کردم مثل هم هستد

hamid_hr
سه شنبه 15 مرداد 1392, 12:03 عصر
يه پيشنهاد
شايد خوب نباشه
برا خوندن پورت از يه تابع كه با ترد اجرا ميشه استفاده كن
به اين صورت

while (true)
{
strint recv = seralport.ReadLine();
‍‍}

ببينين فرقي ميكنه يا نه

python_85
سه شنبه 15 مرداد 1392, 12:33 عصر
يه پيشنهاد
مرسی حتما بررسی می کنم

python_85
چهارشنبه 16 مرداد 1392, 15:11 عصر
while (true)
{
strint recv = seralport.ReadLine();
‍‍}


بازم مشکل حل نشد :افسرده::گریه::عصبانی++:

hamid_hr
چهارشنبه 16 مرداد 1392, 15:40 عصر
دستگاهي كه ارسال ميكنه چيه؟

python_85
چهارشنبه 16 مرداد 1392, 16:29 عصر
حقیقتش دقیق نمی دونم
تیم الکترونیک رو بخش سخت افزار کار می کنه

hamid_hr
چهارشنبه 16 مرداد 1392, 16:44 عصر
شايد زمان ارسال مشكل داره
زمان ارسال اشتباه ميفرسته

python_85
چهارشنبه 16 مرداد 1392, 16:54 عصر
می گم که با کد ویژن و پایتون تست کردم دیتا سالم هست

ali_13h
جمعه 18 مرداد 1392, 11:53 صبح
سلام فریم دریافتی شما به چه صورتی است
چون دستگاه های الکترونیکی دیتا رو به صورت بایت به بایت میفرستند اما data receive هنگامی فعال میشه که یک فریم دریافت کنه
پس شما ابتدا باید دیتای دریافتی خود را بافر کنی

python_85
جمعه 18 مرداد 1392, 13:46 عصر
چون دستگاه های الکترونیکی دیتا رو به صورت بایت به بایت میفرستند اما data receive هنگامی فعال میشه که یک فریم دریافت کنه

ممنون
متوجه منظورتون دقیقا نشدم!
فریم این جوری هست:
4 بایت اول هدر UU20
11 بایت دیتا
1 بایت انتهای دیتا که FF هست
من 1 بایت 1 بایت می خونم تا از پورت هدر رو تشخیص بدم
بعد 12 بایت رو می خونم اگه آخرین بایت FF بود اون فریم رو دیکد می کنم
مشکل اینه که یه سری دیتا واسم می اد که اصلا درست نیست
مثلا تو حالتی که فرستنده یه فریم ثابت (به غیر از هدر و فوتر بقیه مثلا 0) رو ارسال میکنه من رو پرت ،دیتا های اشتباه دریافت می کنم

python_85
شنبه 19 مرداد 1392, 12:47 عصر
سلام
این مشکل حل نشد
دیروز رفتم یه کارت سریال خریدم که تو خونه مشکل رو بررسی کنم
با پایتون به فریم درست کردم و رو پورت می زارم:


import serial,random
ser=serial.Serial(port='COM5',baudrate=115200)
ser.flush()
while True:
data=chr(61)+chr(85)+chr(61)+chr(85)+chr(61)+chr(8 5)+chr(61)+chr(85)+chr(61)+chr(85)+chr(61)+'3'
#x='aliU'+chr(0)+chr(random.randint(0,10))+chr(0)+ chr(random.randint(0,10))+chr(0)+chr(random.randin t(0,10))+chr(0)+chr(random.randint(0,10))+chr(0)+c hr(random.randint(0,10))+chr(0)+'3'
x='aliU'+data
ser.write(x)
print(data)


تو برنامه دات نتی هم این کد رو نوشتم:



private void button2_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen)
serialPort1.Close();
serialPort1.Open();


System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback((o) =>
{
while (true)
{
if (serialPort1.ReadByte() == (int)'a')
{
if (serialPort1.ReadByte() == (int)'l')
{
if (serialPort1.ReadByte() == (int)'i')
{
if (serialPort1.ReadByte() == (int)'U')
{
byte[] buff = new byte[12];
serialPort1.Read(buff, 0, 12);
if (buff[11] == (int)'3')
{
string fff = System.Text.Encoding.ASCII.GetString(buff);

if (f)
{


ff = fff;
this.Invoke(new Action(() =>
{
label1.Text = ff;
f = false;
}));


}
else
{
string tmp = System.Text.Encoding.ASCII.GetString(buff);
if (tmp != ff)
{
this.Invoke(new Action(() =>
{
listBox1.Items.Add(tmp);

}));
}
}
}
}
}
}
}
// System.Threading.Thread.Sleep(100);



}




}));
}



تنظیمات سریال پورت هم اینه:



serialPort1.PortName = "COM6";
serialPort1.BaudRate = 115200;
serialPort1.DataBits = 8;
serialPort1.StopBits = System.IO.Ports.StopBits.One;



البته از توی محل کارم نویز کمتری می بینم ولی بازم هست

python_85
شنبه 19 مرداد 1392, 13:00 عصر
این تیکه کد رو الان با پایتون نوشتم بازم نویز ندارم:


import serial,random
ser=serial.Serial(port='COM6',baudrate=115200)
ser.flush()
x=ser.read(16)
print(x)
while True:

data=ser.read(16)
if data!=x:
print(data)