3

我有点困惑。我已经编写了 VB 代码来打开和关闭连接到 Arduino 的 LED。我正在通过 COM 端口(而不是串行监视器)从 VB 应用程序发送数据,数据为“1”表示 LED 开启,“0”表示关闭。这里我想通过 RF-433 模块发送这个信号。我已将 Arduino 的 TX 引脚连接到 RF 模块的数据引脚。另一方面,第二个 Arduino 连接到 RF 接收器,引脚 12 上带有 LED。现在我不知道如何为 TX 端的 Arduino 编写代码以通过 RF 发送数据?我的意思是,如果我使用串行监视器发送数据,那么Serial.available()可以Serial.read()使用键盘通过串行监视器发送数据,但这里我是从 VB 应用程序发送数据。那么Arduino激活连接在Arduino TX引脚上的RF TX的代码是什么?

这是我的VB代码:

Imports System.IO
Imports System.IO.Ports
Imports System.Threading

Public Class Form1

    Shared _continue As Boolean
    Shared _serialPort As SerialPort

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SerialPort1.Close()
        SerialPort1.PortName = "com12" 'change com port to match your Arduino port
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = Parity.None
        SerialPort1.StopBits = StopBits.One
        SerialPort1.Handshake = Handshake.None
        SerialPort1.Encoding = System.Text.Encoding.Default 'very important!
    End Sub

    Private Sub btnOn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOn.Click
        picOn.Visible = True
        SerialPort1.Open()
        SerialPort1.Write("1")
        SerialPort1.Close()
    End Sub

    Private Sub btnOff_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOff.Click
        picOn.Visible = False
        SerialPort1.Open()
        SerialPort1.Write("0")
        SerialPort1.Close()
    End Sub
End Class
4

3 回答 3

2

呵呵....终于做到了...以下代码运行成功。我使用了 SoftwareSerial 库。Tx 代码很简单,无需任何库即可实现。我刚刚从 arduino 的 RX 引脚上的 VB 应用程序获取数据,并将其发送到 RF 模块所连接的 arduino 的 TX。接收器需要软件串行库。

发送代码:

  1. 没有图书馆。

    (没有图书馆)

        int inByte;
        void setup()
        {
          Serial.begin(2400);
        }
        void loop()
        {
          if(Serial.available()>0)
          {
            inByte=Serial.read();
            switch(inByte)
            {
              case '0':
                  Serial.write(inByte);
                  break;
              case '1':
                  Serial.write(inByte);
                  break;               
               default:
                  break;
            delay(100);
            } 
          } 
        }
    
  2. 与图书馆。

    #include <SoftwareSerial.h>
    #define rxPin 10
    #define txPin 11
    SoftwareSerial mySerial(10,11); //RX & TX
    int ch;
    
    void setup()
    {
      pinMode(rxPin,INPUT);
      pinMode(txPin,OUTPUT);
      Serial.begin(9600);
      //Serial.println("Hi");
    
      mySerial.begin(2400);
      //mySerial.println("Hello");
    } 
    void loop()
    {
      if(Serial.available()>0)
      {
        ch=Serial.read();
        mySerial.write(ch);
      }
    }
    

接收代码:

 #include <SoftwareSerial.h>
    #define rxPin 10
    #define txPin 11
    SoftwareSerial mySerial(10,11); //RX & TX
    int ch=0;

    void setup()
    {
      pinMode(rxPin,INPUT);
      pinMode(13,OUTPUT);
      //pinMode(txPin,OUTPUT);
      Serial.begin(9600);
      //Serial.println("Hi");

      mySerial.begin(2400);
      //mySerial.println("Hello");
    } 
    void loop()
    {
      if(mySerial.available()>0)
      {
        ch=mySerial.read();
        //Serial.write(ch);
        switch(ch)
        {
          case '0':
              digitalWrite(13,LOW);
              break;
          case '1':
              digitalWrite(13,HIGH);
              break;

          default:
              break;
        }
      }
    }

顺便说一句,非常感谢@Yve 的指导和您给我完成此代码的时间... :) 实施。

于 2013-07-08T09:39:05.253 回答
1

先声明_serialPort As SerialPort然后继续使用SerialPort1
需要测试串口是否打开,如下图。打开(或关闭)已经打开的端口会引发错误。
您的读写没有开始或停止位。

Public Class Form1

' unsure what this is being used for 
    Shared _continue As Boolean
' you had not declared SerialPort1
    Shared SerialPort1 As SerialPort

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'I don't understand why you are closing the port???
            SerialPort1.Close()
'A statement like this would be better to check if it is open
If SerialPort1.IsOpen = True Then
SerialPort1.close()
        SerialPort1.PortName = "com12" 'change com port to match your Arduino port
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = Parity.None
        SerialPort1.StopBits = StopBits.One
        SerialPort1.Handshake = Handshake.None
        SerialPort1.Encoding = System.Text.Encoding.Default 'very important!
    End Sub

    Private Sub btnOn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOn.Click
        picOn.Visible = True
If SerialPort1.IsOpen = False Then
        SerialPort1.Open()
        SerialPort1.Write("1")
End if
        SerialPort1.Close()
    End Sub

    Private Sub btnOff_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOff.Click
        picOn.Visible = False
If SerialPort1.IsOpen = True Then
        SerialPort1.Write("0")
        SerialPort1.Close()
End if
    End Sub
End Class

编辑

请从以下链接查看此内容,并将您的 if 语句合并到您的按钮打开和关闭事件中。

int SerialValue = 0;

void setup(){

  pinMode(13, OUTPUT);
  Serial.begin(9600);

}

void loop(){
  SerialValue = Serial.read();
  if(SerialValue == 50){
    digitalWrite(13, HIGH);
  }
  if(SerialValue == 10){
    digitalWrite(13, LOW);
  }
}

http://forum.arduino.cc/index.php/topic,8566.0.html

我也建议看看这个网站:

http://competefornothing.com/?p=738

我知道你在这个网站上,我建议你彻底利用它:

http://arduino.cc/

于 2013-07-04T11:26:10.583 回答
0
Imports System.IO
Imports System.IO.Ports
Imports System.Threading

Public Class Form1

    Shared _continue As Boolean
    Shared _serialPort As SerialPort

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SerialPort1.Close()
        SerialPort1.PortName = "com12" 'change com port to match your Arduino port
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = Parity.None
        SerialPort1.StopBits = StopBits.One
        SerialPort1.Handshake = Handshake.None
        SerialPort1.Encoding = System.Text.Encoding.Default 'very important!
    End Sub

    Private Sub btnOn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOn.Click
        picOn.Visible = True
        SerialPort1.Open()
        SerialPort1.Write("1")
        SerialPort1.Close()
    End Sub

    Private Sub btnOff_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOff.Click
        picOn.Visible = False
        SerialPort1.Open()
        SerialPort1.Write("0")
        SerialPort1.Close()
    End Sub
End Class

但我建议您是否可以在 button_click 上一次发送一个字节,并检查您的波特率,对于 433mhz 模块,最好使用尽可能低的波特率。如果您的数据不是那么大,请使用 1200bps,并将两个微控制器设置为相同的波特率

于 2014-03-18T09:14:17.217 回答