我必须通过USART向ATmega88 et传达一个频率,为此我发送4个字节。 2和3个字节用于频率并且工作如下:
117和48 => 30000赫兹
看起来像:
01110101和00110000 => 0b0111010100110000
我可以手动发送117和48,它可以工作。
但是现在我想在我的WPF应用程序中使用滑块并使用他的值。
我尝试了很多东西,我能做的就是:
private void Freq_Click(object sender, RoutedEventArgs e)
{
Int64 value_freq = (Int64)frequence_slider.Value;
string freq1 = Convert.ToString(value_freq, 2); //Convert to binary in a string
Int64 result = Convert.ToInt64(freq1); //Convert string in a Int64
Int64 result2 = result << 8; // does not work like I expect .. it return a base10 number instead of a binary ..
Int32 result3 = Convert.ToInt32(result, 10);
System.Windows.MessageBox.Show("Partie 1 : " + freq1.ToString() + "\n \n" + "Partie 2 : " + result.ToString() + "\n \n" + "Partie 3 : " + result2.ToString() + "\n \n" + "Partie 4 : " + result3.ToString());
}
希望有人理解我在说什么。
这里有更多解释,他来自AtmelStudio的ATmega代码:
freq=(uart_getc()<<8)+(uart_getc());
答案 0 :(得分:0)
int to binary:
Integer.toString(value,2)
拆分:二进制到int:
String.substring(int beginIndex, int endIndex)
答案 1 :(得分:0)
我认为在这方面存在一些关于数据类型和表示的混淆。 Int64.ToString()将始终输出base10数字,因为整数不包含有关该表示的任何信息。
代码
string freq1 = Convert.ToString(value_freq, 2);
Int64 result = Convert.ToInt64(freq1);
将freq1转换为保存其二进制表示的字符串。但是,当你将它转换为Int64时,你将获得某种base10数字,它看起来像一个base2数字,因为该方法需要一个base10表示(我不确定最后一部分,但文档没有说明还要别的吗)。
为了澄清,让我举个例子。让我们假设我们有数字2(10),这将是10(2)(在下面我将表示数字后的括号中的基数)。现在,如果你将“10”传递给ToInt64,它将不会看到10(2),而是10(10),这将是1010(2)。您期望的结果&lt;&lt; 8产生1000000000(2),但实际上是101000000000(2),因为你移动了1010(2)而不是10(2)。我希望这很清楚。
现在我们讨论了示例代码中的逻辑失败,让我们看看,我们可以做些什么。实际上它比示例中的代码更容易。实际上,你确实提供了2个字节,这些字节将被发送,一起代表一个短的int,因此我将使用它,希望你可以推广到适用于你的roblem的任何内容
short frequency = 30000;
byte high, low;
low = (byte)(frequency & 0x00FF); //cut the high byte of the short and write the remaining to low
high = (byte)(frequency >> 8);
现在高包含117而低包含48。