通过串行更改值的计算机到 Arduino mega

Posted

技术标签:

【中文标题】通过串行更改值的计算机到 Arduino mega【英文标题】:Computer to Arduino mega via serial changing values 【发布时间】:2013-08-06 18:20:54 【问题描述】:

首先,这可能不是 arduino 代码或 arduino 的问题,但我想我会在这里发帖,因为我真的不知道出了什么问题。

我在做这个项目只是为了好玩,从键盘、通过计算机、通过 USB 将击键发送到我的 arduino mega。这里没有其他硬件,只有计算机、arduino 和 USB 电缆。

我正在使用 Microsoft Visual Studio Express 2012 编写代码来接收击键并将它们发送到 USB。这是我正在使用的代码:

#include "stdafx.h"
#include "conio.h"

using namespace System;
using namespace System::IO::Ports;

int main(array<System::String ^> ^args)

    String^ portName;
    String^ key;
    int baudRate=9600;
    Console::WriteLine("type in a port name and hit ENTER");
    portName=Console::ReadLine();
    //arduino settings
    SerialPort^ arduino;
    arduino = gcnew SerialPort(portName, baudRate);
    //open port
    try
    
        arduino->Open();

    while(1)
    
        int k = getch();
        key = k.ToString();
        Console::WriteLine(key);
        arduino->Write(key);
        if (k == 32)
            return 0;
    


catch (IO::IOException^ e )

        Console::WriteLine(e->GetType()->Name+": Port is not ready");
    

此代码运行良好,并向 arduino 发送命令。我也不妨问这个问题,但是在 35 次击键后它只是停止发送击键,我不确定为什么,但这不是 arduino 问题(我不认为)。

所以当 key 的特定值被发送到 arduino 时,它会改变。例如,分配给用于按下数字 1 和 2 的变量键的值分别是 49 和 50。但是,当它们被发送到 arduino 时,值会有所不同。 1 现在是 57,2 现在是 48。我不确定为什么会这样。我尝试了 4 和 5,它们的值都像键 2 一样向下移动 2。这是我在 arduino 上的代码:

int ledPin = 13;
int key=0;
int c;
void setup() 

    pinMode(ledPin, OUTPUT); // pin will be used to for output
    Serial.begin(9600); // same as in your c++ script


void loop() 

  if (Serial.available() > 0)
  
    key = Serial.read(); // used to read incoming data
    if (key == 57)
    
      digitalWrite(ledPin, HIGH);
    
    else if (key == 48)
    
      digitalWrite(ledPin, LOW);
    
  
  c = key;
  Serial.println(c);

到目前为止,它只是打开和关闭灯。我希望涉及更多的键,并且使值保持一致将非常方便。无论如何,如果有人可以帮助我解释为什么价值观不同,那就太棒了。我对编程并不完全陌生,但我当然不是专家,也没有深入了解高级的东西。

感谢您的任何帮助或建议。

【问题讨论】:

【参考方案1】:

这与您通过视觉工作室发送的内容有关。您正在将按键转换为其 ASCII 值,然后将该 ASCII 值转换为字符串,然后通过串行发送该字符串。 arduino 需要一个数字,而不是字符串。

例如,如果您按下 1 键,您的 Visual Studio 代码会将其转换为 ASCII 数字 49,然后将其转换为 Arduino 接收的字符串“49” - 但由于您发送的是“49”,它是“4”和“9”,Arduino 读取 9,对应于 57,如您所见。

同样,按 2 将其转换为“50”,Arduino 读取“0”,对应于您获得的值 48。

要解决这个问题,请直接发送号码,不要将其转换为字符串。

【讨论】:

好的,这是有道理的,但是,当我将其保留为整数时,尽管我无法将其发送到 arduino。关于不能将 int 转换为字符串的东西。如何使用 IO::Ports:WriteLine 发送 int 值?我一直在搜索,但找不到任何示例。 您可以这样发送字符串:当您按下 1 时,getch() 返回一个数字,但将该数字转换为字符串“1”并将“1”发送到 Arduino。应该有一些函数将 ASCII 值映射回实际按下的键。或者只做 if k==49 myString = "1"

以上是关于通过串行更改值的计算机到 Arduino mega的主要内容,如果未能解决你的问题,请参考以下文章

PySerial + Arduino MEGA 1 秒延迟/响应时间

Arduino MEGA 2560找不到驱动怎么办

通过 QSerialPort 访问来自 Arduino 的串行数据时遇到问题

无法将字符串从 python 发送到 arduino

开始使用 Arduino mega 的问题

使用USBasp 通过ICSP模式给arduino UNO烧写程序