Arduino Uno、PLX-DAQ 和 125Khz RFID reader 问题
Arduino Uno, PLX-DAQ and 125Khz RFID reader problem
项目基本正常。在 Arduino Uno 上有一个 125Khz RFID 模块,带有 SD 卡模块和 RTC,所有工作都很好,通过 PLX-DAQ 将数据传递到 Excel 并将数据存储到 SD 卡。
当 Uno 通过 PLX-DAQ 连接到 USB/serial,或者当 Uno 仅使用电池时,我需要一种解决方法。
所以我想在 Excel 上用 VBA 中的 PLX-DAQ 表格宏设置一个特定的单元格到 1(连接时)或 0(断开连接),然后在 Arduino 代码中读取它确定是通过串口将数据传递到 excel 还是从 SD 卡中提取存储的数据。
单元格 J4 根据断开/连接切换 0 或 1。
然后我使用 PLX-DAQ 的 GET 函数从 Arduino sketch 中读取一个单元格。
要上传草图,我必须断开 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 调试中给我这个输出 window
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
我假设您将 arduino TX 线连接到 PC-RX。这就是为什么您的 PLX-DAQ 仍然有输入。正如您所怀疑的那样,一切都将一去不复返了。
一开始我以为,既然什么都不会回来,所以你的代码会卡在
int iniFlag = Serial.readStringUntil(10).toInt();
据我所知,RFID.read 没有发送 LineFeed(10)。但是,根据 arduino 文档 (Serial.setTimeout()) 应默认为 1000ms。因此应该超时。您可以通过读取设置并将循环中的 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”,这会将其重新声明为本地。
好吧,经过大量的摸索之后,我有了一个有效的修复程序,但仍然不知道为什么。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 9);
进入Arduino sketch,然后将RFID模块的TX线接到Arduino的pin 8,不仅可以不用每次拉RFID线就可以上传sketch,而且现在PLX-DAQ中的CELL,GET功能有效。
项目基本正常。在 Arduino Uno 上有一个 125Khz RFID 模块,带有 SD 卡模块和 RTC,所有工作都很好,通过 PLX-DAQ 将数据传递到 Excel 并将数据存储到 SD 卡。
当 Uno 通过 PLX-DAQ 连接到 USB/serial,或者当 Uno 仅使用电池时,我需要一种解决方法。
所以我想在 Excel 上用 VBA 中的 PLX-DAQ 表格宏设置一个特定的单元格到 1(连接时)或 0(断开连接),然后在 Arduino 代码中读取它确定是通过串口将数据传递到 excel 还是从 SD 卡中提取存储的数据。
单元格 J4 根据断开/连接切换 0 或 1。
然后我使用 PLX-DAQ 的 GET 函数从 Arduino sketch 中读取一个单元格。
要上传草图,我必须断开 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 调试中给我这个输出 window
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
我假设您将 arduino TX 线连接到 PC-RX。这就是为什么您的 PLX-DAQ 仍然有输入。正如您所怀疑的那样,一切都将一去不复返了。
一开始我以为,既然什么都不会回来,所以你的代码会卡在
int iniFlag = Serial.readStringUntil(10).toInt();
据我所知,RFID.read 没有发送 LineFeed(10)。但是,根据 arduino 文档 (Serial.setTimeout()) 应默认为 1000ms。因此应该超时。您可以通过读取设置并将循环中的 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”,这会将其重新声明为本地。
好吧,经过大量的摸索之后,我有了一个有效的修复程序,但仍然不知道为什么。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(8, 9);
进入Arduino sketch,然后将RFID模块的TX线接到Arduino的pin 8,不仅可以不用每次拉RFID线就可以上传sketch,而且现在PLX-DAQ中的CELL,GET功能有效。