为了这样做,我必须用美国广播电台( USART )的频率与ATmega88 et通信,我发送了4位字节。2字节和3字节表示频率,其工作方式如下:
117和48 => 30000 Hz
看上去像:
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());
}希望有人能理解我在说什么。
有关本部分的ATmega代码,请从AtmelStudio获得更多解释:
freq=(uart_getc()<<8)+(uart_getc());发布于 2014-04-16 13:54:22
我认为其中的数据类型和表示方式有些混乱。Int64.ToString()总是输出一个base10数字,因为整数不包含任何有关表示的信息。
密码
string freq1 = Convert.ToString(value_freq, 2);
Int64 result = Convert.ToInt64(freq1);将freq1转换为保存其二进制表示形式的字符串。但是,当您将其转换为Int64时,您将得到某种类似于base2数字的base10数字,因为该方法需要一个base10表示(我不确定最后一部分,但文档没有说明任何其他内容)。
为了澄清,让我举一个例子。假设我们有数字2(10),它是10(2) (在下面我将表示数字后面的大括号中的基)。现在,如果将"10“传递给ToInt64,它将不会看到10(2),而是看到10(10),即1010(2)。您预期结果<< 8会产生1000000000(2),但实际上是101000000000(2),因为您移动了1010(2)而不是10(2)。我希望这是明确的。
现在我们已经讨论了示例代码中的逻辑故障,让我们看看我们能做些什么。实际上,它比示例中的代码容易得多。实际上,您确实提供了两个字节,这些字节将被发送,一起表示一个短int,因此我将处理这个问题,希望您能够概括到适用于您的强盗的任何内容。
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。
https://stackoverflow.com/questions/23110810
复制相似问题