问题描述
我正在尝试编写一个用于控制轴伺服系统的程序,但在通过串行 (USB) 向 Arduino 发送值时遇到了一个小问题。似乎数据没有以正确的格式到达。出于测试的目的,我制作了一个特殊的 Arduino 代码,看看有什么问题。
Arduino 代码:
void setup() {
// put your setup code here,to run once:
Serial.begin(9600);
}
String received;
void loop() {
// put your main code here,to run repeatedly:
if(Serial.available()>0)
{
received=Serial.readString();
}
Serial.println("received: "+received);
}
C# 代码:
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.Threading;
namespace ServoControl
{
public partial class Form1: Form
{
public Form1()
{
InitializeComponent();
}
SerialPort Sp = new SerialPort();
String AngleX = "0";
String AngleY = "0";
String AngleZ = "0";
String rec = "";
private void Form1_Load(object sender,EventArgs e)
{
Sp.PortName = "COM8";
Sp.Baudrate = 9600;
Sp.DataReceived += Sp_DataReceived;
}
private void Sp_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
rec=Sp.ReadLine();
}
//when value changed on slider
private void xAxisServo_Scroll(object sender,EventArgs e)
{
if (AngleX!= xAxisServo.Value.ToString())
{
AngleX = xAxisServo.Value.ToString(); valueXaxis.Text = AngleX;
}
if (Sp.IsOpen == true & int.Parse(AngleX) <= 180)
{
Sp.WriteLine(AngleX.ToString());
}
else
{
Sp.open();
}
}
//when value changed in value Box
private void valueXaxis_TextChanged(object sender,EventArgs e)
{
if (int.TryParse(valueXaxis.Text,out int res)==true && int.Parse(valueXaxis.Text)<=180)
{
AngleX = valueXaxis.Text;
xAxisServo.Value = int.Parse(AngleX);
}
if (int.TryParse(valueXaxis.Text,out int res2) == true && int.Parse(valueXaxis.Text) > 180)
{
AngleX = "180";
}
if (Sp.IsOpen == false)
{
Sp.open();
}
if (Sp.IsOpen == true)
{
Sp.WriteLine(AngleX.ToString());
}
}
private void timer1_Tick(object sender,EventArgs e)
{
textBox1.Text = rec;
}
}
}
我能够通过函数 Serial.parseInt() 为轴 X 发送一个值;我能够从 Arduino 中的字符串中读取一个值,但是我需要发送多个并且我在发送和接收字符串时遇到问题。
我已经用 Arduino 串行监视器进行了很多测试,似乎当通过 Arduino IDE 中的内置监视器发送时,它按预期工作并返回正确的字符串,但是当使用 C# 检查 textBox1 时,它仅显示已接收,并且在未中断时仅显示一堆废话每秒都在变化。
对此,我尝试用 Write 替换 WriteLine,因为我不太了解 Arduino 的背景,所以我不知道 Arduino 如何使用 Serial.readString();
处理数据。
我试图找出 Arduino IDE 中的内置串行监视器如何工作,如果在 C# 中或如果不在 C# 中,至少数据是如何发送的。
知道为什么我用 IDE 串行监视器和 C# 得到不同的结果。
解决方法
连接 Serial.read 然后添加终止字符以切断连接:
char received;
while(Serial.available()>0)
{
if(received=='#') // put the # in the end of your data
{
Serial.println("received: "+String(received));
break;
}
received+=Serial.read();
}