【问题标题】:Arduino Uno, PLX-DAQ and 125Khz RFID reader problemArduino Uno、PLX-DAQ 和 125Khz RFID 阅读器问题
【发布时间】:2021-06-13 20:23:01
【问题描述】:

项目在很大程度上工作。在 Arduino Uno 上有一个 125Khz RFID 模块,带有 SD 卡模块和 RTC,所有这些都可以很好地工作,并通过 PLX-DAQ 将数据传递到 Excel 并将数据存储到 SD 卡。

当 Uno 通过 PLX-DAQ 连接到 USB/串口时,或者当 Uno 仅使用电池时,我需要一种方法来锻炼。

所以我想用 VBA 中的 PLX-DAQ 表单宏将 Excel 上的特定单元格设置为 1(连接时)或 0(断开连接),然后在 Arduino 代码中读取它以确定是否通过串行将数据传递到 excel或从 SD 卡中提取存储的数据。

单元格 J4 根据是否断开/连接切换 0 或 1。

然后我使用 PLX-DAQ 的 GET 函数从 Arduino 草图中读取一个单元格。

要上传草图,我必须断开 RFID Tx 和 Arduino Rx 之间的连接,否则会出现错误,这是正常的,如果我在断开电线的情况下运行草图,GET 工作正常。

void setup() {

  // open serial connection
    Serial.begin(9600);
    CLOCKSetup();
    RFIDSetup();
    SDSetup();
 
    Serial.println("CELL,GET,J4"); 
    int iniFlag = Serial.readStringUntil(10).toInt(); 
    Serial.println( (String) "Value of cell iniFlag is: " + iniFlag);
}

在 PLX-DAQ 调试窗口中给我这个输出

Value of cell iniFlag is: 1
=> Sending value '1' from cell 'J4'
CELL,GET,J4
SD card is ready to use.
RTC ready

但是,如果我将 RFID Tx 和 Uno Rx 之间的电线重新连接起来,同样的草图会给我这个输出

Value of cell iniFlag is: 0
=> Sending value '1' from cell 'J4'
CELL,GET,J4
SD card is ready to use.
RTC ready

在这个阶段没有数据通过线路传输到 Uno Rx,我没有扫描任何东西,并且 Uno 上的 Rx LED 不亮,那么它如何影响 GET 功能?

GET 命令由 VBA 中 PLX-DAQ 中的此代码处理

 Case "CELL"
            Select Case UCase(DataVal(1))
                Case "GET"
                    '## Get Cell from active sheet or from named sheet
                    Select Case UCase(DataVal(2))
                        '##                         dataval    0    1      2        3    4 5
                        '## NOTE syntax to be Serial.println("CELL,GET,FROMSHEET,MySheet,C,9");
                        Case "FROMSHEET"
                            CommWrite cboPort.Text, Sheets(DataVal(3)).Cells(DataVal(5), DataVal(4)).Value
                            txtStatus2 = "Getting Cell " & DataVal(4) & DataVal(5) & " from sheet " & DataVal(3)
                            Call postToDirectDebug("Sending value '" & Sheets(DataVal(3)).Cells(DataVal(5), DataVal(4)).Value & "' from cell '" & DataVal(4) & DataVal(5) & "' of sheet '" & DataVal(3) & "'", DebugLevel.Outgoing)
                        '## NOTE syntax to be Serial.println("CELL,GET,C9");
                        Case Else
                            CommWrite cboPort.Text, WStoUse.Range(DataVal(2)).Value
                            Call postToDirectDebug("Sending value '" & WStoUse.Range(DataVal(2)).Value & "' from cell '" & DataVal(2) & "'", DebugLevel.Outgoing)
                            txtStatus2 = "Getting Cell " & DataVal(2)
                    End Select
                Case "SET"
                    '## Set Cell on active sheet or on named sheet
                    Select Case UCase(DataVal(2))
                        '##                         dataval    0    1     2       3    4 5     6
                        '## NOTE syntax to be Serial.println("CELL,SET,ONSHEET,MySheet,C,9,Any value");
                        Case "ONSHEET"
                            Sheets(DataVal(3)).Cells(DataVal(5), DataVal(4)).Value = ReplaceData(DataVal(6))
                            txtStatus2 = "Setting Cell " & DataVal(4) & DataVal(5) & " on sheet " & DataVal(3) & " with: " & DataVal(6)
                        '## NOTE syntax to be Serial.println("CELL,SET,C9,Any value");
                        Case Else
                            WStoUse.Range(DataVal(2)).Value = ReplaceData(DataVal(3))
                            txtStatus2 = "Setting Cell " & DataVal(2) & " with: " & ReplaceData(DataVal(3))
                    End Select
            End Select

【问题讨论】:

    标签: excel arduino rfid


    【解决方案1】:

    我假设您将 arduino TX 线连接到 PC-RX。这就是为什么您的 PLX-DAQ 仍然有输入的原因。正如您所怀疑的那样,一切都不会再发生了。

    首先我想,因为什么都不会回来,所以你的代码会卡在上面

    int iniFlag = Serial.readStringUntil(10).toInt(); 
    

    据我所知,RFID.read 没有发送 LineFeed(10)。但是根据 arduino 文档(Serial.setTimeout())应该默认为 1000 毫秒。因此应该超时。您可以通过读取设置并将循环中的 iniFlag 初始化为 0 来验证这一点。

    我认为您的实际问题是 iniFlag 的本地定义: int iniFlag = Serial.readStringUntil(10).toInt();

    我假设在你的循环中你有类似的东西。

    void loop() {
           if rf.available {
             rf.read;
               if (iniFlag) {
                 Serial.println("DATA, .....")
               } else {
                 SD.write....
               }
          }
       }
    

    因此,与其对 iniFlag 进行本地定义,不如通过将其置于设置之外来使其成为全局。

    像这样:

        int iniFlag = 0;
        void setup() {
          ...
          iniFlag = Serial.readStringUntil(10).toInt(); 
          ...  
        }
    

    并确保您的循环中没有“int iniFlag”,这会将其重新声明为本地。

    【讨论】:

      【解决方案2】:

      好吧,经过多次头疼后,我有了一个有效的修复方法,但仍然不知道为什么。

      #include <SoftwareSerial.h>
      SoftwareSerial mySerial(8, 9);
      

      进入 Arduino 草图,然后将 RFID 模块的 TX 线连接到 Arduino 的引脚 8,我不仅可以上传草图而无需每次都拉动 RFID 线,而且 PLX-DAQ 中的 CELL、GET 功能现在可以工作了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-22
        • 2014-04-20
        • 2016-02-28
        • 1970-01-01
        • 1970-01-01
        • 2012-04-19
        • 2020-03-20
        相关资源
        最近更新 更多