Merhabalar. C# ile seriport uygulaması yapıyorum. C#'dan yolladığım string verileri pic almıyor. RDA kesmesine dahi gitmiyor. Sorun ne olabilir?
Donanim ve yazilim bilgilerini paylasmadan yorum yapmak zor.
#include <seriport.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <input.c>
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
#include <lcd.c>
unsigned long int bilgi=0;
float volt1=0,volt2=0;
unsigned int zaman=0;
char gelen[10]="\0";
#INT_RTCC
void RTCC_isr(void)
{
zaman++;
if(zaman>100)
{
zaman=0;
printf("%07.2f#%07.2f\n\r",volt1,volt2);
printf(lcd_putc,"\f%s",gelen);
}
}
#INT_RDA
void RDA_isr(void)
{
get_string(gelen,10);
output_toggle(pin_d0);
printf(lcd_putc,"\f%s",gelen);
disable_interrupts(INT_RDA);
}
void main()
{
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_64);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32|RTCC_8_BIT); //1,6 ms overflow
enable_interrupts(INT_RTCC);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
output_d(0x00);
lcd_init();
while(TRUE)
{
enable_interrupts(INT_RDA);
set_adc_channel(0);
delay_us(20);
bilgi=read_adc();
volt1=(0.0048828125*bilgi)*1000;
set_adc_channel(1);
delay_us(20);
bilgi=read_adc();
volt2=(0.0048828125*bilgi)*1000;
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace veriayirmadeneme
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
label3.Text = trackBar2.Value.ToString();
label2.Text = trackBar1.Value.ToString();
label1.Text = "Bağlantı Yok";
string[] portlar = SerialPort.GetPortNames();
foreach (string ports in portlar)
{
comboBox1.Items.Add(ports);
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
serialPort1.PortName = comboBox1.Text.ToString();
}
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);
}
private void button1_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen==false)
{
try
{
serialPort1.Open();
label1.Text = "Bağlandı";
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
}
catch (Exception)
{
MessageBox.Show("Bağlantı Hatası");
serialPort1.Close();
}
}
}
private void button2_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen==true)
{
try
{
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
serialPort1.Close();
label1.Text = "Bağlantı Kesildi";
}
catch (Exception)
{
MessageBox.Show("Bağlantı Hatası");
}
}
}
private void button3_Click(object sender, EventArgs e)
{
serialPort1.WriteLine(trackBar1.Value.ToString() + "," + trackBar2.Value.ToString()+"\r");
serialPort1.DiscardOutBuffer();
serialPort1.DiscardInBuffer();
label4.Text = trackBar1.Value.ToString() + "," + trackBar2.Value.ToString();
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
label2.Text = trackBar1.Value.ToString();
}
private void trackBar2_Scroll(object sender, EventArgs e)
{
label3.Text = trackBar2.Value.ToString();
}
private void button4_Click(object sender, EventArgs e)
{
serialPort1.WriteLine(textBox1.Text.ToString()+"\n\r");
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
}
string gelen;
string[] veri;
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
gelen = serialPort1.ReadLine();
veri = gelen.Split('#');
label5.Text = veri[0].ToString();
label6.Text = veri[1].ToString();
serialPort1.DiscardInBuffer();
serialPort1.DiscardOutBuffer();
}
catch (Exception)
{
}
}
}
}
RDA kesmesine gidiyor ama pic donuyor bu sefer. Reset tuşuna basınca kendine geliyor
get_string(gelen,10); burada sıkıntı var demekki
bilgisayardan 10 karakter geleceği garantimi?
programda RTCC gereksiz gözüküyor, main de halledebilirsin illa kullanacaksan RDA içine girince kapatman gerekir
örneklerdeki Ex_Sisr.c incele
Tamamdır sorun hal oldu. C# daki serialport1.WriteLine yerine serialport1.write yazınca pic donmuyor artık.
Bence c# kısmındaki writeln kalsın, getsitringi gets(değişken) yada değişken=fgets( stream) olarak değiştir. Herzaman 10 karakter göndermeyebilirsin. Ama gönderdiğin ifade içinde bir tane entere (ascii 13, /r yada writelineın yazdığı enter) varsa program entere odaklı çalışır. String boyutuna bakmaz.