using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SerialPort
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
cmdClose.Enabled = false;
foreach (String s in System.IO.Ports.SerialPort.GetPortNames())
{
txtPort.Items.Add(s);
}
}
public System.IO.Ports.SerialPort sport;
public void serialport_connect(String port, int baudrate , Parity parity, int databits, StopBits stopbits)
{
DateTime dt = DateTime.Now;
String dtn = dt.ToShortTimeString();
sport = new System.IO.Ports.SerialPort(
port, baudrate, parity, databits, stopbits);
try
{
sport.Open();
cmdClose.Enabled = true;
cmdConnect.Enabled = false;
txtReceive.AppendText("[" + dtn + "] " + "Connected\n");
sport.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived);
}
catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error"); }
}
private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
this.BeginInvoke(new Action(() =>
{
DateTime dt = DateTime.Now;
String dtn = dt.ToShortTimeString();
txtReceive.AppendText("[" + dtn + "] " + "Received: " + sport.ReadExisting() + "\n");
}));
}
private void cmdConnect_Click(object sender, EventArgs e)
{
String port = txtPort.Text;
int baudrate = Convert.ToInt32(cmbbaudrate.Text);
Parity parity = (Parity)Enum.Parse(typeof(Parity), cmbparity.Text);
int databits = Convert.ToInt32(cmbdatabits.Text);
StopBits stopbits = (StopBits)Enum.Parse(typeof(StopBits), cmbstopbits.Text);
serialport_connect(port, baudrate, parity, databits, stopbits);
}
private void button1_Click(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
String dtn = dt.ToShortTimeString();
String data = txtDatatoSend.Text;
sport.Write(data);
txtReceive.AppendText("[" + dtn + "] " + "Sent: " + data + "\n");
}
private void cmdClose_Click_1(object sender, EventArgs e)
{
DateTime dt = DateTime.Now;
String dtn = dt.ToShortTimeString();
if (sport.IsOpen)
{
sport.Close();
cmdClose.Enabled = false;
cmdConnect.Enabled = true;
txtReceive.AppendText("[" + dtn + "] " + "Disconnected\n");
}
}
}
}Команда получила контроллером через последовательный интерфейс, но руки робота не двигается
После того как я отправить команду через последовательный интерфейс, как показано на рисунке, мой робот не двигается все. Однако, если я закрываю визуальную студию и открываю программное обеспечение Roboteq, мой робот будет двигаться по команде, которую я отправил ранее, даже не загрузив порт в Roboteq. Любая идея, почему это так? Я думаю, что контроллер получил мою команду точно, но почему-то это не выполняется, и, возможно, открытие Roboteq заставляет его выполнять. Заранее спасибо.
Спасибо за ваш ответ, я попробовал то, что вы предложили, но я думаю, что записи (данные) и WriteLine (данные) не делает никакой разницы здесь. Мой контроллер требует возврата каретки «\ r» – ZoeY
Более того, независимо от того, добавляю ли я '\ r' для завершения каждой команды или нет, повторится то же самое. Я не знаю, почему это так. – ZoeY
Возможно, попробуйте немного похудеть на своем коде и посмотрите, могут ли быть обработчики событий, если вы играете для начинающих. Я просто просматривал статью о «flakiness» реализации System.IO.Ports.SerialPort в рамках: http://www.sparxeng.com/blog/software/must-use-net-system-io- порты-SerialPort – ffa