我正在用C#开发一个实用程序,以调整Arduino Mega的参数,该参数被用作最多3个电机的电机控制器。数据必须由电动机控制器接收,例如如[D2100] [=起始字节,D =要修改的参数,2 =是256(0-3)的乘数,100 =乘法结果(0-255)的余数必须保持<1024, ] =结束字节。数值作为十进制ASCII值(48-51)传递。
我试图通过Serial.write作为字符串发送,该字符串在从控制器请求数据时可以工作,因为我可以填充当前字段。我已将已修改的值从字节数组以字节接字节的形式发送,使用convert.ToInt32,但似乎只能以ASCII十进制值发送,这是我在Arduino IDE串行窗口中通过serial.print确认的字段值。请回过头来了解一下我的无知,我只是在学习1990年代的C语言中的数据库编程。下面是我作为字符串发送的最新版本,但是在处理字节数组时使用了公共布尔ExCmd(string cmd)的屠宰版本,然后注释掉了该字符串的各个部分。经过两个星期的尝试解决,阅读和编码但没有解决方法,我们将不胜感激。
private void SlKp_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (!initLoad)
{
string cmdChar = "";
int val = Convert.ToInt32(slKp.Value);
if (enaMotor == 1)
{
cmdChar = "D";
}
if (enaMotor == 2)
{
cmdChar = "E";
}
if (enaMotor == 3)
{
cmdChar = "F";
}
string val1 = Convert.ToString(val / 256);
string val2 = Convert.ToString(val % 256);
string cmd = '['+ cmdChar + val1 + val2 +']' ;
if (spHandler.ExCmd(cmd))
{
fieldChanged = true;
btSave.IsEnabled = true;
}
}
}
public bool ExCmd(string cmd)
{
try
{
if (_serialPort != null && _serialPort.IsOpen)
{
_serialPort.DiscardOutBuffer();
_serialPort.DiscardInBuffer();
_receiveNow.Reset();
/*int intCount = 0;
int intChar = cmd[intCount];
if (intChar == 0b1011011) //91 [ bracket is start byte
{
do
{*/
_serialPort.Write(cmd); //intCount,1);
/* if (cmd[intCount] != 0b1011101)
{
intCount++;
}
} while (cmd[intCount] != 0b1011101 && intCount < 4); //93 ] backet is end byte
if(cmd[intCount] == 0b1011101)
{*/
return true;
}
else
{
return false;
}
}/*
else
{
return false;
}
}
else
{
return false;
}
}*/
catch
{
return false;
}
}
Arduino Code
case 'D':
#ifdef MOTOR_1
Mtr1.lKp_x100=(RxBuffer[1]*256)+RxBuffer[2];
#endif
答案 0 :(得分:0)
丢掉Convert.ToString()
通话,然后进行投射。如果您强制转换为char
,则可以继续使用字符串连接代码,但是串行端口仍可能会误解它。
处理二进制数据时,您真正想要的是一个字节数组。这就是串行端口读写的本机数据结构。所有的字符串便捷功能都假设Unicode具有特定的编码,仅对文本有意义。
如果您要进行二进制通信,也可以按位操作结交朋友。例如,如果数字为负,(val / 256)
将进行符号扩展,从而使数据流混乱。您想要的是(byte)(val >> 8)
。