我写了一个小的wpf程序来控制一些LED。我构建了4个不同的modi:
LEDON,LEDOFF,调光,闪光
它非常简单,而且运行得很好。我向arduino发送a、b、c或d (4个不同的按钮)并执行相应的循环。
现在我尝试在我的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之间。
发布于 2018-04-25 17:17:23
我想你要找的是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:‘字符串
编辑:我觉得奇怪的是:
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);
}
}
}
发布于 2018-06-05 05:42:35
你没有展示你所有的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
}
}
发布于 2019-04-29 12:34:24
我制作了一个java应用程序来与Arduino通信,并希望将PWM值发送给Arduino。我已经使用ArduinoJson解码了0-255的值。你必须从你的应用程序向Arduino发送JSON编码的字符串。
https://stackoverflow.com/questions/50003135
复制相似问题