[英]Porting Serial.write(Byte, int, int) from C# to Python using Pyserial
[英]How do you Serial.Write() an Integer value instead of the ASCII value of that Int in C#
我正在用C#开发一个实用程序来调整Arduino Mega的参数,该参数用作最多3个电机的电机控制器。 数据必须由电机控制器接收,例如。 as [D2100] [=起始字节,D =要修改的参数,2 =乘数为256(0-3),100 =加到乘法结果(0-255)的余数必须保持<1024, ] =结束字节。 数值作为十进制ASCII值传递(48-51)。
我试图通过Serial.write发送字符串,当从控制器请求数据时,它可以填充当前字段。 我已将修改后的值作为Byte Byte从字节数组发送,使用convert.ToInt32,但似乎只能作为ASCII十进制值发送,我已经通过serial.print字段值在Arduino IDE串口窗口中确认。 在1990年代只用C语言完成了数据库编程,请原谅我的无知,我只是在学习。 下面是我作为字符串发送的最新版本,但是在执行字节数组时使用了公共bool ExCmd(字符串cmd)的butchered版本,然后注释掉字符串的部分。 一直试图解决两个星期,阅读和编码,但没有决心,任何帮助将不胜感激。
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
丢失Convert.ToString()
调用并且只是强制转换。 如果转换为char
,则可以继续使用字符串连接代码,但串口可能仍会误解它。
处理二进制数据时你真正想要的是一个字节数组。 这是串行端口读写的本机数据结构。 所有的字符串便利函数都假设Unicode具有特定的编码,这只对文本有意义。
如果要进行二进制通信,那么与按位操作交朋友也很好。 例如,如果数字为负数, (val / 256)
将执行符号扩展,从而弄乱您的数据流。 你想要的是(byte)(val >> 8)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.