C# и Arduino

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

 Visual Studio 2010 C# на читает с компорта сообщение дуины. Отправленые команды доходят на дуину. Но ето только в Visual Studio в родном компиляторе дуини все ок... проверял монитором порта - отправляет и получает. Кто может помогите с С#.

C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// Открываем порт, и задаем скорость в 9600 бод
serialPort1.PortName = "COM9";
serialPort1.BaudRate = 9600;
serialPort1.Open();

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// При закрытии программы, закрываем порт
if (serialPort1.IsOpen) serialPort1.Close();
}

private void button1_Click(object sender, EventArgs e)
{
// Передача данных из текстового поля в порт
serialPort1.Write(textBox1.Text);
// Прием данных и вывод его в окно программмы
textBox2.Text = serialPort1.ReadLine();
}

}
}

Сигнал по ком доходит до дуины, индикатор горит\тухнет. 

Когда доходит до строки textBox2.Text = serialPort1.ReadLine(); програма замерает... ждет но ничего не приходит((( А должно прийти текстовое сообщение через ком помпорт с дуины.

Arduino:

int led = 12;
int inSize = 0;
char str[128];

void setup ()
{
pinMode(led, OUTPUT);
Serial.begin(9600);
}

void loop()
{
inSize=0;
memset(str,'\0',128);
//Serial.println("Testing!!!");
if (Serial.available()>0)
{
inSize = Serial.available();
for (int i = 0; i < inSize; i++)
{
str[i] = Serial.read();
}
if (strcmp(str,"on") == 0)
{
Serial.println("111");
digitalWrite(led, HIGH);
}
else if (strcmp(str,"off") == 0)
{
delay(1000);
Serial.println("Led is OFF");
digitalWrite(led, LOW);
}
else if (strcmp(str, "hello") == 0)
{
Serial.println("Hello! My name is Arduin!");
}
else
{
Serial.println("Error command!");
}
}
}

Встроеним монитором портов проверил... команда доходит до дуины и ответ приходит с ком порта) Но на VS C# не приходит ответ! Помогите.

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

 Если розкоментировать строку //Serial.println("Testing!!!"); в скетче то иногда проскакивает сообщение! Как мне с етим бороться???

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

 Добавление строк в private void button1_Click решило проблему

 

serialPort1.RtsEnable = false;
serialPort1.DtrEnable = true;

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

 и вместо textBox2.Text = serialPort1.ReadLine();

использовать

textBox2.Text = serialPort1.ReadExisting();

но почему ReadLine(); не работает?

Lavochkin
Offline
Зарегистрирован: 19.12.2011

ramon_sobaka пишет:

 и вместо textBox2.Text = serialPort1.ReadLine();

использовать

textBox2.Text = serialPort1.ReadExisting();

но почему ReadLine(); не работает?

Не претендую на глубокое знание С#, но может просто символа окончания строки нет

ramon_sobaka
Offline
Зарегистрирован: 24.10.2012

Вот и ReadLine заработал:

// Открываем порт, и задаем скорость в 9600 бод
serialPort1.PortName = "COM9";
serialPort1.BaudRate = 9600;
serialPort1.DtrEnable = true;  //в описание порта нужно било добавить
serialPort1.Open();

 

Полний код на Visual C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.IO;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public String c;
public Form1()
{
InitializeComponent();
// Открываем порт, и задаем скорость в 9600 бод
serialPort1.PortName = "COM9";
serialPort1.BaudRate = 9600;
serialPort1.DtrEnable = true;
serialPort1.Open();

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// При закрытии программы, закрываем порт
if (serialPort1.IsOpen) serialPort1.Close();
}

private void button1_Click(object sender, EventArgs e)
{

// Передача данных из текстового поля в порт
serialPort1.Write(textBox1.Text);
c = serialPort1.ReadExisting();
// Прием данных и вывод его в окно программмы
textBox2.Text = c;
textBox3.Text = serialPort1.ReadLine();

}

}
}

Alexander
Offline
Зарегистрирован: 25.04.2010

 Обратите пожалуйста внимание на тему, раскрывающую магию вставки программного кода в комментарии.
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

the_wall
Offline
Зарегистрирован: 06.06.2013

Как в С#  

Структуру

public  struct SEND_DATA_STRUCTURE
        {
             UInt16 device_id;
             UInt16 destination_id;
             UInt16 packet_id;
             byte command;
             Int16 data;
        }

запихнуть в serialPort1.Write

Dimsan
Offline
Зарегистрирован: 25.10.2013

Преобразовать структуру в массив байт. И передать массив.

the_wall
Offline
Зарегистрирован: 06.06.2013