我写了一个小的wpf程序来控制一些LED。我建了4个不同的modi:
LEDON,LEDOFF,DIMMING,FLASH
它很简单,工作正常。我将a,b,c或d(4个不同的按钮)发送到arduino并执行相应的循环。
现在我尝试在我的WPF程序中创建一个可以控制LED亮度的滑块。我的滑块创建了0到255之间的值,我发送给arduino。
现在我问输入的字节是否是一个数字,如果是,我执行一个应该使用analog.write(PIN,value);
确定亮度的方法。
WPF:
private void targetSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
try
{
var val = Math.Round(targetSlider.Value).ToString();
Console.WriteLine("WPF: " + val);
serialPort1.Write(val);
var ArduVal = serialPort1.ReadByte();
Console.WriteLine("Arduino: " + ArduVal);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Arduino的:
void loop()
{
checkSerial();
if(lightON)LightON();
else if(lightOFF)LightOFF();
else if(lightDIM) LightDIM();
else if(lightBLINK) LightBLINK();
}
void checkSerial()
{
while(Serial.available()>0){
int incoming=Serial.read();
if(isdigit(incoming)){
executeSlider(incoming);
Serial.print(incoming);
}
else{
char c=incoming;
executeCommand(c);
}
}
}
void executeSlider(int val){
analogWrite(BLUE, val);
analogWrite(GREEN, val);
analogWrite(RED, val);
}
如您所见,我检查滑块的值(发送到arduino)和到达arduino的值。
arduino值总是在50左右通勤。我不明白为什么?我应该通过一个阵列吗?或arudino-PC通信出了什么问题?
控制台输出:
WPF: 2
Arduino: 53
WPF: 4
Arduino: 48
WPF: 4
Arduino: 53
WPF: 5
Arduino: 50
WPF: 6
Arduino: 53
WPF: 8
Arduino: 50
WPF: 8
Arduino: 53
WPF: 10
Arduino: 51
WPF: 10
Arduino: 53
WPF: 12
Arduino: 52
WPF: 13
Arduino: 53
WPF: 14
Arduino: 54
WPF: 14
Arduino: 53
WPF: 15
Arduino: 54
WPF: 16
Arduino: 52
WPF: 16
Arduino: 57
WPF: 17
Arduino: 52
WPF: 18
Arduino: 56
WPF: 20
Arduino: 52
WPF: 20
Arduino: 57
WPF: 21
Arduino: 52
WPF: 22
Arduino: 56
WPF: 23
Arduino: 52
WPF: 25
Arduino: 57
WPF: 26
Arduino: 53
WPF: 27
Arduino: 48
WPF: 29
Arduino: 52
WPF: 30
Arduino: 57
WPF: 31
Arduino: 53
WPF: 32
Arduino: 49
WPF: 33
Arduino: 52
WPF: 34
Arduino: 57
WPF: 35
Arduino: 53
WPF: 37
Arduino: 50
修改 我改变了我的arduino的读取功能
void checkSerial()
{
while(Serial.available()>0){
int incoming=Serial.read();
if(isdigit(incoming)){
int sliderVal=Serial.parseInt();
executeSlider(sliderVal);
Serial.print(sliderVal);
}
else{
char c=incoming;
executeCommand(c);
}
}
}
但是传入的值仍在48-58之间
答案 0 :(得分:0)
我认为您所寻找的是Serial.readStringUntil和Serial.parseInt()
请注意,parseInt()会忽略任何不是数字或减号的初始字符 还要注意它是必要的阻塞 - 程序执行将阻塞,直到它已读取整数(以空格或\ n
之类的非数字字符结尾)你可以做这样的事情(只是一个例子):
while(1) {
int number = Serial.parseInt(); // Read until you find a number(sequence of digits)
Serial.print(number); // Repeat it back
}
编辑: 我认为奇怪的是:
WPF: 4
Arduino: 48
WPF: 4
Arduino: 53
您是否看到了与您正在尝试的最新Arduino代码相同的行为? 你可以在你的arduino上试试这个代码并查看它报告的内容吗?
loop() {
while(1) { // Repeat everything back exactly without any conversions or
// processing on the part of arduino, byte after byte in hexa format.
// Alternatives are DEC, HEX and OCT
if(Serial.available()) {
Serial.println(Serial.read(), HEX);
}
}
}
答案 1 :(得分:0)
你没有显示所有的arduino代码,看起来你想要获得3个值?您无法获取该数据导致您无法解析它。看看这个例子,如果你从任何串口发送任何命令,它会在arduino端执行此操作希望有所帮助。
/*
if you wanted to send 4 values.
you could do something like "setv.1.2.3\n"
and the data would be parsed to
cmdv = setv;
val = 1;
val2 = 2;
val3 = 3;
*/
String command;
void loop()
{
if (Serial.available())
{
char c = Serial.read();
if (c == '\n')
{
parseCommand(command);
command = "";
}
else
{
// this is where it gets added
command += c;
}
}
}
// parsed
void parseCommand(String com)
{
String cmdv;
String val;
String val2;
String val3;
// set data like command.val.val2.val3
cmdv = com.substring(0, com.indexOf("."));
val = com.substring(com.indexOf(".") + 2 , com.indexOf(".") + 1);
val2 = com.substring(com.indexOf(".") + 3 , com.indexOf(".") + 2);
val3 = com.substring(com.indexOf(".") + 4);
if (cmdv("setv")) {
// set values from serial "setv.1.2.3\n"
//convert the value to int if needed val.toInt()
// previously define color values as int
analogWrite(BLUE, val.toInt());
analogWrite(GREEN, val2.toInt());
analogWrite(RED, val3.toInt());
}
// send values if Serial recieves "sendv.1.2.3\n"
if (cmdv("sendv")) {
//convert the value to int if needed val.toInt()
Serial.println(val.toInt()); // 1
Serial.println(val2.toInt());// 2
Serial.println(val3.toInt());// 3
}
}
答案 2 :(得分:0)
我制作了一个Java应用程序与Arduino通讯,并希望将PWM值发送到Arduino。我已经使用ArduinoJson来解码0-255之间的值。您必须从应用程序向Arduino发送JSON编码的字符串。
答案 3 :(得分:0)
您在哪里读取打印的Arduino值? WPF或Arduino串行监视器。 如果是WPF,请在串行监视器中阅读以检查其是否相同?
您使用var ArduVal = serialPort1.ReadByte();在C#应用程序中,而在Arduino中,则使用Serial.print(incoming);
由于要读取字节,因此应使用Serial.write()而不是Serial.print()