arkadaşlar ölçtüğüm gerilim bilgisini seri porttan sürekli okuyup textbox yada listbox a yazdırmak istiyorum. Bir türlü okuyamadım yardımcı olur musunuz?
kodlar şu şekilde C# tarafı
private void Form1_Load(object sender, EventArgs e)
{
string[] portlar = SerialPort.GetPortNames(); // portları dizi halinde aldık
foreach (string port in portlar)
{
comboBox1.Items.Add(port.ToString()); // Portlarımızı combobox ın içine aldık.
}
CheckForIllegalCrossThreadCalls = false;
this.WindowState = FormWindowState.Maximized;
}
private void buttonStart_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen) // Bağlantıyı açıyoruz.eğer önceden bağlan butonuna basmış isek yani bağlantıyı açmışsak aşağıdaki hata mesajını verecektir.
{
MessageBox.Show("Port Açık Bulunmaktadır..", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);
return;
}
else
{
try
{
serialPort1.BaudRate = int.Parse("9600"); // Hız olarak 9600 verdik.
serialPort1.DataBits = int.Parse("8"); // Veri bit ini de 8 bit olarak verdik
serialPort1.StopBits = System.IO.Ports.StopBits.One; // Durma bitini tek sefer olarak verdik.
serialPort1.Parity = Parity.None; // eşlik bit ini vermedik.
serialPort1.PortName = comboBox1.Text; // Port adlarını comboboxtan alıyoruz.
serialPort1.Open(); // Bağlantıyı açıyoruz
MessageBox.Show("Bağlantı Başarılı");
}
catch (Exception) // Herhangi bir hata anında alttaki hata mesajını alacağız..
{
MessageBox.Show("cihazınız bağlı değil...", "Bilgi", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button3);
}
}
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] buffer;
buffer = new byte[1];
serialPort1.Read(buffer, 0, 0);
string veri = serialPort1.ReadExisting();
textBox1.Text = veri;
}
https://www.picproje.org/index.php/topic,53274.0.html (https://www.picproje.org/index.php/topic,53274.0.html)
https://www.picproje.org/index.php/topic,51520.0.html (https://www.picproje.org/index.php/topic,51520.0.html)
Bu linkleri bir inceleyin genellikle aynı sorun oluyor. Olmadı yine bakalım.
üstat inceledim onları aynı bişey değişmedi veriyi bozuk okuyor yada ????(soru işareti) şeklinde okuyor.
Eger veri hex olarak geliyorsa 127 ye kadar dogru okur. Uzeri degerleri ise size sacmaliyor gibi gelir. Ama gercekte dogru okuma yapar.
Gelen her veride kesmeye girdiğinden emin misiniz?
c# ile kesme neden çalışmaz? Cevabı burda:
(http://s22.postimg.cc/8hsew9o9t/csharp_kesme_sorunu.png)
Eğer kesmeye girdiği halde bozuk geliyorsa baudrate ayarını kontrol edin.
üstat veri listbox a aldıgımda şu şekilde gözküküyor
(http://s29.postimg.cc/bx3eg81yb/aa1.jpg) (http://postimg.cc/image/bx3eg81yb/)
kesme derken nasıl anlamadım.
mesaj birleştirme:: 06 Eylül 2014, 21:52:58
kodlarımı şu şekilde düzelttim yine de aynı
private void buttonStart_Click(object sender, EventArgs e)
{
serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.Open();
serialPort1.DataReceived += serialPort1_DataReceived;
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
// timer1.Enabled = true;
}
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string line = serialPort1.ReadExisting();
this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
}
private delegate void LineReceivedEvent(string line);
private void LineReceived(string line)
{
listBox1.Items.Add(line);
textBox1.Text = line;
}
textbox yada list box a düzgün gelmiyor veri.
MCU nasıl gönderiyor veriyi?
mesaj birleştirme:: 06 Eylül 2014, 22:06:27
Seriport terminal programlarından birisi ile denediniz mi? Terminale baktığınızda düzgün görebiliyor musunuz?
Eger o veriler dogru ise sizin son bytelik veri gecikiyor. O yuzden veriyi dogru aliyorsunuz ama yanlis satirda goruyorsunuz. Eger veriyi siz gonderiyosaniz veriyi gonderdikten sonra kucuk bir delay ekleyin. C# ta hqrhangi bir sorun yasamazsiniz.
Verinizin sonuna \r eklemeyi unutmayin
(http://s28.postimg.cc/w2cb4vhjd/Ads_z.jpg) (http://postimg.cc/image/w2cb4vhjd/)
terminale düzgün geliyor bozulma yok C# da textbox yada list box a alınca bozuk gösteriyo sebebini anlamadım. sorun mikrodenetleyici tarafında olmasa gerek..
Sonuna \r ekleyin
Sonuna \r ekleyin
üstat nerenin sonuna anlamadım
mikrodenetleyici kodlarım şu şekilde
int sayi=0,mV=0;
char txt[64],volt[64],kk;
char gelen,i=0;
int ADC_Olcum(char kanal)
{
unsigned long temp=0;
char k=0;
for (k=0;k<128;k++)
{
temp+=ADC1_Get_Sample(kanal);
}
return temp>>7;
}
void LCD_Yaz(int okunan_deger)
{
mV=okunan_deger*0.7130;
if(mV>=10000)
volt[0]=(mV/10000)+48;
else volt[0]=' ';
volt[1]=(mV%10000)/1000+48;
volt[2]='.';
volt[3]=(mV%1000)/100+48;
volt[4]=(mV%1000)%100/10+48;
volt[5]=(mV%1000)%100%10+48;
Lcd_Out(2,1,volt);
Lcd_Out(2,8,"V");
}
void usb_yaz()
{
char i=0;
for(i=0;i<8;i++)
txt=volt;
UART3_Write_Text(txt);
}
void usb_kesme()
{
// kk=UART3_Read();
// if(kk=='v')
usb_yaz();
}
void main()
{
GPIO_Digital_Output(&GPIOE_BASE,_GPIO_PINMASK_9);
GPIOE_ODR.B9=0;
UART3_Init_Advanced(9600,_UART_8_BIT_DATA, _UART_NOPARITY,_UART_ONE_STOPBIT, & _GPIO_MODULE_USART3_PD89);
Lcd_init();
ADC1_init();
ADC_Set_Input_Channel(_ADC_CHANNEL_1);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"Voltmetre");
while(1)
{
sayi=ADC_Olcum(1);
LCD_Yaz(sayi);
usb_kesme();
}
mesaj birleştirme:: 06 Eylül 2014, 22:26:20
(http://s29.postimg.cc/j68flgiqr/Ads_z.jpg) (http://postimg.cc/image/j68flgiqr/)
mikrodenetleyici tarafına delay_ms(100); ekledim veri üstteki gibi C# a bozuk geliyor
/r dedigini nereye ekleyecem
void usb_yaz()
{
char i=0;
for(i=0;i<8;i++)
txt=volt;
txt[8]=0x0d;
UART3_Write_Text(txt);
orası tam olarak şu şekilde yapıştırınca çıkmamış burda nereye eklemem gerekiyor.
(http://s15.postimg.cc/x1i2rdf07/Ads_z.jpg) (http://postimg.cc/image/x1i2rdf07/)
void usb_yaz()
{
char i=0;
for(i=0;i<8;i++)
txt=volt;
txt[8]=0x0d;
UART3_Write_Text(txt);
}
(http://s8.postimg.cc/bc9l0johd/Ads_z.jpg) (http://postimg.cc/image/bc9l0johd/)
ekledim yine aynı veriler bozukk geliyo..
Alıntı yapılan: omereliusuk - 06 Eylül 2014, 22:49:22
void usb_yaz()
{
char i=0;
for(i=0;i<8;i++)
txt=volt;
txt[8]=0x0d;
UART3_Write_Text(txt);
Delay ekleyin
}
Bir daha deneyin en son veriyi denetleyici gonderinceye kadar beklsin bakalim 10ms 20ms yeter.
Hatta \r den sonra bosluk da ekleyebilirsiniz
(http://s7.postimg.cc/dteczu8pz/Ads_z.jpg) (http://postimg.cc/image/dteczu8pz/)
delay_ms(20);
ekledim yine aynı.
mesaj birleştirme:: 06 Eylül 2014, 23:09:35
Hatta \r den sonra bosluk da ekleyebilirsiniz demişsin. \r dediğin kesmemi anlayamadım boşluğu nereye ekleyecem
C#tarafinda en son gelen verinin degerine bakin eger son verinin deheri \r yani hexKarsiligi 0x20 ise text boxta gostersin.
if(Veri[veri.lenggt-1]==(char)0x20)textbox.text=veri
Gibi bir kod yazmalisiniz
(http://s16.postimg.cc/i1shbthhd/Ads_z.jpg) (http://postimg.cc/image/i1shbthhd/)
kodları dediğin gibi düzelttim text box a hiç veri gelmedi listbox da göründüğü gibi
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string line = serialPort1.ReadExisting();
this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
}
private delegate void LineReceivedEvent(string line);
private void LineReceived(string line)
{
if (line[line.Length - 1] == (char)0x20)
textBox1.Text = line;
listBox1.Items.Add(line);
}
if (line[line.Length - 1] == (char)0x0d)
olarak birdeğiştirin hatalı \r nin karşılığı 0x0d desimal 20 benim hatam
(http://s4.postimg.cc/twgp5ycsp/Ads_z.jpg) (http://postimg.cc/image/twgp5ycsp/)
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string line = serialPort1.ReadExisting();
this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
}
private delegate void LineReceivedEvent(string line);
private void LineReceived(string line)
{
if (line[line.Length - 1] == (char)0x0d)
textBox1.Text = line;
listBox1.Items.Add(line);
}
basit bi yerde hata var ama nerde çözemedim seni de ugraştırdım.. veri bozuk yine
Şimdi aklını karıştırmadan ;
serialPort1.ReadExisting();
bu satır seri port tamponda ne varsa alır. Onun için gelen verinin işaretlemen gerekir.
Yani verini
'a'+veri+'b'
şeklinde gönderirsen, bunu gelen veri içinde ayıklayabilirsin. Sonuçta verin string olarak geliyor ('0','1',...'8','9'','.') Yani gelen veri içinde 0x00 şeklinde bir şey gelmemesi gerekir.
Bu durumda serialPort1.ReadExisting(); okuması yaptığın zaman kaç tane karakter olduğunu kontrol et.
Yukarıdaki gibi bir şekilde gelirse gelen veri içinde 'a' karakterini tespit et ve 'b' karakterine kadar birleştir ve bunu veri olarak yaz.
işlemciden nasıl göndereceğin veya nereye ne koyacağın için anladığım kadarı ile usb ile veri gönderiyorsun. Bunun için bu konu ile ilgili yere bak. Hatta ilk etapta ölçeceğin değer yerine senin belirlediğin bir değeri gönder. BÖylece kontrol etme şansın olur.
char i=0;
for(i=0;i<8;i++)
txt=volt;--//--------->Bu satırın normalde txt=volt; şeklinde olmasını beklerdim.(belki derleyici farkından)
UART3_Write_Text(txt);
bu satırları basitçe
txt[0]='b';
txt[1]='1';
txt[2]='2';
txt[3]='3';
txt[4]='4';
txt[5]='5';
txt[6]='a';
UART3_Write_Text(txt);
şeklinde program gönderip verinin düzgün bir şekilde alınmasını sağlamaya çalışırım.
Yanlış anlamadıysam bilgisayar tarafına "a54321b" şeklinde gelmesi gerekir. Buradan a ve b'yi ayıklarsam geriye istenilen veri kalır.
yok veri artık düzgün geliyor. şöyle yapalım.
0x0d yerine sen farklı bir şey yaz. mesela 0x03 yaz
veya hiç kullanmayacağın bir harf deolabilir.
hepsini o şekilde değiştir.
olan şu.
c# evente geldiği zaman bazen \r komutunu görüyor. bazen görmüyor.
gördüğü zaman yeni satıra geçiyor bir de kendisi yeniden satıra geçiyor. iki satır birden atlıyor. o yüzden veri bazen satır atlayarak geliyor.
ambar7 kardeş dediğini yaptım sonuç aynı bozuk geliyor..
(http://s4.postimg.cc/gmft95555/Ads_z.jpg) (http://postimg.cc/image/gmft95555/)
(http://s10.postimg.cc/pcqvp3wed/Ads_z2.jpg) (http://postimg.cc/image/pcqvp3wed/)
kodlar şu şekilde mikrodenetleyici tarafı
mesaj birleştirme:: 07 Eylül 2014, 14:08:51
omereliusuk yine değişmedi
(http://s29.postimg.cc/saq8ip0pv/Ads_z.jpg) (http://postimg.cc/image/saq8ip0pv/)
if (line[line.Length - 1] == (char)0x03)
textBox1.Text = line;
listBox1.Items.Add(line);
mesaj birleştirme:: 07 Eylül 2014, 00:11:35
(http://s29.postimg.cc/6xhzj2tpf/Ads_z.jpg) (http://postimg.cc/image/6xhzj2tpf/)
terminale düzgün geliyor veri C# a gelince bozuluyor sorun nerde onu anlamadım...
void usb_yaz()
{
char i=0;
txt[0]=0x20;
txt[1]=0x20;
for(i=2;i<10;i++) txt[i]=volt[i];
txt[10]=0x03;
txt[11]=0x20;
txt[12]=0x20;
UART3_Write_Text(txt);
}
bir de böyle deneyin iş inada bindi :)
(http://s10.postimg.cc/mznn62k05/image.jpg) (http://postimg.cc/image/mznn62k05/)
(http://s18.postimg.cc/klvxbg51x/image.jpg) (http://postimg.cc/image/klvxbg51x/)
bu şekilde oldu şimdi de
mesaj birleştirme:: 07 Eylül 2014, 00:38:33
mikrodenetleyici kodları verdiğini yazdım
(http://s29.postimg.cc/7kdogzg0z/image.jpg) (http://postimg.cc/image/7kdogzg0z/)
void usb_yaz()
{
char i=0;
txt[0]=0x20;
txt[1]=0x20;
for(i=2;i<10;i++) txt=volt[(i-2)];
txt[10]=0x03;
txt[11]=0x20;
txt[12]=0x20;
UART3_Write_Text(txt);
}
Veriyi neden string line = serialPort1.ReadExisting(); şeklinde alıyorsunuz
Bu yöntem \r karakterine göre okuma yapıyor, ben bunu kullanıyorum:
line = serialPort1.ReadLine();
(http://s28.postimg.cc/ay40v4ozt/Ads_z.jpg) (http://postimg.cc/image/ay40v4ozt/)
(http://s21.postimg.cc/8d6wclv8z/image.jpg) (http://postimg.cc/image/8d6wclv8z/)
C# kodlarım
private void buttonStart_Click(object sender, EventArgs e)
{
serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.Open();
serialPort1.DataReceived += serialPort1_DataReceived;
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string line = serialPort1.ReadExisting();
this.BeginInvoke(new LineReceivedEvent(LineReceived), line);
}
private delegate void LineReceivedEvent(string line);
private void LineReceived(string line)
{
// if (line[line.Length - 1] == (char)0x03)
textBox1.Text = line;
listBox1.Items.Add(line);
}
sorunu çözemedim nerdeee
mesaj birleştirme:: 07 Eylül 2014, 00:51:27
(http://s2.postimg.cc/hlhsftl3p/image.jpg) (http://postimg.cc/image/hlhsftl3p/)
readline da yaptım hata verdiiii
Çalışma zamanında aldığınız bir hata değil mi?
Tam hatırlamıyorum verinin sonuna sadece \r değilde \r\n ekleyerek deneyin.
serial port read existing bölümüne
int a = 0x00001000;
while (Convert.ToBoolean(a--)) ;//tüm verini gelmesini bekliyoruz.
veri = serialPort1.ReadExisting();
if (veri[veri.Length - 1] == (char)0x0d)
textBox1.Text = veri;
listBox1.Items.Add(veri);
verici bölümüne
void usb_yaz()
{
char i=0;
txt[0]=0x20;
txt[1]=0x20;
for(i=2;i<10;i++) txt=volt[(i-2)];
txt[10]=0x0d;
UART3_Write_Text(txt);
}
tamam olması gerekiyor. tabi yatmadıysan.
Veriyi tam olarak almak istiyorsak ReadExisting(); değil ReadLine() kullanmalısınız. Verinin sonunada \n koymalısınız.
ReadLine() : SerialPort sınıfının ReadLine isimli fonksiyonu seri portdan NewLine (\n) karakteri gelene kadar tanımladığınız ReadTimeout süresince bekler. Gelen veriyi size string türünden geri döndürür.
omereliusuk dediğini yapınca donuyor program
(http://s29.postimg.cc/587nnhsyb/Ads_z.jpg) (http://postimg.cc/image/587nnhsyb/)
mesaj birleştirme:: 08 Eylül 2014, 03:18:25
bu verinin sonuna \n nasıl koyacazzz
mesaj birleştirme:: 08 Eylül 2014, 03:22:24
(http://s29.postimg.cc/nlm13a7kj/Ads_z.jpg) (http://postimg.cc/image/nlm13a7kj/)
sorunu çözemedimm
mesaj birleştirme:: 07 Eylül 2014, 13:41:07
Arkadaşlar kendi verimi geçtim 4 harf gönderiyorum onu dahi sıralı almıyor gönderdiğim veriler
mikrodenetleyici tarafı
void usb_yaz()
{
txt[0]='a';
txt[1]='b';
txt[2]='c';
txt[3]='d';
UART3_Write_Text(txt);
}
C# a gelince gözüken ise
(http://s30.postimg.cc/usjms2er1/Ads_z.jpg) (http://postimg.cc/image/usjms2er1/)
bu şekilde bozuk alıyor.
C# veri alma kodu
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
string line = serialPort1.ReadExisting();
textBox1.Text = line;
listBox1.Items.Add(line);
}
pic' den data yollarken datanın sonuna 13 ekle yani putc(13); yaz alınan verilerin sonuna otomatik enter koymuş olursun böylece. c# tarafında da serialPort1.readTo("\n"); komutu kullan data alırken.
int a = 0x00001000; while (Convert.ToBoolean(a--)) ; //tüm verini gelmesini bekliyoruz.
veri = serialPort1.ReadExisting();
veya
readLine
ne yazarsan yaz
beklemeyi yap çalışması gerekiyor.
yıllar önce yaptığım yazılımda mecbur kalmasam bekleme koymazdım herhalde ki koymuşum.
ctn1905 pic değil arm kullanıyorummm
dediklerini yaptım readTo("\n") okuma yapmıyorr.
C# tarafına
void oku()
{
line = serialPort1.ReadLine();
textBox1.Text = line;
listBox1.Items.Add(line);
line = string.Empty;
try
{
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
}
catch { }
}
public void serialPort1_DataRecived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Thread paralel1 = new Thread(new ThreadStart(oku));
paralel1.Start();
paralel1.Join();
}
kodunu yaz ve form1_Load bölümüne de
CheckForIllegalCrossThreadCalls = false;
satırını ekle
pic kısmında veriyi gönderirken, gönderdiğin dizinin son elemanına 0x0d (\n) karakterinin yaz. 0x0d =\n karakteri değilse data okuyamazsın (\n karakteri olması lazım)
Mesela gönderdiğin data üç elaman içeriyor a,b,c
txt[0]='a';
txt[1]='b';
txt[2]='c';
txt[3]='\n'; olması lazım.
txt[3]='\n'; satırı hata verirse txt[3]= 0x0d; ile değiştir.
fthsev bunu da deneyecem şimdii denemediğim kod kalmadıı zatenn
Alıntı yapılan: cebeci52 - 07 Eylül 2014, 15:57:59
fthsev bunu da deneyecem şimdii denemediğim kod kalmadıı zatenn
Herhangi bir hata alırsanız
line=string.empty; satırını kaldırınız
(http://s29.postimg.cc/3vbcopihf/Ads_z.jpg) (http://postimg.cc/image/3vbcopihf/)
thread ne diyor burda
using System.Threading;
satırını kodun başına ekle
ekledim hata verdi yine çalışıyor donuyor sonra
(http://s16.postimg.cc/wbw10aeoh/Ads_z.jpg) (http://postimg.cc/image/wbw10aeoh/)
(http://s16.postimg.cc/eacw2hknl/Ads_z1.jpg) (http://postimg.cc/image/eacw2hknl/)
Alıntı yapılan: cebeci52 - 07 Eylül 2014, 16:11:37
ekledim hata verdi yine çalışıyor donuyor sonra
(http://s16.postimg.cc/wbw10aeoh/Ads_z.jpg) (http://postimg.cc/image/wbw10aeoh/)
(http://s16.postimg.cc/eacw2hknl/Ads_z1.jpg) (http://postimg.cc/image/eacw2hknl/)
Bğalantı noktası kapalı serialPort1.Open(); satırını çalıştırdığından emin misin?
Bağalntıyı yaptın mı?
mesaj birleştirme:: 07 Eylül 2014, 16:17:10
Kodun tamamını kod yükleme seçeneği ile yüklermisin?
Mesaj yazarken yukarıdaki ifadelerin üzerinde # karakteri ona basınca kod ekleyebilirsin.
C# kodları
private void buttonStart_Click(object sender, EventArgs e)
{
serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.Open();
serialPort1.DataReceived += serialPort1_DataReceived;
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
}
}
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DataSource = SerialPort.GetPortNames();
CheckForIllegalCrossThreadCalls = false;
}
void oku()
{
string line;
line = serialPort1.ReadLine();
textBox1.Text = line;
listBox1.Items.Add(line);
// line = string.Empty;
try
{
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
}
catch { }
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Thread paralel1 = new Thread(new ThreadStart(oku));
paralel1.Start();
paralel1.Join();
}
(http://s8.postimg.cc/6t7q6m48x/image.jpg) (http://postimg.cc/image/6t7q6m48x/)
(http://s8.postimg.cc/i4aduzb41/image.jpg) (http://postimg.cc/image/i4aduzb41/)
mesaj birleştirme:: 07 Eylül 2014, 16:24:07
C# kodları
private void buttonStart_Click(object sender, EventArgs e)
{
serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.Open();
serialPort1.DataReceived += serialPort1_DataReceived;
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
}
}
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DataSource = SerialPort.GetPortNames();
CheckForIllegalCrossThreadCalls = false;
}
void oku()
{
string line;
line = serialPort1.ReadLine();
textBox1.Text = line;
listBox1.Items.Add(line);
// line = string.Empty;
try
{
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
}
catch { }
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Thread paralel1 = new Thread(new ThreadStart(oku));
paralel1.Start();
paralel1.Join();
}
void oku() kısmını şu şekilde değiştirip son bir kez dener misin?
void oku()
{
string line;
try
{
line = serialPort1.ReadLine();
textBox1.Text = line;
listBox1.Items.Add(line);
}
catch{}
// line = string.Empty;
try
{
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
}
catch { }
}
(http://s22.postimg.cc/46swcs8i5/Ads_z.jpg) (http://postimg.cc/image/46swcs8i5/)
aynı
mesaj birleştirme:: 08 Eylül 2014, 06:46:22
Arkadaşlar amacım mikrodenetleyicide(arm) ölçtüğüm gerilim degerini C# da seri port(ft232) kullanarak textbox ve listbox da göstermek basit seri port baglantısı yapmak istiyorum ama veriler bozularak geliyor tüm kullandıgım kodları ve ekran görüntülerini atıyorum.
C# cılar, arm programcılar yardımlarınızı bekliyorum...
Mikrodenetleyici kodları
sbit LCD_RS at GPIOE_ODR.B8;
sbit LCD_EN at GPIOE_ODR.B10;
sbit LCD_D4 at GPIOE_ODR.B4;
sbit LCD_D5 at GPIOE_ODR.B5;
sbit LCD_D6 at GPIOE_ODR.B6;
sbit LCD_D7 at GPIOE_ODR.B7;
int sayi=0,mV=0;
char txt[64],volt[64],kk;
char gelen,i=0;
int ADC_Olcum(char kanal)
{
unsigned long temp=0;
char k=0;
for (k=0;k<128;k++)
{
temp+=ADC1_Get_Sample(kanal);
}
return temp>>7;
}
void LCD_Yaz(int okunan_deger)
{
mV=okunan_deger*0.7130;
if(mV>=10000)
volt[0]=(mV/10000)+48;
else volt[0]=' ';
volt[1]=(mV%10000)/1000+48;
volt[2]='.';
volt[3]=(mV%1000)/100+48;
volt[4]=(mV%1000)%100/10+48;
volt[5]=(mV%1000)%100%10+48;
Lcd_Out(2,1,volt);
Lcd_Out(2,8,"V");
}
void usb_yaz()
{
char i=0;
for(i=0;i<8;i++)
txt[i]=volt[i];
UART3_Write_Text(txt);
}
void usb_kesme()
{
usb_yaz();
}
void main()
{
GPIO_Digital_Output(&GPIOE_BASE,_GPIO_PINMASK_9);
GPIOE_ODR.B9=0;
UART3_Init_Advanced(9600,_UART_8_BIT_DATA, _UART_NOPARITY,_UART_ONE_STOPBIT, & _GPIO_MODULE_USART3_PD89);
Lcd_init();
ADC1_init();
ADC_Set_Input_Channel(_ADC_CHANNEL_1);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,1,"Voltmetre");
while(1)
{
sayi=ADC_Olcum(1);
LCD_Yaz(sayi);
usb_kesme();
}
}
C# kodları
private void Form1_Load(object sender, EventArgs e)
{
comboBox1.DataSource = SerialPort.GetPortNames();
CheckForIllegalCrossThreadCalls = false;
}
private void buttonStart_Click(object sender, EventArgs e)
{
serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.Open();
serialPort1.DataReceived += serialPort1_DataReceived;
if (serialPort1.IsOpen)
{
buttonStart.Enabled = false;
buttonStop.Enabled = true;
}
}
void oku()
{
string line;
try
{
line = serialPort1.ReadLine();
textBox1.Text = line;
listBox1.Items.Add(line);
}
catch { }
// line = string.Empty;
try
{
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
}
catch { }
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
Thread paralel1 = new Thread(new ThreadStart(oku));
paralel1.Start();
paralel1.Join();
}
C# ekran çıktısı
(http://s22.postimg.cc/ud2zhnzf1/Ads_z.jpg) (http://postimg.cc/image/ud2zhnzf1/)
Şu an için aklıma gelen başka bir şey yok kusura bakma. Bu kodu bu şekliyle daha önce kullanmıştım bir sorun olmamıştı. Datayı işlemciden gönderirken bekleme süresi veriyor musun? Eğer verdiysen süreyi biraz artır.
Evet sorunu çözdüm ve denedim. Bekleme süresi vermek gerekiyor. o zaman düzgün gidiyor veriler. İşlemci kısmında her bir gönderimden sonra
diğer veriyi göndermeden bir bekleme süresi verin. Süre değişkenlik gösrerebilir. Örnek olarak benim haberleşme hızım "38400" bekleme süresi olarak
5 ms verdim. Veriler düzgün bir şekilde iletildi.
İyi de bunu cok onceleri yazmistik. ^-^
Alıntı yapılan: omereliusuk - 08 Eylül 2014, 21:11:23
İyi de bunu cok onceleri yazmistik. ^-^
:) Bunu benim yazdığım koda istinaden söyledim. Bekleme süresi ver demeyi unutmuştum.
sorun şu an için çözüldü ilgilenen arkadaşlara teşekkür ederim...