Member 14884114 Ответов: 3

Отправка данных с помощью текстового поля


Привет, я делаю проект об управлении двигателем постоянного тока с помощью c# и arduino.
Я хочу отправить setspeed в arduino с помощью textbox,но текстовое поле работает не так, как я хочу.

Что я уже пробовал:

Вот код

private void textBox1_TextChanged(object sender, EventArgs e)
        {
            
            if (serialPort1.IsOpen)
                
                serialPort1.WriteLine("vs_set_speed"+textBox1.Text);
        }



А это код arduino:

if (mySt.substring(0,12) == "vs_set_speed"){
    set_speed = mySt.substring(12,mySt.length()).toFloat();


Это работает нормально,но вот проблема: когда я набираю setspeed в текстовом поле, например 200, диаграмма setspeed переходит в 2, а затем в 20, а затем в 200.

Есть ли какой-нибудь способ, чтобы текстовое поле получило номер после того, как я нажму enter или нажму кнопку ?
Пожалуйста, помогите мне, спасибо !

Richard MacCutchan

Похоже, что функция arduino вызывается для каждого полученного символа на последовательном порту. вам нужно заставить arduino накапливать текст и не пытаться установить скорость до тех пор, пока все числа не будут получены.

Member 14884114

на самом деле код arduino имеет эту функцию, чтобы делать именно то, что вы говорите :

void serialEvent() {
в то время как (серийный номер.доступен()) {
// получить новый байт:
char inChar = (char)Serial.read();
// добавьте его в строку ввода:
если (inChar != '\n') {
mySt += inChar;
}
// если входящий символ является новой строкой, установите флаг
// таким образом, основной цикл может что-то с этим сделать:
if (inChar == '\n') {
stringComplete = истина;
}
}

Richard MacCutchan

Извините, моя ошибка, это неправильный код C#. Вы отправляете текст каждый раз, когда символ добавляется в текстовое поле. Вам нужно отправить его только тогда, когда больше нет данных для добавления. Вероятно, лучше всего использовать кнопку для запуска отправки.

3 Ответов

Рейтинг:
28

RickZeeland

Используйте нажатие() вместо этого смотрите ответ здесь: keydown - Detect Enter Key C# - переполнение стека[^]


Рейтинг:
2

Luc Pattyn

Используйте что-то явное, в лучшем случае кнопку Click событие.

Вы не должны использовать событие XxxChanged для управления периферийными устройствами, всегда будут какие-то неожиданные события:
- при вводе N символов может быть где-то от 1 до N измененных событий.;
- а позже, когда вы попытаетесь заменить его новым значением, появится еще одно: очистка текстового поля также вызовет событие TextChanged!

И не забудьте проверить входные данные перед отправкой их на периферийное устройство.


Рейтинг:
1

Member 14884114

Поэтому я изменил событие textbox на keydown (), как это, и это работает.

private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                setspeed = textBox1.Text;
                if (serialPort1.IsOpen)
                {

                    serialPort1.WriteLine("vs_set_speed" + setspeed);

                }
            }
        }


Спасибо за помощь .